[sent to ian only by accident; resending to the list]
On Sun, Jan 18, 2009 at 12:17:28PM +0000, Ian Lynagh wrote:
> In fact, looking at pthread.h on Linux:
>
> #ifdef __USE_UNIX98
> ,
> PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_TIMED_NP,
> PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP,
> PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP,
> PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL
> #endif
>
> so maybe we can just use PTHREAD_MUTEX_ERRORCHECK everywhere.
Yes. That should make ASSERT_LOCK_HELD work without blocking the
calling thread.
And forget about my previous mumbling that it's impossible to
implement ASSERT_LOCK_HELD -- i wrote that i didn't have breakfast,
did i ;-)
> > pthread_mutexattr_init(&a);
> > pthread_mutexattr_settype(&a, PTHREAD_MUTEX_NORMAL);
> > pthread_mutex_init(&m, &a);
> > pthread_mutex_lock(&m);
> > pthread_mutex_lock(&m); /* blocking here */
> >
> > IMHO there's no portable and clean way to check wether you already
> > have a lock on a mutex or not (but I didn't yet have breakfast, so
> > this statement may be wrong). Regardless of wether you're trying
> > pthread_mutex_lock with a mutex type of PTHREAD_MUTEX_ERRORCHECK
> > or wether you're trying pthread_mutex_trylock (which never blocks),
> > you get the wrong result, at least on OpenBSD.
>
> Really? FWIW, my Linux manpage says:
> If the mutex is of the ??????error checking?????? kind, pthread_mutex_lock
> returns immediately with the error code EDEADLK.
>
> What "wrong result" do you get with PTHREAD_MUTEX_ERRORCHECK and
> pthread_mutex_lock?
With ERRORCHECK I get an EDEADLK on the second pthread_mutex_lock().
> > Even on Linux, ASSERT_LOCK_HELD may have undesired effects: if you
> > call it on an unlocked mutex, you will get a positive result and
> > at the same time have locked the mutex.
>
> And the assert (that the result was EDEADLK) will fail, so the program
> terminates.
Ah, right, I was confused. Stupid me.
Ciao,
Kili
_______________________________________________
Cvs-ghc mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-ghc