X-Git-Url: https://pd.if.org/git/?p=nbds;a=blobdiff_plain;f=runtime%2Frcu.c;h=b1633488d8cfea2bd52d87d2db0e44cc348ceecf;hp=f5e3c3ca27bc53252e447fb99b086b0d863db5a4;hb=b21e1c182a2e469240d2b1cbbda37f2dfeb880d9;hpb=a1fae129c758d7ea83dfdbb5f14ec1df12f0aa34 diff --git a/runtime/rcu.c b/runtime/rcu.c index f5e3c3c..b163348 100644 --- a/runtime/rcu.c +++ b/runtime/rcu.c @@ -100,112 +100,3 @@ void nbd_defer_free (void *x) { TRACE("r0", "nbd_defer_free: put %p on queue at position %llu", x, pending_[tid_]->head); rcu_post(pending_[tid_]->head); } - -#ifdef MAKE_rcu_test -#include -#include -#include "runtime.h" - -#define NUM_ITERATIONS 10000000 - -typedef struct node { - struct node *next; -} node_t; - -typedef struct lifo { - node_t *head; -} lifo_t; - -static volatile int wait_; -static lifo_t *stk_; - -static lifo_t *lifo_alloc (void) { - lifo_t *stk = (lifo_t *)nbd_malloc(sizeof(lifo_t)); - memset(stk, 0, sizeof(lifo_t)); - return stk; -} - -static void lifo_aba_push (lifo_t *stk, node_t *x) { - node_t *head; - do { - head = ((volatile lifo_t *)stk)->head; - ((volatile node_t *)x)->next = head; - } while (__sync_val_compare_and_swap(&stk->head, head, x) != head); -} - -node_t *lifo_aba_pop (lifo_t *stk) { - node_t *head; - do { - head = ((volatile lifo_t *)stk)->head; - if (head == NULL) - return NULL; - } while (__sync_val_compare_and_swap(&stk->head, head, head->next) != head); - head->next = NULL; - return head; -} - -node_t *node_alloc (void) { - node_t *node = (node_t *)nbd_malloc(sizeof(node_t)); - memset(node, 0, sizeof(node_t)); - return node; -} - -void *worker (void *arg) { - int id = (int)(size_t)arg; - unsigned int rand_seed = (unsigned int)id + 1; - - // Wait for all the worker threads to be ready. - __sync_fetch_and_add(&wait_, -1); - do {} while (wait_); - - int i; - for (i = 0; i < NUM_ITERATIONS; ++ i) { - int n = rand_r(&rand_seed); - if (n & 0x1) { - lifo_aba_push(stk_, node_alloc()); - } else { - node_t *x = lifo_aba_pop(stk_); - if (x) { - nbd_defer_free(x); - } - } - rcu_update(); - } - - return NULL; -} - -int main (int argc, char **argv) { - nbd_init(); - //lwt_set_trace_level("m0r0"); - - int num_threads = 2; - if (argc == 2) - { - errno = 0; - num_threads = strtol(argv[1], NULL, 10); - if (errno) { - fprintf(stderr, "%s: Invalid argument for number of threads\n", argv[0]); - return -1; - } - if (num_threads <= 0) { - fprintf(stderr, "%s: Number of threads must be at least 1\n", argv[0]); - return -1; - } - } - - stk_ = lifo_alloc(); - wait_ = num_threads; - - pthread_t thread[num_threads]; - for (int i = 0; i < num_threads; ++i) { - int rc = nbd_thread_create(thread + i, i, worker, (void *)(size_t)i); - if (rc != 0) { perror("pthread_create"); return rc; } - } - for (int i = 0; i < num_threads; ++i) { - pthread_join(thread[i], NULL); - } - - return 0; -} -#endif//rcu_test