mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 08:26:14 +00:00
50 lines
1.3 KiB
C
50 lines
1.3 KiB
C
|
|
/* Do simple things with a recursive mutex. */
|
|
|
|
/* Needed for older glibcs (2.3 and older, at least) who don't
|
|
otherwise "know" about pthread_rwlock_anything or about
|
|
PTHREAD_MUTEX_RECURSIVE (amongst things). */
|
|
#define _GNU_SOURCE 1
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <assert.h>
|
|
#include <pthread.h>
|
|
|
|
void nearly_main ( void )
|
|
{
|
|
pthread_mutex_t mx1;
|
|
pthread_mutexattr_t attr;
|
|
int r;
|
|
|
|
r = pthread_mutexattr_init( &attr );
|
|
assert(r==0);
|
|
r = pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_RECURSIVE );
|
|
assert(r==0);
|
|
r = pthread_mutex_init( &mx1, &attr );
|
|
assert(r==0);
|
|
|
|
fprintf(stderr, "before lock #1\n");
|
|
r = pthread_mutex_lock( &mx1 ); assert(r == 0);
|
|
fprintf(stderr, "before lock #2\n");
|
|
r = pthread_mutex_lock( &mx1 ); assert(r == 0);
|
|
fprintf(stderr, "before lock #3\n");
|
|
r = pthread_mutex_lock( &mx1 ); assert(r == 0);
|
|
|
|
fprintf(stderr, "before unlock #1\n");
|
|
r = pthread_mutex_unlock( &mx1 ); assert(r == 0);
|
|
fprintf(stderr, "before unlock #2\n");
|
|
r = pthread_mutex_unlock( &mx1 ); assert(r == 0);
|
|
fprintf(stderr, "before unlock #3\n");
|
|
r = pthread_mutex_unlock( &mx1 ); assert(r == 0);
|
|
|
|
fprintf(stderr, "before unlock #4\n");
|
|
r = pthread_mutex_unlock( &mx1 ); /* FAILS: assert(r == 0); */
|
|
}
|
|
|
|
int main ( void )
|
|
{
|
|
nearly_main();
|
|
return 0;
|
|
}
|