12
void *(*start_routine)(void *);
15
pthread_mutex_t mutex;
18
static void cleanup(void *thread)
20
struct thread *t = (struct thread *)thread;
22
fprintf(stderr, "thread exit #%u\n", t->num);
25
static void *startup(void *startupinfo)
27
struct startupinfo *sui = (struct startupinfo *)startupinfo;
29
void *(*start_routine)(void *) = sui->start_routine;
32
real_mutex_lock(&sui->mutex);
33
real_cond_signal(&sui->cond);
34
real_mutex_unlock(&sui->mutex);
36
struct thread *t = find_thread(pthread_self());
38
fprintf(stderr, "thread create #%u\n", t->num);
42
pthread_cleanup_push(&cleanup, t);
44
res = start_routine(arg);
46
pthread_cleanup_pop(1);
53
pthread_attr_t const *attr,
54
void *(*start_routine)(void*),
57
struct startupinfo sui = { start_routine, arg, {}, {} };
58
real_cond_init(&sui.cond, 0);
59
real_mutex_init(&sui.mutex, 0);
61
real_mutex_lock(&sui.mutex);
63
int res = real_create(thread, attr, &startup, &sui);
65
real_cond_wait(&sui.cond, &sui.mutex);
67
real_mutex_unlock(&sui.mutex);