Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Annotation of /branches/lamont/src/compiler/c-target/fragments/seq-run.in
ViewVC logotype

Annotation of /branches/lamont/src/compiler/c-target/fragments/seq-run.in

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1717 - (view) (download)
Original Path: branches/vis12/src/compiler/c-target/fragments/run.in

1 : jhr 1717 //! Run the Diderot program
2 :     //! \param wrld the world-state of the Diderot program
3 :     //! \param maxNSteps the limit on the number of super steps; 0 means unlimited
4 :     //! \return the number of steps taken.
5 :     uint32_t @PREFIX@Run (@PREFIX@World_t *wrld, uint32_t maxNSteps)
6 :     {
7 :     Strand_t *strand = &(wrld->strandDesc[0]);
8 :    
9 :     if (maxNSteps == 0) maxNSteps = 0xffffffff; // essentially unlimited
10 :    
11 :     // iterate until all strands are stable
12 :     if (wrld->verboseFlg) fprintf(stderr, "run with %d strands ...\n", wrld->numStrands);
13 :     double t0 = airTime();
14 :     uint32_t nSteps = 0, nUpdates = 0;
15 :     uint32_t nActive = wrld->numStrands;
16 :     while ((nActive > 0) && (nSteps <= maxNSteps)) {
17 :     nSteps++;
18 :     // update strands
19 :     bool existsStabilizing = false;
20 :     for (int i = 0; i < wrld->numStrands; i++) {
21 :     if (! wrld->status[i]) {
22 :     nUpdates++;
23 :     StrandStatus_t sts = strand->update(wrld->inState[i], wrld->outState[i]);
24 :     switch (sts) {
25 :     case DIDEROT_STABILIZE:
26 :     existsStabilizing = true;
27 :     wrld->status[i] = DIDEROT_STABILIZE;
28 :     break;
29 :     case DIDEROT_DIE:
30 :     wrld->status[i] = DIDEROT_DIE;
31 :     nActive--;
32 :     break;
33 :     default:
34 :     break;
35 :     }
36 :     }
37 :     }
38 :     if (existsStabilizing) {
39 :     for (int i = 0; i < wrld->numStrands; i++) {
40 :     // NOTE: we may want to compact the array of strands
41 :     if (wrld->status[i] == DIDEROT_STABILIZE) {
42 :     // stabilize the strand's state. Note that the outState has been set by
43 :     // the last call to update, so we make the inState be the target of the
44 :     // stabilize method.
45 :     strand->stabilize(wrld->outState[i], wrld->inState[i]);
46 :     memcpy (wrld->outState[i], wrld->inState[i], strand->stateSzb);
47 :     wrld->status[i] = DIDEROT_STABLE;
48 :     nActive--;
49 :     }
50 :     }
51 :     }
52 :     // swap in and out
53 :     @STRANDTY@ **tmp = wrld->inState;
54 :     wrld->inState = wrld->outState;
55 :     wrld->outState = tmp;
56 :     }
57 :     double totalTime = airTime() - t0;
58 :    
59 :     return nSteps;
60 :    
61 :     } // @PREFIX@Run

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0