void ML_(sema_init)(vg_sema_t *sema) { HChar buf[2]; Int res, r; r = VG_(pipe)(sema->pipe); vg_assert(r == 0); vg_assert(sema->pipe[0] != sema->pipe[1]); sema->pipe[0] = VG_(safe_fd)(sema->pipe[0]); sema->pipe[1] = VG_(safe_fd)(sema->pipe[1]); if (0) VG_(debugLog)(0,"zz","sema_init: %d %d\n", sema->pipe[0], sema->pipe[1]); vg_assert(sema->pipe[0] != sema->pipe[1]); sema->owner_lwpid = -1; /* create initial token */ sema_char = 'A'; buf[0] = sema_char; buf[1] = 0; sema_char++; INNER_REQUEST(ANNOTATE_RWLOCK_CREATE(sema)); INNER_REQUEST(ANNOTATE_BENIGN_RACE_SIZED(&sema->owner_lwpid, sizeof(sema->owner_lwpid), "")); res = VG_(write)(sema->pipe[1], buf, 1); vg_assert(res == 1); }
static void rwlock_init(rwlock_t* p) { DRD_IGNORE_VAR(*p); p->locked = 0; p->writer_count = 0; p->reader_count = 0; ANNOTATE_RWLOCK_CREATE(p); }
static struct sched_lock *create_sched_lock(void) { struct sched_lock *p; p = VG_(malloc)("sched_lock", sizeof(*p)); // The futex syscall requires that a futex takes four bytes. vg_assert(sizeof(p->futex[0]) == 4); VG_(memset)(p, 0, sizeof(*p)); INNER_REQUEST(ANNOTATE_RWLOCK_CREATE(p)); INNER_REQUEST(ANNOTATE_BENIGN_RACE_SIZED(&p->futex, sizeof(p->futex), "")); return p; }
static struct sched_lock *create_sched_lock(void) { struct sched_lock *p; p = VG_(malloc)("sched_lock", sizeof(*p)); if (p) { vg_assert(sizeof(p->futex[0]) == 4); p->head = 0; p->tail = 0; VG_(memset)((void*)p->futex, 0, sizeof(p->futex)); p->owner = 0; } INNER_REQUEST(ANNOTATE_RWLOCK_CREATE(p)); INNER_REQUEST(ANNOTATE_BENIGN_RACE_SIZED(&p->futex, sizeof(p->futex), "")); return p; }