X-Git-Url: https://git.lttng.org/?p=urcu.git;a=blobdiff_plain;f=doc%2Fexamples%2Furcu-flavors%2Fsignal.c;h=136c3801f887e132e6da32df32be9eac4926b5e7;hp=53bb57f9b6780bbeea2d8e584d5905ba86137636;hb=d7818a6fd0c57b576f3bacc67ddd62bc8a78fb05;hpb=1fe327be722848898523c6f335c52ee3d5fe2b4e diff --git a/doc/examples/urcu-flavors/signal.c b/doc/examples/urcu-flavors/signal.c index 53bb57f..136c380 100644 --- a/doc/examples/urcu-flavors/signal.c +++ b/doc/examples/urcu-flavors/signal.c @@ -107,9 +107,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); /*