| 141 | PrevFirst = nullptr; |
| 142 | } |
| 143 | void DoCopy(TListNode* ptr) { |
| 144 | TListNode* newFirst = ptr; |
| 145 | TListNode* newCopy = nullptr; |
| 146 | TListNode* newTail = nullptr; |
| 147 | while (ptr) { |
| 148 | if (ptr == PrevFirst) { |
| 149 | // short cut, we have copied this part already |
| 150 | Tail->Next.store(newCopy, std::memory_order_release); |
| 151 | newCopy = Copy; |
| 152 | Copy = nullptr; // do not destroy prev try |
| 153 | if (!newTail) { |
| 154 | newTail = Tail; // tried to invert same list |
| 155 | } |
| 156 | break; |
| 157 | } |
| 158 | TListNode* newElem = new TListNode(ptr->Data, newCopy); |
| 159 | newCopy = newElem; |
| 160 | ptr = ptr->Next.load(std::memory_order_acquire); |
| 161 | if (!newTail) { |
| 162 | newTail = newElem; |
| 163 | } |
| 164 | } |
| 165 | EraseList(Copy); // copy was useless |
| 166 | Copy = newCopy; |
| 167 | PrevFirst = newFirst; |
| 168 | Tail = newTail; |
| 169 | } |
| 170 | }; |
| 171 | |
| 172 | void EnqueueImpl(TListNode* head, TListNode* tail) { |