misc/73387: manpage of pthread_mutex_lock does not mention EBUSY (libpthread)

Thomas Ludwig tludwig at smr.ch
Mon Nov 1 10:30:38 PST 2004


>Number:         73387
>Category:       misc
>Synopsis:       manpage of pthread_mutex_lock does not mention EBUSY (libpthread)
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon Nov 01 18:30:38 GMT 2004
>Closed-Date:
>Last-Modified:
>Originator:     Thomas Ludwig
>Release:        RELENG_5
>Organization:
SMR Engineering & Development
>Environment:
FreeBSD pingu.smr-internal.ch 5.3-STABLE FreeBSD 5.3-STABLE #1: Mon Nov  1 18:19:35 CET 2004 root at pingu.smr-internal.ch:/usr/obj/usr/src/sys/PINGU i386
>Description:
The manpage of pthread_mutex_lock mentions EINVAL and EDEADLK as possible error codes, but not EBUSY.  However, threads not owning the mutex will get EBUSY when compiled with -lpthread:

from src/lib/libpthread/thread/thr_mutex.c:

        /* case PTHREAD_MUTEX_DEFAULT: */
        case PTHREAD_MUTEX_ERRORCHECK:
        case PTHREAD_MUTEX_NORMAL:
                /*
                 * POSIX specifies that mutexes should return EDEADLK if a 
                 * recursive lock is detected.
                 */
                if (m->m_owner == curthread)
                        ret = EDEADLK;
                else
                        ret = EBUSY;
                break;

>How-To-Repeat:
Compile and execute the following program:

#include <sys/types.h>

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

pthread_mutex_t mutex;

void
trylock(const char* tname)
{
    int rc;

    rc = pthread_mutex_trylock(&mutex);
    if (rc != 0) 
        fprintf(stderr, "%s: Could not lock mutex again: %s\n", 
                tname, strerror(rc));
    else {
        fprintf(stderr, "Could lock mutex again!");
        exit(1);
    }
}

void*
start(void* data)
{
    /* try to lock the mutex again */
    trylock("Second thread");
}

int
main(int argc, const char* argv[])
{
    pthread_t       thread;
    int             rc;

    /* create a mutex and acquire a lock on it for the main thread */
    if (pthread_mutex_init(&mutex, NULL) != 0) {
        perror("Could not initialize mutex");
        exit(1);
    }
    if (pthread_mutex_lock(&mutex) != 0) {
        perror("Could not lock mutex");
        exit(1);
    }

    /* spawn a second thread */
    if (pthread_create(&thread, NULL, start, NULL) != 0) {
        perror("Could not create thread");
        exit(1);
    }
    
    /* try to lock the mutex again */
    trylock("Main thread");

    if (pthread_join(thread, NULL) != 0)  {
        perror("Could not join threads");
        exit(1);
    }

    exit(0);
}

>Fix:
Something like this:

--- /usr/src/share/man/man3/pthread_mutex_lock.3        Thu Jan 15 16:59:00 2004
+++ /tmp/pthread_mutex_lock.3   Mon Nov  1 19:19:54 2004
@@ -62,8 +62,11 @@
 The value specified by
 .Fa mutex
 is invalid.
+.It Bq Er EBUSY
+.Fa mutex 
+is locked by another thread.
 .It Bq Er EDEADLK
-A deadlock would occur if the thread blocked waiting for
+Attempt to recursively lock 
 .Fa mutex .
 .El
 .Sh SEE ALSO

>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list