mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 08:26:14 +00:00
57 lines
1.1 KiB
C
57 lines
1.1 KiB
C
/** Cause a race inside code protected by a reader lock.
|
|
*/
|
|
|
|
|
|
/* Needed for older glibc's (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 <pthread.h>
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
|
|
|
|
|
|
static pthread_rwlock_t s_rwlock;
|
|
static int s_racy;
|
|
|
|
static void sleep_ms(const int ms)
|
|
{
|
|
struct timespec delay = { ms / 1000, (ms % 1000) * 1000 * 1000 };
|
|
nanosleep(&delay, 0);
|
|
}
|
|
|
|
static void* thread_func(void* arg)
|
|
{
|
|
pthread_rwlock_rdlock(&s_rwlock);
|
|
s_racy++;
|
|
pthread_rwlock_unlock(&s_rwlock);
|
|
sleep_ms(100);
|
|
return 0;
|
|
}
|
|
|
|
int main(int argc, char** argv)
|
|
{
|
|
pthread_t thread1;
|
|
pthread_t thread2;
|
|
|
|
#if 0
|
|
|
|
VALGRIND_DO_CLIENT_REQUEST_STMT(VG_USERREQ__DRD_TRACE_ADDR,
|
|
&s_racy, 0, 0, 0, 0);
|
|
#endif
|
|
|
|
pthread_rwlock_init(&s_rwlock, 0);
|
|
pthread_create(&thread1, 0, thread_func, 0);
|
|
pthread_create(&thread2, 0, thread_func, 0);
|
|
pthread_join(thread1, 0);
|
|
pthread_join(thread2, 0);
|
|
pthread_rwlock_destroy(&s_rwlock);
|
|
|
|
fprintf(stderr, "Result: %d\n", s_racy);
|
|
|
|
return 0;
|
|
}
|