Fix worst slack queue corruption (#154)
Signed-off-by: Martin Povišer <povik@cutebit.org>
This commit is contained in:
parent
3dd38ad159
commit
c39f8ab1ac
|
|
@ -265,32 +265,34 @@ WorstSlack::updateWorstSlack(Vertex *vertex,
|
||||||
SlackSeq &slacks,
|
SlackSeq &slacks,
|
||||||
PathAPIndex path_ap_index)
|
PathAPIndex path_ap_index)
|
||||||
{
|
{
|
||||||
Slack slack = slacks[path_ap_index];
|
// Do not touch the state unless queue has been initialized
|
||||||
|
if (!queue_->empty()) {
|
||||||
|
Slack slack = slacks[path_ap_index];
|
||||||
|
// Locking is required because ArrivalVisitor is called by multiple
|
||||||
|
// threads.
|
||||||
|
LockGuard lock(lock_);
|
||||||
|
if (worst_vertex_
|
||||||
|
&& delayLess(slack, worst_slack_, this))
|
||||||
|
setWorstSlack(vertex, slack);
|
||||||
|
else if (vertex == worst_vertex_)
|
||||||
|
// Mark worst slack as unknown (updated by findWorstSlack().
|
||||||
|
worst_vertex_ = nullptr;
|
||||||
|
|
||||||
// Locking is required because ArrivalVisitor is called by multiple
|
if (!delayEqual(slack, slack_init_)
|
||||||
// threads.
|
&& delayLessEqual(slack, slack_threshold_, this)) {
|
||||||
LockGuard lock(lock_);
|
debugPrint(debug_, "wns", 3, "insert %s %s",
|
||||||
if (worst_vertex_
|
vertex->name(network_),
|
||||||
&& delayLess(slack, worst_slack_, this))
|
delayAsString(slack, this));
|
||||||
setWorstSlack(vertex, slack);
|
queue_->insert(vertex);
|
||||||
else if (vertex == worst_vertex_)
|
}
|
||||||
// Mark worst slack as unknown (updated by findWorstSlack().
|
else {
|
||||||
worst_vertex_ = nullptr;
|
debugPrint(debug_, "wns", 3, "delete %s %s",
|
||||||
|
vertex->name(network_),
|
||||||
if (!delayEqual(slack, slack_init_)
|
delayAsString(slack, this));
|
||||||
&& delayLessEqual(slack, slack_threshold_, this)) {
|
queue_->erase(vertex);
|
||||||
debugPrint(debug_, "wns", 3, "insert %s %s",
|
}
|
||||||
vertex->name(network_),
|
//checkQueue(path_ap_index);
|
||||||
delayAsString(slack, this));
|
|
||||||
queue_->insert(vertex);
|
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
debugPrint(debug_, "wns", 3, "delete %s %s",
|
|
||||||
vertex->name(network_),
|
|
||||||
delayAsString(slack, this));
|
|
||||||
queue_->erase(vertex);
|
|
||||||
}
|
|
||||||
// checkQueue();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue