/* -*- tab-width: 4 -*-
*
* Electric(tm) VLSI Design System
*
* File: Crash.java
*
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* Electric(tm) is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Electric(tm); see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, Mass 02111-1307, USA.
*/
package com.sun.electric.tool;
import com.sun.electric.database.text.Version;
import com.sun.electric.database.EditingPreferences;
import com.sun.electric.database.Environment;
import com.sun.electric.database.constraint.Constraints;
import com.sun.electric.database.hierarchy.Cell;
import com.sun.electric.database.hierarchy.EDatabase;
import com.sun.electric.database.hierarchy.Library;
import com.sun.electric.database.id.IdManager;
import com.sun.electric.database.text.Pref;
import com.sun.electric.database.text.Setting;
import com.sun.electric.technology.TechFactory;
import com.sun.electric.technology.Technology;
import com.sun.electric.technology.technologies.Generic;
import com.sun.electric.tool.generator.layout.LayoutLib;
import com.sun.electric.tool.user.ActivityLogger;
import com.sun.electric.tool.user.ErrorLogger;
import com.sun.electric.tool.user.MessagesStream;
import java.util.Collections;
import java.util.Iterator;
import java.util.Map;
/**
*
*/
public class Crash {
private static class CrashJob extends Job {
protected CrashJob() {
super("CrashTest", null, Job.Type.CHANGE, null, null, Job.Priority.USER);
}
public boolean doIt() throws JobException {
String regressionname = "qFourP2-electric-final-jelib";
String libname = "qFourP2.jelib";
String cellname = "qFourP1top";
String rootPath = "../../";
boolean caching = true;
String logname = "output/" + libname + "_" + cellname + "_LE_" + (caching ? "C" : "NC") + "-" + Version.getVersion() + ".log";
MessagesStream.getMessagesStream().save(logname);
Library rootLib = LayoutLib.openLibForRead(rootPath + "data/" + regressionname + "/" + libname);
ErrorLogger repairLogger = ErrorLogger.newInstance("Repair Libraries");
for (Iterator it = Library.getLibraries(); it.hasNext();) {
Library lib = (Library) it.next();
lib.checkAndRepair(true, repairLogger);
}
System.out.println("Repair Libraries: " + repairLogger.getNumErrors() + " errors," + repairLogger.getNumWarnings() + " warnings");
Cell lay = rootLib.findNodeProto(cellname + "{sch}");
System.out.println("Cell = " + lay);
System.exit(0);
return true;
}
}
private static EditingPreferences initDatabase() {
Job.setDebug(true);
ActivityLogger.initialize("electricserver", true, true, true/*false*/, true, false);
// Job.threadSafe = true;
Pref.forbidPreferences();
EDatabase database = new EDatabase(IdManager.stdIdManager.getInitialEnvironment());
EDatabase.setServerDatabase(database);
Tool.initAllTools();
EditingPreferences ep = new EditingPreferences(true, database.getTechPool());
// Init Job
Job.setUserInterface(new UserInterfaceInitial(database));
database.lock(true);
database.lowLevelBeginChanging(null);
database.setToolSettings((Setting.RootGroup) ToolSettings.getToolSettings(""));
assert database.getGeneric() == null;
Generic generic = Generic.newInstance(database.getIdManager());
database.addTech(generic);
for (TechFactory techFactory : TechFactory.getKnownTechs().values()) {
Map<TechFactory.Param, Object> paramValues = Collections.emptyMap();
Technology tech = techFactory.newInstance(generic, paramValues);
if (tech != null) {
database.addTech(tech);
}
}
database.lowLevelEndChanging();
database.unlock();
return ep;
}
// 5 failures
private static void crash1() {
EditingPreferences ep = initDatabase();
Job.serverJobManager = new ServerJobManager();
int connectionId = 0;
Job job = new CrashJob();
job.ejob.jobKey = new Job.Key(connectionId, 2, true);
job.ejob.client = Job.serverJobManager.serverConnections.get(0);
job.ejob.editingPreferences = ep;
Job.serverJobManager.addJob(job.ejob, false);
}
// 1 failure
private static void crash2() {
EditingPreferences ep = initDatabase();
Job.serverJobManager = new ServerJobManager();
int connectionId = 0;
Job job = new CrashJob();
EJob ejob = job.ejob;
ejob.jobKey = new Job.Key(connectionId, 2, true);
ejob.client = Job.serverJobManager.serverConnections.get(0);
ejob.editingPreferences = ep;
// Job.serverJobManager.addJob(job.ejob, false);
EDatabase database = EDatabase.serverDatabase();
Environment.setThreadEnvironment(database.getEnvironment());
EditingPreferences.setThreadEditingPreferences(ejob.editingPreferences);
ServerJobManager.UserInterfaceRedirect userInterface = new ServerJobManager.UserInterfaceRedirect(ejob.jobKey);
Job.setUserInterface(userInterface);
database.lock(!ejob.isExamine());
ejob.oldSnapshot = database.backup();
database.lowLevelBeginChanging(ejob.serverJob.tool);
Constraints.getCurrent().startBatch(ejob.oldSnapshot);
userInterface.setCurrents(ejob.serverJob);
try {
if (!ejob.serverJob.doIt()) {
throw new JobException("Job '" + ejob.jobName + "' failed");
}
} catch (JobException e) {
e.printStackTrace();
}
}
// 1 failure
private static void crash3() {
EditingPreferences ep = initDatabase();
Job.serverJobManager = new ServerJobManager();
int connectionId = 0;
Job job = new CrashJob();
EJob ejob = job.ejob;
ejob.jobKey = new Job.Key(connectionId, 2, true);
ejob.client = Job.serverJobManager.serverConnections.get(0);
ejob.editingPreferences = ep;
// Job.serverJobManager.addJob(job.ejob, false);
EDatabase database = EDatabase.serverDatabase();
Environment.setThreadEnvironment(database.getEnvironment());
EditingPreferences.setThreadEditingPreferences(ejob.editingPreferences);
ServerJobManager.UserInterfaceRedirect userInterface = new ServerJobManager.UserInterfaceRedirect(ejob.jobKey);
Job.setUserInterface(userInterface);
database.lock(!ejob.isExamine());
ejob.oldSnapshot = database.backup();
database.lowLevelBeginChanging(ejob.serverJob.tool);
// Constraints.getCurrent().startBatch(ejob.oldSnapshot);
// userInterface.setCurrents(ejob.serverJob);
try {
if (!ejob.serverJob.doIt()) {
throw new JobException("Job '" + ejob.jobName + "' failed");
}
} catch (JobException e) {
e.printStackTrace();
}
}
// 0 failures
// 0 failures
private static void crash4() {
EditingPreferences ep = initDatabase();
Job.serverJobManager = new ServerJobManager();
int connectionId = 0;
Job job = new CrashJob();
EJob ejob = job.ejob;
ejob.jobKey = new Job.Key(connectionId, 2, true);
ejob.client = Job.serverJobManager.serverConnections.get(0);
ejob.editingPreferences = ep;
// Job.serverJobManager.addJob(job.ejob, false);
EDatabase database = EDatabase.serverDatabase();
Environment.setThreadEnvironment(database.getEnvironment());
EditingPreferences.setThreadEditingPreferences(ejob.editingPreferences);
ServerJobManager.UserInterfaceRedirect userInterface = new ServerJobManager.UserInterfaceRedirect(ejob.jobKey);
Job.setUserInterface(userInterface);
database.lock(!ejob.isExamine());
ejob.oldSnapshot = database.backup();
database.lowLevelBeginChanging(ejob.serverJob.tool);
// database.getNetworkManager().startBatch();
// Constraints.getCurrent().startBatch(ejob.oldSnapshot);
// userInterface.setCurrents(ejob.serverJob);
try {
if (!ejob.serverJob.doIt()) {
throw new JobException("Job '" + ejob.jobName + "' failed");
}
} catch (JobException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
crash4();
}
}