| |
| #include <pthread.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <assert.h> |
| |
| /* Delete memory that has a held lock and see what happens. */ |
| |
| typedef struct { int stuff[2000]; |
| pthread_mutex_t lock; int morestuff[2000]; } XX; |
| |
| void bar ( void ); |
| void foo ( void ); |
| |
| int main ( void ) |
| { |
| XX* xx = malloc(sizeof(XX)); |
| assert(xx); |
| |
| pthread_mutex_init( &xx->lock, NULL ); |
| |
| pthread_mutex_lock( &xx->lock ); |
| |
| free(xx); |
| |
| bar(); |
| foo(); |
| bar(); |
| |
| return 0; |
| } |
| |
| /* Try the same, on the stack */ |
| void bar ( void ) |
| { |
| pthread_mutex_t mx = PTHREAD_MUTEX_INITIALIZER; |
| // pthread_mutex_init( &mx, NULL ); |
| pthread_mutex_lock( &mx ); |
| /* now just abandon mx */ |
| } |
| |
| /* and again ... */ |
| void foo ( void ) |
| { |
| pthread_mutex_t mx; |
| pthread_mutex_init( &mx, NULL ); |
| pthread_mutex_lock( &mx ); |
| /* now just abandon mx */ |
| } |
| |