X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=urcu.c;h=1a276ce33663439b7cb128e1ab6bea147faec1ed;hb=2bc59bd7ce26378150512280b67599f9004732a5;hp=e401d8dc75d34bf04d2e62da56df3cc08f0d470d;hpb=87bd15cdb3e77c3d0a616c57ae3876ddea48a54f;p=urcu.git diff --git a/urcu.c b/urcu.c index e401d8d..1a276ce 100644 --- a/urcu.c +++ b/urcu.c @@ -113,13 +113,35 @@ void wait_for_quiescent_state(int parity) force_mb_all_threads(); } +static void switch_qparity(void) +{ + int prev_parity; + + /* All threads should read qparity before accessing data structure. */ + /* Write ptr before changing the qparity */ + force_mb_all_threads(); + prev_parity = switch_next_urcu_qparity(); + + /* + * Wait for previous parity to be empty of readers. + */ + wait_for_quiescent_state(prev_parity); +} + +void synchronize_rcu(void) +{ + rcu_write_lock(); + switch_qparity(); + switch_qparity(); + rcu_write_unlock(); +} + /* * Return old pointer, OK to free, no more reference exist. * Called under rcu_write_lock. */ void *urcu_publish_content(void **ptr, void *new) { - int prev_parity; void *oldptr; /* @@ -134,19 +156,10 @@ void *urcu_publish_content(void **ptr, void *new) */ oldptr = *ptr; *ptr = new; - /* All threads should read qparity before ptr */ - /* Write ptr before changing the qparity */ - force_mb_all_threads(); - prev_parity = switch_next_urcu_qparity(); - /* - * Wait for previous parity to be empty of readers. - */ - wait_for_quiescent_state(prev_parity); - /* - * Deleting old data is ok ! - */ - + switch_qparity(); + switch_qparity(); + return oldptr; }