| 117 | } |
| 118 | |
| 119 | bool DenseBFSGraph::tryAddSingleParentWithWeight(nodeID_t boundNodeID, relID_t edgeID, |
| 120 | nodeID_t nbrNodeID, bool fwdEdge, double weight, ObjectBlock<ParentList>* block) { |
| 121 | ParentList* expected = getParentListHead(nbrNodeID.offset); |
| 122 | auto parent = reserveParent(boundNodeID, edgeID, fwdEdge, block); |
| 123 | parent->setCost(getParentListHead(boundNodeID)->getCost() + weight); |
| 124 | while (parent->getCost() < getCost(expected)) { |
| 125 | if (curData[nbrNodeID.offset].compare_exchange_strong(expected, parent)) { |
| 126 | // Since each node can have one parent, set next ptr to nullptr. |
| 127 | parent->setNextPtr(nullptr); |
| 128 | return true; |
| 129 | } |
| 130 | } |
| 131 | // Other thread has added the parent. Do NOT add parent and revert reserved slot. |
| 132 | block->revertLast(); |
| 133 | return false; |
| 134 | } |
| 135 | |
| 136 | ParentList* DenseBFSGraph::getParentListHead(offset_t offset) { |
| 137 | DASSERT(curData); |
no test coverage detected