X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FAtomicLinkedList.h;h=254a48a087fc96b32fa6591c4585bee1d09d8477;hb=4bfbe0a10e914c3626e16cfdb9e87508e63b065f;hp=71f56bfc5d318b2af2fbbfe867f4954e63798672;hpb=71f01fb8f37708b54e32d99aa9c2200744a7ba78;p=folly.git diff --git a/folly/AtomicLinkedList.h b/folly/AtomicLinkedList.h index 71f56bfc..254a48a0 100644 --- a/folly/AtomicLinkedList.h +++ b/folly/AtomicLinkedList.h @@ -1,5 +1,5 @@ /* - * Copyright 2016 Facebook, Inc. + * Copyright 2014-present Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -54,7 +54,7 @@ class AtomicLinkedList { * after the call. */ bool insertHead(T t) { - auto wrapper = folly::make_unique(std::move(t)); + auto wrapper = std::make_unique(std::move(t)); return list_.insertHead(wrapper.release()); } @@ -73,6 +73,28 @@ class AtomicLinkedList { }); } + /** + * Similar to sweep() but calls func() on elements in LIFO order. + * + * func() is called for all elements in the list at the moment + * reverseSweep() is called. Unlike sweep() it does not loop to ensure the + * list is empty at some point after the last invocation. This way callers + * can reason about the ordering: elements inserted since the last call to + * reverseSweep() will be provided in LIFO order. + * + * Example: if elements are inserted in the order 1-2-3, the callback is + * invoked 3-2-1. If the callback moves elements onto a stack, popping off + * the stack will produce the original insertion order 1-2-3. + */ + template + void reverseSweep(F&& func) { + list_.reverseSweep([&](Wrapper* wrapperPtr) mutable { + std::unique_ptr wrapper(wrapperPtr); + + func(std::move(wrapper->data)); + }); + } + private: struct Wrapper { explicit Wrapper(T&& t) : data(std::move(t)) {}