Re: nptl 0.30

"Alexander Terekhov" <[email protected]>
Newsgroups gmane.comp.lib.phil
Organization http://freemail.web.de/
Message-ID <[email protected]>
Ulrich Drepper <[email protected]> schrieb am 18.03.03 19:53:59:
> 
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> Alexander Terekhov wrote:
> >>Just invert those lines to :
> >>
> >>lll_mutex_unlock (cbuffer->cond->__data.__lock); /* much better to call
> >>futex_wake() with the mutex unlocked */
> >>lll_futex_wake (futex, INT_MAX);
> > 
> > 
> > I think that it's sufficient to wake just one single thread 
> > here (in cleanup() for async.cancel region "wrapping" futex 
> > wait(); I guess).
> 
> No, it's not sufficient.  There might be a thread which cannot be woken
> because it arrived after the cond_signal o broadcast which might be woken.

I don't understand this. Would you please elaborate?

> 
> Again, this is cancellation we are talking about.  It is not a regular
> programming tool, it's far too costly.  It's used in exception
> situations only.

Basically, I mean: < illustration >

http://www.terekhov.de/DESIGN-futex-CV.txt-with-async.cancelable-wait.txt

-----------
// auto "context" object inside wait() or extra pthread_t's fields
struct cond_wait_context_t {
   pthread_cond_t*  cv;
   pthread_mutex_t* mutex;
   int              futex;
};

cond_wait_cleanup_handler(cond_wait_context_t* ctx)
{
  cond_wait_cleanup (ctx->cv, ctx->mutex, ctx->futex);
}

cond_wait_cleanup_handler2(cond_wait_context_t* ctx)
{
  cond_signal (ctx->cv);
}

cond_wait_timeout(cv, mutex, timeout)
{

  lock(cv->lock);
  mutex_unlock(mutex); // here or below

  ++cv->waiters[ EOC(cv->futex) == (context.futex = cv->futex) ];

  unlock(cv->lock); 
  // mutex_unlock(mutex);

  context.cv = cv;
  context.mutex = mutex;
  
  pthread_cleanup_push (cond_wait_cleanup_handler, &ctx);
  pthread_cleanup_push (cond_wait_cleanup_handler2, &ctx);

  enable_async_cancel();

  FUTEX WAIT (cv->futex, futex, timeout); 

  disable_async_cancel();

  pthread_cleanup_pop (0); // cond_wait_cleanup_handler2
  pthread_cleanup_pop (1); // cond_wait_cleanup_handler

}
-----------

regards,
alexander.

______________________________________________________________________________
Schon wieder Viren-Alarm? Bei WEB.DE FreeMail ist das kein Problem,
hier ist der Virencheck inklusive! http://freemail.web.de/features/?mc=021158
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.