Author: Remi Meier Branch: c7-refactor Changeset: r866:22f8313b374c Date: 2014-02-26 13:40 +0100 http://bitbucket.org/pypy/stmgc/changeset/22f8313b374c/
Log: move shadow stack init/done to setup.c diff --git a/c7/demo/demo2.c b/c7/demo/demo2.c --- a/c7/demo/demo2.c +++ b/c7/demo/demo2.c @@ -21,24 +21,6 @@ __thread stm_thread_local_t stm_thread_local; -#define PUSH_ROOT(p) (*stm_thread_local.shadowstack++ = (object_t *)(p)) -#define POP_ROOT(p) ((p) = (typeof(p))*--stm_thread_local.shadowstack) - -void init_shadow_stack(void) -{ - object_t **s = (object_t **)malloc(1000 * sizeof(object_t *)); - assert(s); - stm_thread_local.shadowstack = s; - stm_thread_local.shadowstack_base = s; -} - -void done_shadow_stack(void) -{ - free(stm_thread_local.shadowstack_base); - stm_thread_local.shadowstack = NULL; - stm_thread_local.shadowstack_base = NULL; -} - ssize_t stmcb_size_rounded_up(struct object_s *ob) { @@ -157,14 +139,14 @@ global_chained_list->value = -1; global_chained_list->next = NULL; - PUSH_ROOT(global_chained_list); + STM_PUSH_ROOT(stm_thread_local, global_chained_list); w_prev = global_chained_list; for (i = 0; i < LIST_LENGTH; i++) { - PUSH_ROOT(w_prev); + STM_PUSH_ROOT(stm_thread_local, w_prev); w_newnode = (nodeptr_t)stm_allocate(sizeof(struct node_s)); - POP_ROOT(w_prev); + STM_POP_ROOT(stm_thread_local, w_prev); w_newnode->value = LIST_LENGTH - i; w_newnode->next = NULL; @@ -173,16 +155,16 @@ w_prev = w_newnode; } - POP_ROOT(global_chained_list); /* update value */ + STM_POP_ROOT(stm_thread_local, global_chained_list); /* update value */ assert(global_chained_list->value == -1); - PUSH_ROOT(global_chained_list); + STM_PUSH_ROOT(stm_thread_local, global_chained_list); stm_commit_transaction(); stm_start_inevitable_transaction(&stm_thread_local); - POP_ROOT(global_chained_list); /* update value */ + STM_POP_ROOT(stm_thread_local, global_chained_list); /* update value */ assert(global_chained_list->value == -1); - PUSH_ROOT(global_chained_list); /* remains forever in the shadow stack */ + STM_PUSH_ROOT(stm_thread_local, global_chained_list); /* remains forever in the shadow stack */ stm_commit_transaction(); printf("setup ok\n"); @@ -196,16 +178,16 @@ { int status; stm_register_thread_local(&stm_thread_local); - init_shadow_stack(); - PUSH_ROOT(global_chained_list); /* remains forever in the shadow stack */ + + STM_PUSH_ROOT(stm_thread_local, global_chained_list); /* remains forever in the shadow stack */ while (check_sorted() == -1) { bubble_run(); } - POP_ROOT(global_chained_list); + STM_POP_ROOT(stm_thread_local, global_chained_list); assert(stm_thread_local.shadowstack == stm_thread_local.shadowstack_base); - done_shadow_stack(); + stm_unregister_thread_local(&stm_thread_local); status = sem_post(&done); assert(status == 0); return NULL; @@ -216,9 +198,9 @@ long sum; printf("final check\n"); - + sum = check_sorted(); - + // little Gauss: if (sum == (1 + LIST_LENGTH) * (LIST_LENGTH / 2)) printf("check ok\n"); @@ -247,7 +229,7 @@ stm_setup(); stm_register_thread_local(&stm_thread_local); - init_shadow_stack(); + setup_list(); @@ -259,7 +241,7 @@ final_check(); - done_shadow_stack(); + stm_unregister_thread_local(&stm_thread_local); stm_teardown(); diff --git a/c7/demo/demo_random.c b/c7/demo/demo_random.c --- a/c7/demo/demo_random.c +++ b/c7/demo/demo_random.c @@ -44,25 +44,6 @@ __thread struct thread_data td; -#define PUSH_ROOT(p) (*(stm_thread_local.shadowstack++) = (object_t *)(p)) -#define POP_ROOT(p) ((p) = (typeof(p))*(--stm_thread_local.shadowstack)) - -void init_shadow_stack(void) -{ - object_t **s = (object_t **)malloc(1000 * sizeof(object_t *)); - assert(s); - stm_thread_local.shadowstack = s; - stm_thread_local.shadowstack_base = s; -} - -void done_shadow_stack(void) -{ - free(stm_thread_local.shadowstack_base); - stm_thread_local.shadowstack = NULL; - stm_thread_local.shadowstack_base = NULL; -} - - ssize_t stmcb_size_rounded_up(struct object_s *ob) { return ((struct node_s*)ob)->my_size; @@ -89,7 +70,7 @@ { int i; for (i = 0; i < SHARED_ROOTS; i++) { - PUSH_ROOT(shared_roots[i]); + STM_PUSH_ROOT(stm_thread_local, shared_roots[i]); } } @@ -97,7 +78,7 @@ { int i; for (i = 0; i < SHARED_ROOTS; i++) { - POP_ROOT(shared_roots[SHARED_ROOTS - i - 1]); + STM_POP_ROOT(stm_thread_local, shared_roots[SHARED_ROOTS - i - 1]); } } @@ -127,12 +108,12 @@ assert(td.num_roots == td.num_roots_at_transaction_start); for (i = td.num_roots_at_transaction_start - 1; i >= 0; i--) { if (td.roots[i]) - POP_ROOT(td.roots[i]); + STM_POP_ROOT(stm_thread_local, td.roots[i]); } for (i = 0; i < td.num_roots_at_transaction_start; i++) { if (td.roots[i]) - PUSH_ROOT(td.roots[i]); + STM_PUSH_ROOT(stm_thread_local, td.roots[i]); } } @@ -141,7 +122,7 @@ int i; for (i = td.num_roots_at_transaction_start; i < td.num_roots; i++) { if (td.roots[i]) - PUSH_ROOT(td.roots[i]); + STM_PUSH_ROOT(stm_thread_local, td.roots[i]); } } @@ -150,7 +131,7 @@ int i; for (i = td.num_roots - 1; i >= td.num_roots_at_transaction_start; i--) { if (td.roots[i]) - POP_ROOT(td.roots[i]); + STM_POP_ROOT(stm_thread_local, td.roots[i]); } } @@ -304,7 +285,6 @@ { int status; stm_register_thread_local(&stm_thread_local); - init_shadow_stack(); /* forever on the shadowstack: */ _push_shared_roots(); @@ -342,7 +322,6 @@ } stm_commit_transaction(); - done_shadow_stack(); stm_unregister_thread_local(&stm_thread_local); status = sem_post(&done); assert(status == 0); @@ -368,7 +347,7 @@ for (i = 0; i < SHARED_ROOTS; i++) { shared_roots[i] = stm_allocate(sizeof(struct node_s)); ((nodeptr_t)shared_roots[i])->my_size = sizeof(struct node_s); - PUSH_ROOT(shared_roots[i]); + STM_PUSH_ROOT(stm_thread_local, shared_roots[i]); } stm_commit_transaction(); @@ -398,7 +377,6 @@ stm_setup(); stm_register_thread_local(&stm_thread_local); - init_shadow_stack(); setup_globals(); @@ -421,7 +399,6 @@ printf("Test OK!\n"); _pop_shared_roots(); - done_shadow_stack(); stm_unregister_thread_local(&stm_thread_local); stm_teardown(); diff --git a/c7/stm/core.h b/c7/stm/core.h --- a/c7/stm/core.h +++ b/c7/stm/core.h @@ -29,6 +29,7 @@ #define WRITELOCK_START ((END_NURSERY_PAGE * 4096UL) >> 4) #define WRITELOCK_END READMARKER_END +#define SHADOW_STACK_SIZE 1000 enum /* stm_flags */ { /* This flag is set on non-nursery objects. It forces stm_write() diff --git a/c7/stm/setup.c b/c7/stm/setup.c --- a/c7/stm/setup.c +++ b/c7/stm/setup.c @@ -103,6 +103,22 @@ teardown_nursery(); } +void _init_shadow_stack(stm_thread_local_t *tl) +{ + object_t **s = (object_t **)malloc(SHADOW_STACK_SIZE * sizeof(object_t *)); + assert(s); + tl->shadowstack = s; + tl->shadowstack_base = s; +} + +void _done_shadow_stack(stm_thread_local_t *tl) +{ + free(tl->shadowstack_base); + tl->shadowstack = NULL; + tl->shadowstack_base = NULL; +} + + void stm_register_thread_local(stm_thread_local_t *tl) { int num; @@ -123,12 +139,14 @@ numbers automatically. */ num = num % NB_SEGMENTS; tl->associated_segment_num = num; + _init_shadow_stack(tl); set_gs_register(get_segment_base(num)); } void stm_unregister_thread_local(stm_thread_local_t *tl) { assert(tl->next != NULL); + _done_shadow_stack(tl); if (tl == stm_all_thread_locals) { stm_all_thread_locals = stm_all_thread_locals->next; if (tl == stm_all_thread_locals) { diff --git a/c7/stmgc.h b/c7/stmgc.h --- a/c7/stmgc.h +++ b/c7/stmgc.h @@ -191,6 +191,12 @@ void stm_setup(void); void stm_teardown(void); +/* Push and pop roots from/to the shadow stack. Only allowed inside + transaction. */ +#define STM_PUSH_ROOT(tl, p) (*((tl).shadowstack++) = (object_t *)(p)) +#define STM_POP_ROOT(tl, p) ((p) = (typeof(p))*(--(tl).shadowstack)) + + /* Every thread needs to have a corresponding stm_thread_local_t structure. It may be a "__thread" global variable or something else. Use the following functions at the start and at the end of a thread. _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit