On Thu, Aug 11, 2016 at 5:47 PM, Robert Haas <robertmh...@gmail.com> wrote: > So, in my > implementation, a condition variable wait loop looks like this: > > for (;;) > { > ConditionVariablePrepareToSleep(cv); > if (condition for which we are waiting is satisfied) > break; > ConditionVariableSleep(); > } > ConditionVariableCancelSleep();
I have what I think is a better idea. Let's get rid of ConditionVariablePrepareToSleep(cv) and instead tell users of this facility to write the loop this way: for (;;) { if (condition for which we are waiting is satisfied) break; ConditionVariableSleep(cv); } ConditionVariableCancelSleep(); ConditionVariableSleep(cv) will check whether the current process is already on the condition variable's waitlist. If so, it will sleep; if not, it will add the process and return without sleeping. It may seem odd that ConditionVariableSleep(cv) doesn't necessary sleep, but this design has a significant advantage: we avoid manipulating the wait-list altogether in the case where the condition is already satisfied when we enter the loop. That's more like what we already do in lwlock.c: we try to grab the lock first; if we can't, we add ourselves to the wait-list and retry; if we then get the lock after all we have to recheck whether we can get the lock and remove ourselves from the wait-list if so. Of course, there is some cost: if we do have to wait, we'll end up checking the condition twice before actually going to sleep. However, it's probably smart to bet that actually needing to sleep is fairly infrequent, just as in lwlock.c. Thoughts? -- Robert Haas EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers