jpf:start
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
jpf:start [2007/11/23 13:51] – created franck | jpf:start [2008/01/21 20:37] (current) – franck | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Java PathFinder ====== | ====== Java PathFinder ====== | ||
+ | A lot of information about JPF can be found | ||
+ | [[http:// | ||
+ | |||
+ | More information can be found | ||
+ | [[http:// | ||
+ | |||
+ | Although it describes an old version of JPF, | ||
+ | [[http:// | ||
+ | manual may be useful. | ||
+ | |||
+ | To configure JPF, you may want to use a | ||
+ | jpf.properties file containing | ||
+ | < | ||
+ | search.class = gov.nasa.jpf.search.heuristic.HeuristicSearch | ||
+ | search.heuristic.class = | ||
+ | gov.nasa.jpf.search.heuristic.BFSHeuristic | ||
+ | </ | ||
+ | to use a breadth-first traversal of the state space (rather than a depth-first traversal which is the default). | ||
+ | race conditions, you may want to add\\ | ||
+ | < | ||
+ | jpf.listener = gov.nasa.jpf.tools.precise.PreciseRaceDetector | ||
+ | </ | ||
+ | to your jpf.properties file. | ||
+ | |||
+ | To check some properties of our solution to the | ||
+ | readers-writers problem by means of JPF, we | ||
+ | modified our solution as follows (the attribute writers | ||
+ | and assertions have been added). | ||
+ | |||
+ | <code java> | ||
+ | /** | ||
+ | * This class represents a database. | ||
+ | * threads wishing to read and write. | ||
+ | * multiple processes reading at the same time, but if one thread | ||
+ | * is writing then no other process may either read or write. | ||
+ | */ | ||
+ | public class Database | ||
+ | { | ||
+ | private int readers; // number of active readers | ||
+ | private int writers; // number of active writers | ||
+ | |||
+ | /** | ||
+ | | ||
+ | */ | ||
+ | public Database() | ||
+ | { | ||
+ | this.readers = 0; | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | Read from this database. | ||
+ | |||
+ | | ||
+ | */ | ||
+ | public void read(int number) | ||
+ | { | ||
+ | synchronized(this) | ||
+ | { | ||
+ | this.readers++; | ||
+ | System.out.println(" | ||
+ | } | ||
+ | |||
+ | final int DELAY = 5000; | ||
+ | try | ||
+ | { | ||
+ | | ||
+ | } | ||
+ | catch (InterruptedException e) {} | ||
+ | |||
+ | assert((this.writers == 1 && this.readers == 0) || this.writers == 0); | ||
+ | |||
+ | synchronized(this) | ||
+ | { | ||
+ | System.out.println(" | ||
+ | this.readers--; | ||
+ | if (this.readers == 0) | ||
+ | { | ||
+ | this.notifyAll(); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | | ||
+ | |||
+ | | ||
+ | */ | ||
+ | public synchronized void write(int number) | ||
+ | { | ||
+ | while (this.readers != 0) | ||
+ | { | ||
+ | try | ||
+ | { | ||
+ | this.wait(); | ||
+ | } | ||
+ | catch (InterruptedException e) {} | ||
+ | } | ||
+ | System.out.println(" | ||
+ | this.writers++; | ||
+ | |||
+ | final int DELAY = 5000; | ||
+ | try | ||
+ | { | ||
+ | Thread.sleep((int) (Math.random() * DELAY)); | ||
+ | } | ||
+ | catch (InterruptedException e) {} | ||
+ | |||
+ | assert((this.writers == 1 && this.readers == 0) || this.writers == 0); | ||
+ | |||
+ | this.writers--; | ||
+ | System.out.println(" | ||
+ | this.notifyAll(); | ||
+ | } | ||
+ | } | ||
+ | </ |
jpf/start.1195825876.txt.gz · Last modified: 2007/11/23 13:51 by franck