X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=doc%2Fexamples%2Furcu-flavors%2Fmb.c;h=62ad54bb7ff00309f7de7572116de1222bd8b7ee;hb=2fec8f05f010408e989356e6f9d8c1e191ba4dfa;hp=24daaef75c5735580457476408a1e3424478b3a4;hpb=944504819e236e0d1b59599c4dfbde44a7ced226;p=urcu.git diff --git a/doc/examples/urcu-flavors/mb.c b/doc/examples/urcu-flavors/mb.c index 24daaef..62ad54b 100644 --- a/doc/examples/urcu-flavors/mb.c +++ b/doc/examples/urcu-flavors/mb.c @@ -108,9 +108,24 @@ int main(int argc, char **argv) */ cds_list_for_each_entry_safe(node, n, &mylist, node) { cds_list_del_rcu(&node->node); + /* + * call_rcu() will ensure that the handler + * "rcu_free_node" is executed after a grace period. + * call_rcu() can be called from RCU read-side critical + * sections. + */ call_rcu(&node->rcu_head, rcu_free_node); } + /* + * We can also wait for a quiescent state by calling + * synchronize_rcu() rather than using call_rcu(). It is usually + * a slower approach than call_rcu(), because the latter can + * batch work. Moreover, call_rcu() can be called from a RCU + * read-side critical section, but synchronize_rcu() should not. + */ + synchronize_rcu(); + sleep(1); /*