Date: Wed, 21 Oct 1998 00:20:53 +0200 From: Eivind Eklund <eivind@yes.no> To: Jason Evans <jasone@canonware.com>, "Richard Seaman, Jr." <lists@tar.com> Cc: "current@freebsd.org" <current@FreeBSD.ORG> Subject: Re: Another Serious libc_r problem Message-ID: <19981021002053.38506@follo.net> In-Reply-To: <Pine.LNX.3.96.981020131031.11042E-100000@orkan.canonware.com>; from Jason Evans on Tue, Oct 20, 1998 at 01:16:07PM -0700 References: <199810201805.NAA11025@ns.tar.com> <Pine.LNX.3.96.981020131031.11042E-100000@orkan.canonware.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Oct 20, 1998 at 01:16:07PM -0700, Jason Evans wrote: > On Tue, 20 Oct 1998, Richard Seaman, Jr. wrote: > > > On Mon, 19 Oct 1998 18:03:22 -0700 (PDT), Jason Evans wrote: > > > > >Hmm, your test case is very similar to some code that was causing deadlock > > >for me. However, I boiled it down to the following code as being the > > >actual bug. We may be seeing the same thing (but maybe not; I haven't had > > >time to dig into this all the way). > > > > > >Jason > > > > I think the problem in your code is that you expect to be able to recursively > > lock a mutex in the same thread, using the default mutex type. I don't > > think this is a bug, since the "default" mutex type is implementation > > defined, if I'm not mistaken. > > Did you actually run the code? The point I was trying to make is that the > code does _not_ deadlock for the default (fast mutex). I'm not sure that > this is a bug, but it is different than the behavior I've seen on other > systems. Can someone say whether this is allowed by the POSIX spec? It is allowed by SS2, at least. SS2 creates a PTHREAD_MUTEX_DEFAULT by default, which hardly has any restrictions. A PTHREAD_MUTEX_NORMAL has to deadlock (said so one place in the text - it is slightly inconsistent with the text other places in SS2, which say it 'may' deadlock). There is also a something I believe to be a bug in the handling of MUTEX_TYPE_COUNTING_FAST - it needs to be mutex_unlock()'ed one more time than it is mutex_lock()'ed. The following patch will make it work correctly (I hope to have this in the tree sometime tomorrow): --- uthread_mutex.c.EE Tue Oct 20 22:01:46 1998 +++ uthread_mutex.c Tue Oct 20 22:34:20 1998 @@ -383,17 +383,19 @@ ret = EINVAL; } /* Check if there are still counts: */ - else if ((*mutex)->m_data.m_count) { + else if ((*mutex)->m_data.m_count > 1) { /* Decrement the count: */ (*mutex)->m_data.m_count--; - } - /* - * Get the next thread from the queue of threads waiting on - * the mutex: - */ - else if (((*mutex)->m_owner = _thread_queue_deq(&(*mutex)->m_queue)) != NULL) { - /* Allow the new owner of the mutex to run: */ - PTHREAD_NEW_STATE((*mutex)->m_owner,PS_RUNNING); + } else { + (*mutex)->m_data.m_count = 0; + /* + * Get the next thread from the queue of threads waiting on + * the mutex: + */ + if (((*mutex)->m_owner = _thread_queue_deq(&(*mutex)->m_queue)) != NULL) { + /* Allow the new owner of the mutex to run: */ + PTHREAD_NEW_STATE((*mutex)->m_owner,PS_RUNNING); + } } break; There will be a slight fuzz when you apply this; don't worry, this is due to it being between two working versions of my source (I've also got patches to add support for the SS2 pthread_mutextattr_settype() call, but these are tested much yet). Eivind. To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19981021002053.38506>