diff --git a/.gitignore b/.gitignore index 3d53783..ee0d0ca 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ build/Makefile *.a *.so *.dSYM +.*.sw[op] regressions/ck_cohort/benchmark/ck_cohort.LATENCY regressions/ck_cohort/benchmark/ck_cohort.THROUGHPUT regressions/ck_pflock/benchmark/latency @@ -142,6 +143,8 @@ regressions/ck_queue/validate/ck_slist regressions/ck_cohort/validate/validate regressions/ck_cohort/benchmark/ck_cohort.LATENCY regressions/ck_cohort/benchmark/ck_cohort.THROUGHPUT -regressions/ck_rw_cohort/validate/validate +regressions/ck_rw_cohort/validate/ck_neutral +regressions/ck_rw_cohort/validate/ck_rp +regressions/ck_rw_cohort/validate/ck_wp regressions/ck_rw_cohort/benchmark/latency regressions/ck_rw_cohort/benchmark/throughput diff --git a/include/ck_rw_cohort.h b/include/ck_rw_cohort.h index bb2b771..dfcb138 100644 --- a/include/ck_rw_cohort.h +++ b/include/ck_rw_cohort.h @@ -39,24 +39,24 @@ #include #include -#define CK_RW_COHORT_NAME(N) ck_rw_cohort_##N -#define CK_RW_COHORT_INSTANCE(N) struct CK_RW_COHORT_NAME(N) -#define CK_RW_COHORT_INIT(N, RW, WL) ck_rw_cohort_##N##_init(RW, WL) -#define CK_RW_COHORT_READ_LOCK(N, RW, C, GC, LC) ck_rw_cohort_##N##_read_lock(RW, C, GC, LC) -#define CK_RW_COHORT_READ_UNLOCK(N, RW) ck_rw_cohort_##N##_read_unlock(RW) -#define CK_RW_COHORT_WRITE_LOCK(N, RW, C, GC, LC) ck_rw_cohort_##N##_write_lock(RW, C, GC, LC) -#define CK_RW_COHORT_WRITE_UNLOCK(N, RW, C, GC, LC) ck_rw_cohort_##N##_write_unlock(RW, C, GC, LC) -#define CK_RW_COHORT_DEFAULT_WAIT_LIMIT 1000 +#define CK_RW_COHORT_WP_NAME(N) ck_rw_cohort_wp_##N +#define CK_RW_COHORT_WP_INSTANCE(N) struct CK_RW_COHORT_WP_NAME(N) +#define CK_RW_COHORT_WP_INIT(N, RW, WL) ck_rw_cohort_wp_##N##_init(RW, WL) +#define CK_RW_COHORT_WP_READ_LOCK(N, RW, C, GC, LC) ck_rw_cohort_wp_##N##_read_lock(RW, C, GC, LC) +#define CK_RW_COHORT_WP_READ_UNLOCK(N, RW, C, GC, LC) ck_rw_cohort_wp_##N##_read_unlock(RW) +#define CK_RW_COHORT_WP_WRITE_LOCK(N, RW, C, GC, LC) ck_rw_cohort_wp_##N##_write_lock(RW, C, GC, LC) +#define CK_RW_COHORT_WP_WRITE_UNLOCK(N, RW, C, GC, LC) ck_rw_cohort_wp_##N##_write_unlock(RW, C, GC, LC) +#define CK_RW_COHORT_WP_DEFAULT_WAIT_LIMIT 1000 -#define CK_RW_COHORT_PROTOTYPE(N) \ - CK_RW_COHORT_INSTANCE(N) { \ +#define CK_RW_COHORT_WP_PROTOTYPE(N) \ + CK_RW_COHORT_WP_INSTANCE(N) { \ unsigned int read_counter; \ unsigned int write_barrier; \ unsigned int wait_limit; \ }; \ \ CK_CC_INLINE static void \ - ck_rw_cohort_##N##_init(CK_RW_COHORT_INSTANCE(N) *rw_cohort, \ + ck_rw_cohort_wp_##N##_init(CK_RW_COHORT_WP_INSTANCE(N) *rw_cohort, \ unsigned int wait_limit) \ { \ rw_cohort->read_counter = 0; \ @@ -67,7 +67,7 @@ } \ \ CK_CC_INLINE static void \ - ck_rw_cohort_##N##_write_lock(CK_RW_COHORT_INSTANCE(N) *rw_cohort, \ + ck_rw_cohort_wp_##N##_write_lock(CK_RW_COHORT_WP_INSTANCE(N) *rw_cohort, \ CK_COHORT_INSTANCE(N) *cohort, void *global_context, \ void *local_context) \ { \ @@ -85,7 +85,7 @@ } \ \ CK_CC_INLINE static void \ - ck_rw_cohort_##N##_write_unlock(CK_RW_COHORT_INSTANCE(N) *rw_cohort, \ + ck_rw_cohort_wp_##N##_write_unlock(CK_RW_COHORT_WP_INSTANCE(N) *rw_cohort, \ CK_COHORT_INSTANCE(N) *cohort, void *global_context, \ void *local_context) \ { \ @@ -94,7 +94,7 @@ } \ \ CK_CC_INLINE static void \ - ck_rw_cohort_##N##_read_lock(CK_RW_COHORT_INSTANCE(N) *rw_cohort, \ + ck_rw_cohort_wp_##N##_read_lock(CK_RW_COHORT_WP_INSTANCE(N) *rw_cohort, \ CK_COHORT_INSTANCE(N) *cohort, void *global_context, \ void *local_context) \ { \ @@ -125,15 +125,112 @@ } \ \ CK_CC_INLINE static void \ - ck_rw_cohort_##N##_read_unlock(CK_RW_COHORT_INSTANCE(N) *cohort) \ + ck_rw_cohort_wp_##N##_read_unlock(CK_RW_COHORT_WP_INSTANCE(N) *cohort) \ { \ ck_pr_dec_uint(&cohort->read_counter); \ } -#define CK_RW_COHORT_INITIALIZER { \ +#define CK_RW_COHORT_WP_INITIALIZER { \ .read_counter = 0, \ .write_barrier = 0, \ .wait_limit = 0 \ } + +#define CK_RW_COHORT_RP_NAME(N) ck_rw_cohort_rp_##N +#define CK_RW_COHORT_RP_INSTANCE(N) struct CK_RW_COHORT_RP_NAME(N) +#define CK_RW_COHORT_RP_INIT(N, RW, WL) ck_rw_cohort_rp_##N##_init(RW, WL) +#define CK_RW_COHORT_RP_READ_LOCK(N, RW, C, GC, LC) ck_rw_cohort_rp_##N##_read_lock(RW, C, GC, LC) +#define CK_RW_COHORT_RP_READ_UNLOCK(N, RW, C, GC, LC) ck_rw_cohort_rp_##N##_read_unlock(RW) +#define CK_RW_COHORT_RP_WRITE_LOCK(N, RW, C, GC, LC) ck_rw_cohort_rp_##N##_write_lock(RW, C, GC, LC) +#define CK_RW_COHORT_RP_WRITE_UNLOCK(N, RW, C, GC, LC) ck_rw_cohort_rp_##N##_write_unlock(RW, C, GC, LC) +#define CK_RW_COHORT_RP_DEFAULT_WAIT_LIMIT 1000 + +#define CK_RW_COHORT_RP_PROTOTYPE(N) \ + CK_RW_COHORT_RP_INSTANCE(N) { \ + unsigned int read_counter; \ + unsigned int read_barrier; \ + unsigned int wait_limit; \ + }; \ + \ + CK_CC_INLINE static void \ + ck_rw_cohort_rp_##N##_init(CK_RW_COHORT_RP_INSTANCE(N) *rw_cohort, \ + unsigned int wait_limit) \ + { \ + rw_cohort->read_counter = 0; \ + rw_cohort->read_barrier = 0; \ + rw_cohort->wait_limit = wait_limit; \ + ck_pr_barrier(); \ + return; \ + } \ + \ + CK_CC_INLINE static void \ + ck_rw_cohort_rp_##N##_write_lock(CK_RW_COHORT_RP_INSTANCE(N) *rw_cohort, \ + CK_COHORT_INSTANCE(N) *cohort, void *global_context, \ + void *local_context) \ + { \ + unsigned int wait_count = 0; \ + bool raised = false; \ + \ + while (true) { \ + CK_COHORT_LOCK(N, cohort, global_context, local_context); \ + if (ck_pr_load_uint(&rw_cohort->read_counter) == 0) { \ + break; \ + } else { \ + CK_COHORT_UNLOCK(N, cohort, global_context, local_context); \ + while (ck_pr_load_uint(&rw_cohort->read_counter) > 0) { \ + ck_pr_stall(); \ + if (++wait_count > rw_cohort->wait_limit && raised == false) {\ + ck_pr_inc_uint(&rw_cohort->read_barrier); \ + raised = true; \ + } \ + } \ + } \ + } \ + \ + if (raised == true) { \ + ck_pr_dec_uint(&rw_cohort->read_barrier); \ + } \ + \ + return; \ + } \ + \ + CK_CC_INLINE static void \ + ck_rw_cohort_rp_##N##_write_unlock(CK_RW_COHORT_RP_INSTANCE(N) *rw_cohort, \ + CK_COHORT_INSTANCE(N) *cohort, void *global_context, void *local_context) \ + { \ + (void)rw_cohort; \ + CK_COHORT_UNLOCK(N, cohort, global_context, local_context); \ + } \ + \ + CK_CC_INLINE static void \ + ck_rw_cohort_rp_##N##_read_lock(CK_RW_COHORT_RP_INSTANCE(N) *rw_cohort, \ + CK_COHORT_INSTANCE(N) *cohort, void *global_context, \ + void *local_context) \ + { \ + while (ck_pr_load_uint(&rw_cohort->read_barrier) > 0) { \ + ck_pr_stall(); \ + } \ + ck_pr_inc_uint(&rw_cohort->read_counter); \ + \ + while (CK_COHORT_LOCKED(N, cohort, global_context, local_context) == true) { \ + ck_pr_stall(); \ + } \ + \ + return; \ + } \ + \ + \ + CK_CC_INLINE static void \ + ck_rw_cohort_rp_##N##_read_unlock(CK_RW_COHORT_RP_INSTANCE(N) *cohort) \ + { \ + ck_pr_dec_uint(&cohort->read_counter); \ + } + +#define CK_RW_COHORT_RP_INITIALIZER { \ + .read_counter = 0, \ + .read_barrier = 0, \ + .wait_limit = 0 \ +} + #endif /* _CK_RW_COHORT_H */ diff --git a/regressions/ck_rw_cohort/benchmark/latency.c b/regressions/ck_rw_cohort/benchmark/latency.c index d27fd41..f05ee2e 100644 --- a/regressions/ck_rw_cohort/benchmark/latency.c +++ b/regressions/ck_rw_cohort/benchmark/latency.c @@ -60,7 +60,7 @@ ck_spinlock_fas_locked_with_context(ck_spinlock_fas_t *lock, void *context) CK_COHORT_PROTOTYPE(fas_fas, ck_spinlock_fas_lock_with_context, ck_spinlock_fas_unlock_with_context, ck_spinlock_fas_locked_with_context, ck_spinlock_fas_lock_with_context, ck_spinlock_fas_unlock_with_context, ck_spinlock_fas_locked_with_context) -CK_RW_COHORT_PROTOTYPE(fas_fas) +CK_RW_COHORT_WP_PROTOTYPE(fas_fas) int main(void) @@ -69,34 +69,34 @@ main(void) ck_spinlock_fas_t global_lock = CK_SPINLOCK_FAS_INITIALIZER; ck_spinlock_fas_t local_lock = CK_SPINLOCK_FAS_INITIALIZER; CK_COHORT_INSTANCE(fas_fas) cohort = CK_COHORT_INITIALIZER; - CK_RW_COHORT_INSTANCE(fas_fas) rw_cohort = CK_RW_COHORT_INITIALIZER; + CK_RW_COHORT_WP_INSTANCE(fas_fas) rw_cohort = CK_RW_COHORT_WP_INITIALIZER; CK_COHORT_INIT(fas_fas, &cohort, &global_lock, &local_lock, CK_COHORT_DEFAULT_LOCAL_PASS_LIMIT); - CK_RW_COHORT_INIT(fas_fas, &rw_cohort, CK_RW_COHORT_DEFAULT_WAIT_LIMIT); + CK_RW_COHORT_WP_INIT(fas_fas, &rw_cohort, CK_RW_COHORT_WP_DEFAULT_WAIT_LIMIT); for (i = 0; i < STEPS; i++) { - CK_RW_COHORT_WRITE_LOCK(fas_fas, &rw_cohort, &cohort, NULL, NULL); - CK_RW_COHORT_WRITE_UNLOCK(fas_fas, &rw_cohort, &cohort, NULL, NULL); + CK_RW_COHORT_WP_WRITE_LOCK(fas_fas, &rw_cohort, &cohort, NULL, NULL); + CK_RW_COHORT_WP_WRITE_UNLOCK(fas_fas, &rw_cohort, &cohort, NULL, NULL); } s_b = rdtsc(); for (i = 0; i < STEPS; i++) { - CK_RW_COHORT_WRITE_LOCK(fas_fas, &rw_cohort, &cohort, NULL, NULL); - CK_RW_COHORT_WRITE_UNLOCK(fas_fas, &rw_cohort, &cohort, NULL, NULL); + CK_RW_COHORT_WP_WRITE_LOCK(fas_fas, &rw_cohort, &cohort, NULL, NULL); + CK_RW_COHORT_WP_WRITE_UNLOCK(fas_fas, &rw_cohort, &cohort, NULL, NULL); } e_b = rdtsc(); printf("WRITE: rwlock %15" PRIu64 "\n", (e_b - s_b) / STEPS); for (i = 0; i < STEPS; i++) { - CK_RW_COHORT_READ_LOCK(fas_fas, &rw_cohort, &cohort, NULL, NULL); - CK_RW_COHORT_READ_UNLOCK(fas_fas, &rw_cohort); + CK_RW_COHORT_WP_READ_LOCK(fas_fas, &rw_cohort, &cohort, NULL, NULL); + CK_RW_COHORT_WP_READ_UNLOCK(fas_fas, &rw_cohort); } s_b = rdtsc(); for (i = 0; i < STEPS; i++) { - CK_RW_COHORT_READ_LOCK(fas_fas, &rw_cohort, &cohort, NULL, NULL); - CK_RW_COHORT_READ_UNLOCK(fas_fas, &rw_cohort); + CK_RW_COHORT_WP_READ_LOCK(fas_fas, &rw_cohort, &cohort, NULL, NULL); + CK_RW_COHORT_WP_READ_UNLOCK(fas_fas, &rw_cohort); } e_b = rdtsc(); printf("READ: rwlock %15" PRIu64 "\n", (e_b - s_b) / STEPS); diff --git a/regressions/ck_rw_cohort/benchmark/throughput.c b/regressions/ck_rw_cohort/benchmark/throughput.c index 8a0c519..b629c73 100644 --- a/regressions/ck_rw_cohort/benchmark/throughput.c +++ b/regressions/ck_rw_cohort/benchmark/throughput.c @@ -78,7 +78,7 @@ ck_spinlock_fas_locked_with_context(ck_spinlock_fas_t *lock, void *context) CK_COHORT_PROTOTYPE(fas_fas, ck_spinlock_fas_lock_with_context, ck_spinlock_fas_unlock_with_context, ck_spinlock_fas_locked_with_context, ck_spinlock_fas_lock_with_context, ck_spinlock_fas_unlock_with_context, ck_spinlock_fas_locked_with_context) -CK_RW_COHORT_PROTOTYPE(fas_fas) +CK_RW_COHORT_WP_PROTOTYPE(fas_fas) struct cohort_record { CK_COHORT_INSTANCE(fas_fas) cohort; @@ -86,7 +86,7 @@ struct cohort_record { static struct cohort_record *cohorts; static ck_spinlock_t global_lock = CK_SPINLOCK_INITIALIZER; -static CK_RW_COHORT_INSTANCE(fas_fas) rw_cohort = CK_RW_COHORT_INITIALIZER; +static CK_RW_COHORT_WP_INSTANCE(fas_fas) rw_cohort = CK_RW_COHORT_WP_INITIALIZER; static unsigned int n_cohorts; struct block { @@ -114,38 +114,38 @@ thread_rwlock(void *pun) for (i = 1, a = 0;; i++) { s_b = rdtsc(); - CK_RW_COHORT_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); - CK_RW_COHORT_READ_UNLOCK(fas_fas, &rw_cohort); - CK_RW_COHORT_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); - CK_RW_COHORT_READ_UNLOCK(fas_fas, &rw_cohort); - CK_RW_COHORT_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); - CK_RW_COHORT_READ_UNLOCK(fas_fas, &rw_cohort); - CK_RW_COHORT_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); - CK_RW_COHORT_READ_UNLOCK(fas_fas, &rw_cohort); - CK_RW_COHORT_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); - CK_RW_COHORT_READ_UNLOCK(fas_fas, &rw_cohort); - CK_RW_COHORT_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); - CK_RW_COHORT_READ_UNLOCK(fas_fas, &rw_cohort); - CK_RW_COHORT_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); - CK_RW_COHORT_READ_UNLOCK(fas_fas, &rw_cohort); - CK_RW_COHORT_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); - CK_RW_COHORT_READ_UNLOCK(fas_fas, &rw_cohort); - CK_RW_COHORT_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); - CK_RW_COHORT_READ_UNLOCK(fas_fas, &rw_cohort); - CK_RW_COHORT_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); - CK_RW_COHORT_READ_UNLOCK(fas_fas, &rw_cohort); - CK_RW_COHORT_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); - CK_RW_COHORT_READ_UNLOCK(fas_fas, &rw_cohort); - CK_RW_COHORT_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); - CK_RW_COHORT_READ_UNLOCK(fas_fas, &rw_cohort); - CK_RW_COHORT_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); - CK_RW_COHORT_READ_UNLOCK(fas_fas, &rw_cohort); - CK_RW_COHORT_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); - CK_RW_COHORT_READ_UNLOCK(fas_fas, &rw_cohort); - CK_RW_COHORT_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); - CK_RW_COHORT_READ_UNLOCK(fas_fas, &rw_cohort); - CK_RW_COHORT_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); - CK_RW_COHORT_READ_UNLOCK(fas_fas, &rw_cohort); + CK_RW_COHORT_WP_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); + CK_RW_COHORT_WP_READ_UNLOCK(fas_fas, &rw_cohort); + CK_RW_COHORT_WP_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); + CK_RW_COHORT_WP_READ_UNLOCK(fas_fas, &rw_cohort); + CK_RW_COHORT_WP_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); + CK_RW_COHORT_WP_READ_UNLOCK(fas_fas, &rw_cohort); + CK_RW_COHORT_WP_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); + CK_RW_COHORT_WP_READ_UNLOCK(fas_fas, &rw_cohort); + CK_RW_COHORT_WP_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); + CK_RW_COHORT_WP_READ_UNLOCK(fas_fas, &rw_cohort); + CK_RW_COHORT_WP_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); + CK_RW_COHORT_WP_READ_UNLOCK(fas_fas, &rw_cohort); + CK_RW_COHORT_WP_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); + CK_RW_COHORT_WP_READ_UNLOCK(fas_fas, &rw_cohort); + CK_RW_COHORT_WP_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); + CK_RW_COHORT_WP_READ_UNLOCK(fas_fas, &rw_cohort); + CK_RW_COHORT_WP_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); + CK_RW_COHORT_WP_READ_UNLOCK(fas_fas, &rw_cohort); + CK_RW_COHORT_WP_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); + CK_RW_COHORT_WP_READ_UNLOCK(fas_fas, &rw_cohort); + CK_RW_COHORT_WP_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); + CK_RW_COHORT_WP_READ_UNLOCK(fas_fas, &rw_cohort); + CK_RW_COHORT_WP_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); + CK_RW_COHORT_WP_READ_UNLOCK(fas_fas, &rw_cohort); + CK_RW_COHORT_WP_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); + CK_RW_COHORT_WP_READ_UNLOCK(fas_fas, &rw_cohort); + CK_RW_COHORT_WP_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); + CK_RW_COHORT_WP_READ_UNLOCK(fas_fas, &rw_cohort); + CK_RW_COHORT_WP_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); + CK_RW_COHORT_WP_READ_UNLOCK(fas_fas, &rw_cohort); + CK_RW_COHORT_WP_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); + CK_RW_COHORT_WP_READ_UNLOCK(fas_fas, &rw_cohort); e_b = rdtsc(); a += (e_b - s_b) >> 4; diff --git a/regressions/ck_rw_cohort/ck_neutral.h b/regressions/ck_rw_cohort/ck_neutral.h new file mode 100644 index 0000000..2d29c73 --- /dev/null +++ b/regressions/ck_rw_cohort/ck_neutral.h @@ -0,0 +1,7 @@ +#define LOCK_PROTOTYPE CK_RW_COHORT_NEUTRAL_PROTOTYPE +#define LOCK_INSTANCE CK_RW_COHORT_NEUTRAL_INSTANCE +#define LOCK_INITIALIZER CK_RW_COHORT_NEUTRAL_INITIALIZER +#define READ_LOCK CK_RW_COHORT_NEUTRAL_READ_LOCK +#define WRITE_LOCK CK_RW_COHORT_NEUTRAL_WRITE_LOCK +#define READ_UNLOCK CK_RW_COHORT_NEUTRAL_READ_UNLOCK +#define WRITE_UNLOCK CK_RW_COHORT_NEUTRAL_WRITE_UNLOCK diff --git a/regressions/ck_rw_cohort/ck_rp.h b/regressions/ck_rw_cohort/ck_rp.h new file mode 100644 index 0000000..d4b7d4e --- /dev/null +++ b/regressions/ck_rw_cohort/ck_rp.h @@ -0,0 +1,7 @@ +#define LOCK_PROTOTYPE CK_RW_COHORT_RP_PROTOTYPE +#define LOCK_INSTANCE CK_RW_COHORT_RP_INSTANCE +#define LOCK_INITIALIZER CK_RW_COHORT_RP_INITIALIZER +#define READ_LOCK CK_RW_COHORT_RP_READ_LOCK +#define READ_UNLOCK CK_RW_COHORT_RP_READ_UNLOCK +#define WRITE_LOCK CK_RW_COHORT_RP_WRITE_LOCK +#define WRITE_UNLOCK CK_RW_COHORT_RP_WRITE_UNLOCK diff --git a/regressions/ck_rw_cohort/ck_wp.h b/regressions/ck_rw_cohort/ck_wp.h new file mode 100644 index 0000000..bb9b6b2 --- /dev/null +++ b/regressions/ck_rw_cohort/ck_wp.h @@ -0,0 +1,17 @@ +#define LOCK_PROTOTYPE CK_RW_COHORT_WP_PROTOTYPE +#define LOCK_INSTANCE CK_RW_COHORT_WP_INSTANCE +#define LOCK_INITIALIZER CK_RW_COHORT_WP_INITIALIZER +#define READ_LOCK CK_RW_COHORT_WP_READ_LOCK +#define WRITE_LOCK CK_RW_COHORT_WP_WRITE_LOCK +#define READ_UNLOCK CK_RW_COHORT_WP_READ_UNLOCK +#define WRITE_UNLOCK CK_RW_COHORT_WP_WRITE_UNLOCK +/* +#define WRITE_LOCK(N, RW, C, GC, LC)\ + CK_RW_COHORT_WP_WRITE_LOCK(N, RW, C, GC, LC) + +#define WRITE_UNLOCK(N, RW, C, GC, LC)\ + CK_RW_COHORT_WP_WRITE_UNLOCK(N, RW, C, GC, LC); + +#define READ_LOCK(N, RW, C, GC, LC)\ + CK_RW_COHORT_WP_READ_LOCK(N, RW) +*/ \ No newline at end of file diff --git a/regressions/ck_rw_cohort/validate/Makefile b/regressions/ck_rw_cohort/validate/Makefile index e2552be..7214c60 100644 --- a/regressions/ck_rw_cohort/validate/Makefile +++ b/regressions/ck_rw_cohort/validate/Makefile @@ -1,11 +1,18 @@ .PHONY: check clean distribution -OBJECTS=validate +#OBJECTS=ck_neutral ck_rp ck_wp +OBJECTS=ck_rp ck_wp all: $(OBJECTS) -validate: validate.c ../../../include/ck_rw_cohort.h - $(CC) $(CFLAGS) -o validate validate.c -g +ck_neutral: ck_neutral.c ../../../include/ck_rw_cohort.h + $(CC) $(CFLAGS) -o ck_neutral ck_neutral.c -g + +ck_rp: ck_rp.c ../../../include/ck_rw_cohort.h + $(CC) $(CFLAGS) -o ck_rp ck_rp.c -g + +ck_wp: ck_wp.c ../../../include/ck_rw_cohort.h + $(CC) $(CFLAGS) -o ck_wp ck_wp.c -g check: all ./validate $(CORES) 1 diff --git a/regressions/ck_rw_cohort/validate/ck_neutral.c b/regressions/ck_rw_cohort/validate/ck_neutral.c new file mode 100644 index 0000000..7884dc5 --- /dev/null +++ b/regressions/ck_rw_cohort/validate/ck_neutral.c @@ -0,0 +1,2 @@ +#include "../ck_neutral.h" +#include "validate.h" diff --git a/regressions/ck_rw_cohort/validate/ck_rp.c b/regressions/ck_rw_cohort/validate/ck_rp.c new file mode 100644 index 0000000..d63e9d5 --- /dev/null +++ b/regressions/ck_rw_cohort/validate/ck_rp.c @@ -0,0 +1,2 @@ +#include "../ck_rp.h" +#include "validate.h" diff --git a/regressions/ck_rw_cohort/validate/ck_wp.c b/regressions/ck_rw_cohort/validate/ck_wp.c new file mode 100644 index 0000000..f89be35 --- /dev/null +++ b/regressions/ck_rw_cohort/validate/ck_wp.c @@ -0,0 +1,2 @@ +#include "../ck_wp.h" +#include "validate.h" diff --git a/regressions/ck_rw_cohort/validate/validate.c b/regressions/ck_rw_cohort/validate/validate.h similarity index 93% rename from regressions/ck_rw_cohort/validate/validate.c rename to regressions/ck_rw_cohort/validate/validate.h index 871dcd3..27c7283 100644 --- a/regressions/ck_rw_cohort/validate/validate.c +++ b/regressions/ck_rw_cohort/validate/validate.h @@ -46,6 +46,7 @@ #define ITERATE 1000000 #endif + static struct affinity a; static unsigned int locked; static int nthr; @@ -75,10 +76,10 @@ ck_spinlock_fas_locked_with_context(ck_spinlock_fas_t *lock, void *context) CK_COHORT_PROTOTYPE(fas_fas, ck_spinlock_fas_lock_with_context, ck_spinlock_fas_unlock_with_context, ck_spinlock_fas_locked_with_context, ck_spinlock_fas_lock_with_context, ck_spinlock_fas_unlock_with_context, ck_spinlock_fas_locked_with_context) -CK_RW_COHORT_PROTOTYPE(fas_fas) +LOCK_PROTOTYPE(fas_fas) static CK_COHORT_INSTANCE(fas_fas) *cohorts; -static CK_RW_COHORT_INSTANCE(fas_fas) rw_cohort = CK_RW_COHORT_INITIALIZER; +static LOCK_INSTANCE(fas_fas) rw_cohort = LOCK_INITIALIZER; static int n_cohorts; static void * @@ -97,7 +98,7 @@ thread(void *null CK_CC_UNUSED) cohort = cohorts + (core / (int)(a.delta)) % n_cohorts; while (i--) { - CK_RW_COHORT_WRITE_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); + WRITE_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); { l = ck_pr_load_uint(&locked); if (l != 0) { @@ -132,16 +133,16 @@ thread(void *null CK_CC_UNUSED) ck_error("ERROR [WR:%d]: %u != 0\n", __LINE__, l); } } - CK_RW_COHORT_WRITE_UNLOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); + WRITE_UNLOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); - CK_RW_COHORT_READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); + READ_LOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); { l = ck_pr_load_uint(&locked); if (l != 0) { ck_error("ERROR [RD:%d]: %u != 0\n", __LINE__, l); } } - CK_RW_COHORT_READ_UNLOCK(fas_fas, &rw_cohort); + READ_UNLOCK(fas_fas, &rw_cohort, cohort, NULL, NULL); } return (NULL);