wakeup idea...

dima _pppp at mail.ru
Mon Mar 6 05:45:46 PST 2006


>> Here is a possibly stupid idea.
>>
>> Historically sleep/wakeup have happened on a pointer which was just a magic 
>> number.
>>
>> In many cases, this pointer is actually a relevant datastructure.
>>
>> Would it possibly be an optimization to make a variant of the sleep/wakeup 
>> calls where the pointer points to an integer type which contains non-zero if 
>> anybody is actually sleeping on that address ?
>>
>> Anybody up for a quick prototype ?
> 
> In principle this is part of the point of a condition variable, which 
> associates a struct with waitable conditions, and includes an int that 
> contains the number of waiters:
> 
> struct cv {
>          const char      *cv_description;
>          int             cv_waiters;
> };
> 
> Presumably the tricky bit is optimizing this such that you avoid undesirable 
> races.  (But maybe if you call cv_signal without the condition mutex held, you 
> accept that race by definition?)

I'm working on a new implementation of SX locks: http://wikitest.freebsd.org/moin.cgi/Usable_20lock_20implementation_20with_20SX_2dsemantics
Direct handoff (as described in "Solaris Internals") seems to do the trick. You just don't need any additional mutex for wakeup process since the current owner chooses who and when to wakeup.
Since CV-s and SX-es have very similar semantics I describe my ideas here. We would need 2 list-like datastructures:
1. Current holders (for proper priority propagation)
2. Current waiters (for direct handoff)
The first one can be implemented as an array; the reason of such a design decision is to avoid locking at SX acquire. The second list needs to be implemented as a (sorted by priority) queue (TAILQ for now) which needs a mutex for consistency.



More information about the freebsd-arch mailing list