Another removal of a nested function.
Note this one is relatively complex and error prone.
This commit is contained in:
parent
ec8ea5f95c
commit
69c0486376
153
src/dotout.c
153
src/dotout.c
@ -721,63 +721,15 @@ isApplicationM0 (const System sys, const int run)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Determine ranks for all nodes
|
//! Helper for graph_ranks
|
||||||
/**
|
/**
|
||||||
* Some crude algorithm I sketched on the blackboard.
|
* Name & documentation might be off; TODO later.
|
||||||
|
* This is for now just a refactoring to get rid of trampolines.
|
||||||
*/
|
*/
|
||||||
int
|
int preceventPossible (const System sys, const int rank, const int run, const int rank2, const int run2, const int ev2)
|
||||||
graph_ranks (int *ranks, int nodes)
|
|
||||||
{
|
|
||||||
int done;
|
|
||||||
int rank;
|
|
||||||
int changes;
|
|
||||||
|
|
||||||
int getrank (int run, int ev)
|
|
||||||
{
|
|
||||||
return ranks[eventNode (run, ev)];
|
|
||||||
}
|
|
||||||
|
|
||||||
void setrank (int run, int ev, int rank)
|
|
||||||
{
|
|
||||||
ranks[eventNode (run, ev)] = rank;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
if (hasCycle ())
|
|
||||||
{
|
|
||||||
error ("Graph ranks tried, but a cycle exists!");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < nodes; i++)
|
|
||||||
{
|
|
||||||
ranks[i] = INT_MAX;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
rank = 0;
|
|
||||||
done = false;
|
|
||||||
changes = true;
|
|
||||||
while (!done)
|
|
||||||
{
|
|
||||||
int checkCanEventHappenNow (int run, Roledef rd, int ev)
|
|
||||||
{
|
|
||||||
//if (sys->runs[run].protocol != INTRUDER)
|
|
||||||
{
|
|
||||||
if (getrank (run, ev) == INT_MAX)
|
|
||||||
{
|
|
||||||
// Allright, this regular event is not assigned yet
|
|
||||||
int precevent (int run2, int ev2)
|
|
||||||
{
|
|
||||||
//if (sys->runs[run2].protocol != INTRUDER)
|
|
||||||
{
|
{
|
||||||
// regular preceding event
|
// regular preceding event
|
||||||
int rank2;
|
|
||||||
|
|
||||||
rank2 = getrank (run2, ev2);
|
|
||||||
if (rank2 > rank)
|
if (rank2 > rank)
|
||||||
{
|
{
|
||||||
// higher rank, this cannot be done
|
// higher rank, this cannot be done
|
||||||
@ -792,25 +744,70 @@ graph_ranks (int *ranks, int nodes)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Helper for graph_ranks
|
||||||
|
/**
|
||||||
|
* Name & documentation might be off; TODO later.
|
||||||
|
* This is for now just a refactoring to get rid of trampolines.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
iteratePrecedingRole(const System sys, const int *ranks, const int run, const int ev, const int rank)
|
||||||
|
{
|
||||||
|
int run2;
|
||||||
|
|
||||||
|
for (run2 = 0; run2 < sys->maxruns; run2++)
|
||||||
|
{
|
||||||
|
int ev2;
|
||||||
|
|
||||||
|
for (ev2 = 0; ev2 < sys->runs[run2].step; ev2++)
|
||||||
|
{
|
||||||
|
if (isDependEvent (run2, ev2, run, ev))
|
||||||
|
{
|
||||||
|
int rank2;
|
||||||
|
|
||||||
|
rank2 = ranks[eventNode (run2, ev2)];
|
||||||
|
if (!preceventPossible (sys, rank, run, rank2, run2, ev2))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (iteratePrecedingEvents (sys, precevent, run, ev))
|
//! Determine ranks for all nodes
|
||||||
|
/**
|
||||||
|
* Some crude algorithm I sketched on the blackboard.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
graph_ranks (int *ranks, int nodes)
|
||||||
{
|
{
|
||||||
// we can do it!
|
int done;
|
||||||
changes = true;
|
int rank;
|
||||||
setrank (run, ev, rank);
|
int changes;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (hasCycle ())
|
||||||
|
{
|
||||||
|
error ("Graph ranks tried, but a cycle exists!");
|
||||||
}
|
}
|
||||||
else
|
#endif
|
||||||
|
|
||||||
|
for (i = 0; i < nodes; i++)
|
||||||
{
|
{
|
||||||
|
ranks[i] = INT_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
rank = 0;
|
||||||
done = false;
|
done = false;
|
||||||
}
|
changes = true;
|
||||||
}
|
while (!done)
|
||||||
}
|
{
|
||||||
return true;
|
int run;
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (!changes)
|
if (!changes)
|
||||||
{
|
{
|
||||||
@ -824,7 +821,35 @@ graph_ranks (int *ranks, int nodes)
|
|||||||
}
|
}
|
||||||
done = true;
|
done = true;
|
||||||
changes = false;
|
changes = false;
|
||||||
iterateAllEvents (sys, checkCanEventHappenNow);
|
|
||||||
|
for (run = 0; run < sys->maxruns; run++)
|
||||||
|
{
|
||||||
|
Roledef rd;
|
||||||
|
int ev;
|
||||||
|
|
||||||
|
rd = sys->runs[run].start;
|
||||||
|
for (ev = 0; ev < sys->runs[run].step; ev++)
|
||||||
|
{
|
||||||
|
if (rd != NULL) // Shouldn't be needed (step should maintain invariant) but good to be safe
|
||||||
|
{
|
||||||
|
if ( ranks[eventNode (run, ev)] == INT_MAX)
|
||||||
|
{
|
||||||
|
if (iteratePrecedingRole (sys, ranks, run, ev, rank))
|
||||||
|
{
|
||||||
|
// we can do it!
|
||||||
|
changes = true;
|
||||||
|
ranks[eventNode (run, ev)] = rank;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
done = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rd = rd->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return rank;
|
return rank;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user