Skip to content

Instantly share code, notes, and snippets.

@rightfold
Created November 17, 2014 20:48
Show Gist options
  • Save rightfold/ddeef5665d269bfbceb6 to your computer and use it in GitHub Desktop.
Save rightfold/ddeef5665d269bfbceb6 to your computer and use it in GitHub Desktop.
boost::optional<GCPtr<>> object;
std::mutex mutex;
std::vector<std::function<void(GCPtr<>)>> receiveCallbacks;
std::vector<std::function<GCPtr<>()>> sendCallbacks;
template<typename F>
void receive(F receiveCallback) {
boost::optional<GCPtr<>> value;
{
std::lock_guard<decltype(mutex)> lock(mutex);
if (!object.empty()) {
value = std::move(object);
if (!sendCallbacks.empty()) {
auto sendCallback = detail::takeRandomElement(sendCallbacks);
object = sendCallback();
}
} else {
receiveCallbacks.push_back(std::move(receiveCallback));
}
}
if (value) {
receiveCallback(*value);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment