|
Message-ID: <alpine.LNX.2.00.1408271614380.6544@monopod.intra.ispras.ru> Date: Wed, 27 Aug 2014 17:32:12 +0400 (MSK) From: Alexander Monakov <amonakov@...ras.ru> To: musl@...ts.openwall.com Subject: Re: sem_getvalue conformance considerations On Wed, 27 Aug 2014, Alexander Monakov wrote: > Why wouldn't the following design work? > > val[0] is sem value if >= 0, negated waiters count otherwise > val[1] is wakeup count, incremented before futex wake, tested and decremented > by waiters returning from futex wait Unless I'm missing something, the above can simplify sem ops (sorry, eliding some details in the following pseudocode) trywait: val = sem->val[0] while (val > 0) { oldval = val; if ((val = a_cas(sem->val, val, val-1)) == oldval) return 0; } errno = EAGAIN; return -1; wait: if (atomic_fetch_and_decrement(sem->val) > 0) return 0; while (!(futex_wait(sem->val+1, 0) && errno == EINTR)) { wakecnt = sem->val[1]; while (wakecnt > 0) { oldwcnt = wakecnt; if ((wakecnt = a_cas(sem->val+1, wakecnt, wakecnt-1)) == oldwcnt) return 0; } } return -1; post: val = sem->val[0]; do { if (val == SEM_VALUE_MAX) { errno = EOVERFLOW; return -1; } oldval = val; } while ((val = a_cas(sem->val, val, val+1)) != oldval); if (val < 0) { a_inc(sem->val+1); futex_wake(sem->val+1, 1); } return 0; Alexander
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.