int main() { pthread_t threads[T]; int i, j; for (j = 0; j < T; j++) { for (i = 0; i < N; i++) { data[j][i].satelite = N * j + i; LL_INIT_ENTRY(&data[j][i].entry); LL_PUSH_BACK(objlist, &list, &data[j][i]); } } must_succeed(pthread_barrier_init(&barrier, NULL, T + 1), "pthread_barrier_init"); for (i = 0; i < T; i++) { must_succeed(pthread_create(&threads[i], NULL, (i < N / 2 ? &rm_thread_forward : &rm_thread_backward), data[i]), "pthread_create"); } must_succeed(barrier_wait(&barrier), "pthread_barrier_wait"); for (i = 0; i < T; i++) must_succeed(pthread_join(threads[i], NULL), "pthread_join"); must_succeed(pthread_barrier_destroy(&barrier), "pthread_barrier_destroy"); assert(LL_EMPTY(objlist, &list)); return 0; }
static void generate_system_random_bytes(size_t n, void *result) { HCRYPTPROV prov; #define must_succeed(x) do if (!(x)) assert(0); while (0) must_succeed(CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT)); must_succeed(CryptGenRandom(prov, (DWORD)n, result)); must_succeed(CryptReleaseContext(prov, 0)); #undef must_succeed }
void* rm_thread_backward(void *objs_ptr) { struct obj *objs = objs_ptr; int i; for (i = 0; i < N; i++) LL_REF(objlist, &list, &objs[i]); must_succeed(barrier_wait(&barrier), "pthread_barrier_wait"); for (i = N - 1; i >= 0; i--) { if (!LL_UNLINK(objlist, &list, &objs[i])) unlink_fail(&objs[i]); } return NULL; }