@@ -586,6 +586,7 @@ Graph::makeArrivals(Vertex *vertex,
586586Arrival *
587587Graph::arrivals (Vertex *vertex)
588588{
589+ LockGuard lock (arrivals_lock_);
589590 return arrivals_.pointer (vertex->arrivals ());
590591}
591592
@@ -619,6 +620,7 @@ Graph::makeRequireds(Vertex *vertex,
619620Required *
620621Graph::requireds (Vertex *vertex)
621622{
623+ LockGuard lock (requireds_lock_);
622624 return requireds_.pointer (vertex->requireds ());
623625}
624626
@@ -650,6 +652,7 @@ Graph::makePrevPaths(Vertex *vertex,
650652PathVertexRep *
651653Graph::prevPaths (Vertex *vertex) const
652654{
655+ LockGuard lock (prev_paths_lock_);
653656 return prev_paths_.pointer (vertex->prevPaths ());
654657}
655658
@@ -1352,20 +1355,31 @@ Vertex::setHasDownstreamClkPin(bool has_clk_pin)
13521355 has_downstream_clk_pin_ = has_clk_pin;
13531356}
13541357
1358+ #define IN_QUEUE (mask, index ) (mask & (1 << unsigned (index)))
1359+ #define SET_IN_QUEUE (mask, index ) ((mask) |= (1 << unsigned (index)))
1360+ #define CLEAR_IN_QUEUE (mask, index ) ((mask) &= ~(1 << unsigned (index)))
1361+
13551362bool
13561363Vertex::bfsInQueue (BfsIndex index) const
13571364{
1358- return (bfs_in_queue_ >> unsigned ( index)) & 1 ;
1365+ return IN_QUEUE (bfs_in_queue_, index);
13591366}
13601367
1361- void
1368+ bool
13621369Vertex::setBfsInQueue (BfsIndex index,
13631370 bool value)
13641371{
1365- if (value)
1366- bfs_in_queue_ |= 1 << int (index);
1367- else
1368- bfs_in_queue_ &= ~(1 << int (index));
1372+ unsigned char expected = bfs_in_queue_;
1373+ unsigned char desired;
1374+ do {
1375+ if ((value && IN_QUEUE (expected, index)) || (!value && !IN_QUEUE (expected, index))) {
1376+ return false ;
1377+ }
1378+ desired = expected;
1379+ SET_IN_QUEUE (value ? desired : expected, index);
1380+ CLEAR_IN_QUEUE (value ? expected : desired, index);
1381+ } while (!bfs_in_queue_.compare_exchange_weak (expected, desired));
1382+ return true ;
13691383}
13701384
13711385// //////////////////////////////////////////////////////////////
0 commit comments