diff --git a/.gitignore b/.gitignore
index f904c43..fb9ab82 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,4 @@ target
.idea
.DS_Store
*.out
+*~*
diff --git a/README.md b/README.md
index b0a0449..97e7422 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
JavaSIM is an object-oriented simulation package based upon C++SIM and has been in use since 1997. It provides discrete event process-based simulation similar to SIMULA's simulation class and libraries. A complete list of the capabilities provided follows:
-- The core of the system gives SIMULA-like simulation routines, random number generators, queueing algorithms and in the C++ original there are thread package interfaces, though for Java that's not necessary.
+- The core of the system gives SIMULA-like simulation routines, random number generators, queueing algorithms and in C++SIM there are thread package interfaces, though for Java that's not necessary.
- Entity and set manipulation facilities similar to SIMSET.
- Classes allow "non-causal" events, such as interrupts, to be handled.
- Various routines for gathering statistics, such as histogram and variance classes.
@@ -9,22 +9,22 @@ The system also comes with complete examples and tests which illustrate many of
Over the years C++SIM and JavaSim have been used by many commercial and academic organisations.
-Prior to 2007 both C++SIM and JavaSim were freely available in source and binary from Newcastle University, under the University's own licence. However, in late 2007 Newcastle University decided that everything could be released into open source under LGPL.
+Prior to 2007 both C++SIM and JavaSim were freely available in source and binary from Newcastle University, under the University's own licence. However, in late 2007 Newcastle University decided that everything could be released into open source under LGPL. In 2015 the code was moved from Codehaus to github. All JIRAs from there were also recreated as github issues.
You can find details of the releases in the https://github.com/nmcl/JavaSim/releases section as well as binary downloads for some releases.
-In 2015 the code was moved from Codehaus to github. All JIRAs from there were also recreated as github issues.
-
----
To build:
mvn compile
+Run tests:
+
+mvn test
+
Run tests and create installation:
mvn install
-To cleanup:
-
-mvn clean
+To run the examples check the README in that directory.
diff --git a/docs/manual.adoc b/docs/manual.adoc
index fbbea07..efbf2ea 100644
--- a/docs/manual.adoc
+++ b/docs/manual.adoc
@@ -12,7 +12,7 @@ These requirements were realised in the following design decisions:
- the discrete-event process based simulation facilities provided by SIMULA and its simulation classes and libraries have a considerable experience and user community which have found them to be successful for a wide variety of simulations. In later versions of the system additional simulation classes were added which provide extra functionality.
-- inheritance was to be used throughout the design to even a greater extent than is already provided in SIMULA. This enables JavaSim to be more flexible and extensible, allowing new functionality to be added without affecting the overall system structure. For example, our I/O facilities, random number generators and probability distribution functions are entirely object-oriented, relying on inheritance to specialise their behaviour.
+- inheritance was to be used throughout the design to an even greater extent than is already provided in SIMULA. This enables JavaSim to be more flexible and extensible, allowing new functionality to be added without affecting the overall system structure. For example, our I/O facilities, random number generators and probability distribution functions are entirely object-oriented, relying on inheritance to specialise their behaviour.
NOTE: It is not necessary for the reader to know anything about the SIMULA programming language or its simulation classes, but such knowledge would aid in the understanding of the concepts and classes presented within.
@@ -36,7 +36,7 @@ Thus, the first step towards building a simulation model of a system is to deter
=== Terminology
-The system components chosen for the simulation are termed simulation entities. Associated with each _entity_ in the simulation are zero or more _attributes_ that describe the state of the entity and which may vary during the course of the simulation. The interaction of entities and the changes they cause in the system state are termed _events_.
+The system components chosen for the simulation are termed _simulation entities_. Associated with each _entity_ in the simulation are zero or more _attributes_ that describe the state of the entity and which may vary during the course of the simulation. The interaction of entities and the changes they cause in the system state are termed _events_.
The collection of these component attributes at any given time _t_ defines the system state at _t_. In general, the system state can take any of a variety of values, and a given simulation run results in one realisation of a set of these values (the _operation path_) over the _observation period_.
diff --git a/examples/README.md b/examples/README.md
new file mode 100644
index 0000000..c09058a
--- /dev/null
+++ b/examples/README.md
@@ -0,0 +1,7 @@
+To build the examples first ensure that the main source tree has been built using 'mvn install'. Then here:
+
+mvn compile
+
+If you want to run the examples as unit tests then:
+
+mvn test
diff --git a/examples/pom.xml b/examples/pom.xml
new file mode 100644
index 0000000..0165804
--- /dev/null
+++ b/examples/pom.xml
@@ -0,0 +1,57 @@
+
+
+ 4.0.0
+ javasim-examples
+ javasim-examples
+ javasim-examples
+ 2.3
+ http://maven.apache.org
+
+ UTF-8
+
+
+
+
+ maven-compiler-plugin
+ org.apache.maven.plugins
+ 3.6.0
+
+ 1.8
+ 1.8
+ UTF-8
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 2.17
+
+ 1
+ false
+
+ -Djdk.net.URLClassPath.disableClassPathURLCheck=true
+
+
+
+
+
+
+ junit
+ junit
+ 4.0
+ jar
+ test
+ true
+
+
+ javasim
+ javasim
+ 2.3
+ system
+ ${basedir}/../target/javasim-${version}.jar
+
+
+
+
diff --git a/src/test/java/org/javasim/examples/basic/Arrivals.java b/examples/src/main/java/org/javasim/examples/basic/Arrivals.java
similarity index 100%
rename from src/test/java/org/javasim/examples/basic/Arrivals.java
rename to examples/src/main/java/org/javasim/examples/basic/Arrivals.java
diff --git a/src/test/java/org/javasim/examples/basic/Breaks.java b/examples/src/main/java/org/javasim/examples/basic/Breaks.java
similarity index 100%
rename from src/test/java/org/javasim/examples/basic/Breaks.java
rename to examples/src/main/java/org/javasim/examples/basic/Breaks.java
diff --git a/src/test/java/org/javasim/examples/basic/Job.java b/examples/src/main/java/org/javasim/examples/basic/Job.java
similarity index 100%
rename from src/test/java/org/javasim/examples/basic/Job.java
rename to examples/src/main/java/org/javasim/examples/basic/Job.java
diff --git a/src/test/java/org/javasim/examples/basic/Machine.java b/examples/src/main/java/org/javasim/examples/basic/Machine.java
similarity index 100%
rename from src/test/java/org/javasim/examples/basic/Machine.java
rename to examples/src/main/java/org/javasim/examples/basic/Machine.java
diff --git a/src/test/java/org/javasim/examples/basic/MachineShop.java b/examples/src/main/java/org/javasim/examples/basic/MachineShop.java
similarity index 100%
rename from src/test/java/org/javasim/examples/basic/MachineShop.java
rename to examples/src/main/java/org/javasim/examples/basic/MachineShop.java
diff --git a/src/test/java/org/javasim/examples/basic/Main.java b/examples/src/main/java/org/javasim/examples/basic/Main.java
similarity index 100%
rename from src/test/java/org/javasim/examples/basic/Main.java
rename to examples/src/main/java/org/javasim/examples/basic/Main.java
diff --git a/src/test/java/org/javasim/examples/basic/Queue.java b/examples/src/main/java/org/javasim/examples/basic/Queue.java
similarity index 100%
rename from src/test/java/org/javasim/examples/basic/Queue.java
rename to examples/src/main/java/org/javasim/examples/basic/Queue.java
diff --git a/src/test/java/org/javasim/examples/basic/README.md b/examples/src/main/java/org/javasim/examples/basic/README.md
similarity index 100%
rename from src/test/java/org/javasim/examples/basic/README.md
rename to examples/src/main/java/org/javasim/examples/basic/README.md
diff --git a/src/test/java/org/javasim/examples/basic/expected_output b/examples/src/main/java/org/javasim/examples/basic/expected_output
similarity index 100%
rename from src/test/java/org/javasim/examples/basic/expected_output
rename to examples/src/main/java/org/javasim/examples/basic/expected_output
diff --git a/src/test/java/org/javasim/examples/interrupt/Arrivals.java b/examples/src/main/java/org/javasim/examples/interrupt/Arrivals.java
similarity index 100%
rename from src/test/java/org/javasim/examples/interrupt/Arrivals.java
rename to examples/src/main/java/org/javasim/examples/interrupt/Arrivals.java
diff --git a/src/test/java/org/javasim/examples/interrupt/Job.java b/examples/src/main/java/org/javasim/examples/interrupt/Job.java
similarity index 100%
rename from src/test/java/org/javasim/examples/interrupt/Job.java
rename to examples/src/main/java/org/javasim/examples/interrupt/Job.java
diff --git a/src/test/java/org/javasim/examples/interrupt/MachineShop.java b/examples/src/main/java/org/javasim/examples/interrupt/MachineShop.java
similarity index 100%
rename from src/test/java/org/javasim/examples/interrupt/MachineShop.java
rename to examples/src/main/java/org/javasim/examples/interrupt/MachineShop.java
diff --git a/src/test/java/org/javasim/examples/interrupt/Main.java b/examples/src/main/java/org/javasim/examples/interrupt/Main.java
similarity index 100%
rename from src/test/java/org/javasim/examples/interrupt/Main.java
rename to examples/src/main/java/org/javasim/examples/interrupt/Main.java
diff --git a/src/test/java/org/javasim/examples/interrupt/Processor.java b/examples/src/main/java/org/javasim/examples/interrupt/Processor.java
similarity index 100%
rename from src/test/java/org/javasim/examples/interrupt/Processor.java
rename to examples/src/main/java/org/javasim/examples/interrupt/Processor.java
diff --git a/src/test/java/org/javasim/examples/interrupt/Queue.java b/examples/src/main/java/org/javasim/examples/interrupt/Queue.java
similarity index 100%
rename from src/test/java/org/javasim/examples/interrupt/Queue.java
rename to examples/src/main/java/org/javasim/examples/interrupt/Queue.java
diff --git a/src/test/java/org/javasim/examples/interrupt/README.md b/examples/src/main/java/org/javasim/examples/interrupt/README.md
similarity index 100%
rename from src/test/java/org/javasim/examples/interrupt/README.md
rename to examples/src/main/java/org/javasim/examples/interrupt/README.md
diff --git a/src/test/java/org/javasim/examples/interrupt/Signaller.java b/examples/src/main/java/org/javasim/examples/interrupt/Signaller.java
similarity index 100%
rename from src/test/java/org/javasim/examples/interrupt/Signaller.java
rename to examples/src/main/java/org/javasim/examples/interrupt/Signaller.java
diff --git a/src/test/java/org/javasim/examples/stats/README.md b/examples/src/main/java/org/javasim/examples/stats/README.md
similarity index 100%
rename from src/test/java/org/javasim/examples/stats/README.md
rename to examples/src/main/java/org/javasim/examples/stats/README.md
diff --git a/src/test/java/org/javasim/examples/stats/Stats.java b/examples/src/main/java/org/javasim/examples/stats/Stats.java
similarity index 100%
rename from src/test/java/org/javasim/examples/stats/Stats.java
rename to examples/src/main/java/org/javasim/examples/stats/Stats.java
diff --git a/src/test/java/org/javasim/examples/streams/README.md b/examples/src/main/java/org/javasim/examples/streams/README.md
similarity index 100%
rename from src/test/java/org/javasim/examples/streams/README.md
rename to examples/src/main/java/org/javasim/examples/streams/README.md
diff --git a/src/test/java/org/javasim/examples/streams/Streams.java b/examples/src/main/java/org/javasim/examples/streams/Streams.java
similarity index 100%
rename from src/test/java/org/javasim/examples/streams/Streams.java
rename to examples/src/main/java/org/javasim/examples/streams/Streams.java
diff --git a/src/test/java/org/javasim/tests/examples/basic/BasicExampleUnitTest.java b/examples/src/test/java/org/javasim/tests/examples/basic/BasicExampleUnitTest.java
similarity index 98%
rename from src/test/java/org/javasim/tests/examples/basic/BasicExampleUnitTest.java
rename to examples/src/test/java/org/javasim/tests/examples/basic/BasicExampleUnitTest.java
index 07d0c71..ff61b87 100644
--- a/src/test/java/org/javasim/tests/examples/basic/BasicExampleUnitTest.java
+++ b/examples/src/test/java/org/javasim/tests/examples/basic/BasicExampleUnitTest.java
@@ -33,11 +33,10 @@ public class BasicExampleUnitTest
public void testNoBreaks ()
{
boolean isBreaks = false;
-
MachineShop m = new MachineShop(isBreaks);
m.await();
-
+
try
{
Simulation.reset();
@@ -51,7 +50,6 @@ public void testNoBreaks ()
public void testBreaks ()
{
boolean isBreaks = true;
-
MachineShop m = new MachineShop(isBreaks);
m.await();
diff --git a/src/test/java/org/javasim/tests/examples/interrupt/InterruptExampleUnitTest.java b/examples/src/test/java/org/javasim/tests/examples/interrupt/InterruptExampleUnitTest.java
similarity index 100%
rename from src/test/java/org/javasim/tests/examples/interrupt/InterruptExampleUnitTest.java
rename to examples/src/test/java/org/javasim/tests/examples/interrupt/InterruptExampleUnitTest.java
diff --git a/src/test/java/org/javasim/tests/examples/stats/StatsExampleUnitTest.java b/examples/src/test/java/org/javasim/tests/examples/stats/StatsExampleUnitTest.java
similarity index 100%
rename from src/test/java/org/javasim/tests/examples/stats/StatsExampleUnitTest.java
rename to examples/src/test/java/org/javasim/tests/examples/stats/StatsExampleUnitTest.java
diff --git a/src/test/java/org/javasim/tests/examples/streams/StreamsExampleUnitTest.java b/examples/src/test/java/org/javasim/tests/examples/streams/StreamsExampleUnitTest.java
similarity index 100%
rename from src/test/java/org/javasim/tests/examples/streams/StreamsExampleUnitTest.java
rename to examples/src/test/java/org/javasim/tests/examples/streams/StreamsExampleUnitTest.java
diff --git a/src/test/java/org/javasim/tests/examples/streams/TriangularExampleStreamTest.java b/examples/src/test/java/org/javasim/tests/examples/streams/TriangularExampleStreamTest.java
similarity index 100%
rename from src/test/java/org/javasim/tests/examples/streams/TriangularExampleStreamTest.java
rename to examples/src/test/java/org/javasim/tests/examples/streams/TriangularExampleStreamTest.java
diff --git a/pom.xml b/pom.xml
index e39a82b..2147312 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,13 +1,17 @@
4.0.0
+
javasimjavasim
+ 2.3javasim
- 2.1
+
http://maven.apache.org
+
UTF-8
+ false
@@ -26,7 +30,10 @@
maven-surefire-plugin2.17
-
+
+ ${skipTests}-Djdk.net.URLClassPath.disableClassPathURLCheck=true
diff --git a/src/main/java/org/javasim/Scheduler.java b/src/main/java/org/javasim/Scheduler.java
index f743665..247fc5d 100644
--- a/src/main/java/org/javasim/Scheduler.java
+++ b/src/main/java/org/javasim/Scheduler.java
@@ -69,7 +69,7 @@ public static double currentTime ()
*
* @throws SimulationException if an error occurs.
*/
-
+
static synchronized void reset () throws SimulationException
{
boolean finished = false;
@@ -130,6 +130,7 @@ static synchronized void reset () throws SimulationException
Scheduler.SimulatedTime = 0.0;
SimulationProcess.Current = null;
+ SimulationProcess.allProcesses = new SimulationProcessList();
}
private Scheduler ()
@@ -148,15 +149,55 @@ static synchronized boolean schedule () throws SimulationException
if (Simulation.isStarted())
{
SimulationProcess p = SimulationProcess.current();
-
+
try
{
+ /*
+ * For some reason when executing tests in junit an old and dead
+ * thread appears in the simulation queue. Have only ever seen this
+ * be a single thread instance, but it is reproducible every time.
+ *
+ * https://github.com/nmcl/JavaSim/issues/64
+ *
+ * Will try to find out what actually causes this and remove the
+ * workaround eventually.
+ *
+ * https://github.com/nmcl/JavaSim/issues/76
+ */
+
SimulationProcess.Current = Scheduler.ReadyQueue.remove();
+ boolean done = true;
+
+ do
+ {
+ if (SimulationProcess.Current != null)
+ {
+ if (SimulationProcess.Current.getThreadGroup() == null)
+ {
+ SimulationProcess.Current = Scheduler.ReadyQueue.remove();
+ p = SimulationProcess.current();
+ done = false;
+ }
+ else
+ done = true;
+ }
+ else
+ throw new NoSuchElementException();
+ }
+ while (!done);
}
catch (NoSuchElementException e)
{
System.out.println("Simulation queue empty.");
+
+ return false;
}
+ catch (NullPointerException e)
+ {
+ System.out.println("Simulation queue empty.");
+
+ return false;
+ }
if (SimulationProcess.Current.evtime() < 0)
throw new SimulationException("Invalid SimulationProcess wakeup time.");
@@ -165,6 +206,8 @@ static synchronized boolean schedule () throws SimulationException
if (p != SimulationProcess.Current)
{
+ // Simulation.printQueue();
+
SimulationProcess.Current.resumeProcess();
return true;
diff --git a/src/main/java/org/javasim/Simulation.java b/src/main/java/org/javasim/Simulation.java
index ade771f..76de245 100644
--- a/src/main/java/org/javasim/Simulation.java
+++ b/src/main/java/org/javasim/Simulation.java
@@ -94,6 +94,15 @@ public static synchronized void start ()
Simulation.running = true;
}
+ /**
+ * Print out the contents of the current simulation queue.
+ */
+
+ public static synchronized void printQueue ()
+ {
+ SimulationProcess.allProcesses.print();
+ }
+
/**
* Has the simulation started?
*
diff --git a/src/main/java/org/javasim/internal/SimulationProcessList.java b/src/main/java/org/javasim/internal/SimulationProcessList.java
index 4c02620..b58623f 100644
--- a/src/main/java/org/javasim/internal/SimulationProcessList.java
+++ b/src/main/java/org/javasim/internal/SimulationProcessList.java
@@ -204,4 +204,4 @@ public void print ()
// package?
protected SimulationProcessCons Head;
-}
\ No newline at end of file
+}