Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 18 Jul 2013 22:36:22 -0400 (EDT)
From:      Daniel Eischen <>
To:        Joe Marcus Clarke <>
Cc:        Koop Mast <>,
Subject:   Re: Mutexes and error checking
Message-ID:  <>
In-Reply-To: <>
References:  <> <> <> <>

Next in thread | Previous in thread | Raw E-Mail | Index | Archive | Help
On Thu, 18 Jul 2013, Daniel Eischen wrote:

> On Thu, 18 Jul 2013, Joe Marcus Clarke wrote:
>> On 7/18/13 11:09 AM, Daniel Eischen wrote:
>>> On Wed, 17 Jul 2013, Joe Marcus Clarke wrote:
>>>> It seems we might have a discrepancy between the way our pthread
>>>> implementation works compared to Linux.  If a mutex is set to NORMAL
>>>> type and one goes to unlock it, EPERM is returned unless the current
>>>> thread is the mutex owner.  While this sounds perfectly sane, it appears
>>>> Linux only returns EPERM if the mutex type is ERRORCHECK.
>>>> We are seeing some problems in ported code because of this.  As a
>>>> suggestion, if people agree, would it be possible to emulate the
>>>> behavior of Linux and only return EPERM if the mutex is of type
>>> First, any software that does that is broken.
>>> Second, the POSIX spec seems to imply that an error is returned
>>> when a different thread tries to unlock an already locked mutex:
>>> Is the mutex robust or not robust?  If not robust
>>> cannot be unlocked by any other thread than the owner.
>>> So, it would seem to be wrong to _not_ return an
>>> error when the mutex is not unlocked after
>>> pthread_mutex_unlock() returns.
>> Don't get me wrong, I agree with you.  This behavior should result in
>> EPERM.  However, my comment was more on the portability side to maintain
>> parity with Linux in order to support the 3rd party code people wanting
>> to run on FreeBSD.  We can workaround it in some cases, but I was
>> floating up to you guys to perhaps create a broader workaround.
> If it is not a robust mutex, the behavior _is_ undefined, so I
> think Linux is allowed to return 0 (no error), just as FreeBSD
> is allowed to return an error.  I will check Solaris 10 later
> to see what it does.

I tried Solaris 10.  For an already locked PTHREAD_MUTEX_NORMAL

   pthread_mutex_lock() by owner returns EDEADLK
   pthread_mutex_lock() by non-owner results in deadlock

For the above, I tested with and without the owning thread
being dead/finished.  The results were the same.

I don't really agree with Linux's behavior here.  Why even
bother with mutexes at all?  The only thing that I can think
of, is that they are only returning 0 if the owning thread is
dead or has finished.

The source for the above test is here:


Want to link to this message? Use this URL: <>