Details
[Home]
Issue of the Implementation # S0501
Brief
The pthread_mutex_trylock() function returns EDEADLK instead of EBUSY
Detailed Description
Function pthread_mutex_trylock() tries to lock a mutex. It shall return EBUSY error code if the mutex could not be acquired because it was already locked. But it returns error code EDEADLK in glibc 2.4-2.5 if the mutex is owned by the current thread.
Problem location(s) in the standard
Linux Standard Base Core Specification 3.1, Chapter 13. Base Libraries, 13.10. Data Definitions for libpthread pthread_mutex_trylock() function
Example
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <pthread.h>
int printResAsErrno( int res, const char * funcWithArgs ) {
printf( "%s is %d ( %s )\n", funcWithArgs, res, strerror( res ) );
return res;
}
#define callPrintResAsErrno( funcWithPars ) printResAsErrno( funcWithPars, #funcWithPars )
int main( int argc, char ** argv ) {
pthread_mutexattr_t attr;
pthread_mutex_t mutex;
// prepare attr and mutex
callPrintResAsErrno( pthread_mutexattr_init( & attr ) );
callPrintResAsErrno( pthread_mutexattr_settype( & attr, PTHREAD_MUTEX_ERRORCHECK ) );
callPrintResAsErrno( pthread_mutex_init( & mutex, & attr ) );
callPrintResAsErrno( pthread_mutex_lock( & mutex ) );
// find error
if ( callPrintResAsErrno( pthread_mutex_trylock( & mutex ) ) != EBUSY ) {
// error found
printf( "error : pthread_mutex_trylock( ... ) should be %d ('%s')\n", EBUSY, strerror( EBUSY ) );
} else {
// error not found
printf( "no error\n" );
}
// destroy attr
callPrintResAsErrno( pthread_mutexattr_destroy( & attr ) );
// destroy mutex
callPrintResAsErrno( pthread_mutex_unlock( & mutex ) );
callPrintResAsErrno( pthread_mutex_destroy( & mutex ) );
return 0;
}
Component
glibc 2.4-2.5
Status
Fixed in glibc 2.6
[Home]
»