Hi all, I wrote some test code that was trying to drain a process::Queue. This ended up losing values from the queue, as demonstrated by:
TEST(QueueTest, Discard) { Queue<int> q; Future<int> get = q.get(); EXPECT_FALSE(get.isReady()); get.discard(); EXPECT_TRUE(get.hasDiscard()); q.put(42); get = q.get(); EXPECT_TRUE(get.isReady()); << fails because '42' is set on the discarded future EXPECT_EQ(42, get.get()); } In process::Queue, I can detect Future::hadDiscard and then discard the associated Promise, but this suffers from a TTCTTOU race. It almost looks like the right way to deal with this is to just call Promise::set, which calls Future::set. The problem is that a Future does not move into DISCARDED state until its associated Promise is discarded. Is there a race-free way to know when you tried do set a value on a discarded Future? thanks, James