----- On Mar 5, 2016, at 10:10 AM, Mathieu Desnoyers mathieu.desnoy...@efficios.com wrote:
> ----- On Mar 4, 2016, at 3:32 PM, Paul E. McKenney paul...@linux.vnet.ibm.com > wrote: > >> Hello! >> >> Still working with the C++ standards committee to add RCU to C++, and >> of course one step on that path is to make C++ programs build against >> liburcu. The following hack-patch makes this work by disabling C++ access >> to wfcqueue and by making C++ see the rcu_head ->next field as a void *. >> >> This supports prototyping, but what would be the real fix? Hi Paul, Of course you can remove the _LGPL_SOURCE define. It will work, but without inlining. I have two fixes that should make inlining work in C++, even when using wfcqueue.h. Those are currently in https://github.com/compudj/userspace-rcu-dev/tree/urcu-cpp (top 2 commits) Feedback is welcome, Thanks! Mathieu > > One fix would be: > > diff --git a/urcu/wfcqueue.h b/urcu/wfcqueue.h > index 83ec219..c0bb289 100644 > --- a/urcu/wfcqueue.h > +++ b/urcu/wfcqueue.h > @@ -43,7 +43,7 @@ extern "C" { > * McKenney. > */ > > -#define CDS_WFCQ_WOULDBLOCK ((void *) -1UL) > +#define CDS_WFCQ_WOULDBLOCK ((struct cds_wfcq_node *) -1UL) > > enum cds_wfcq_ret { > CDS_WFCQ_RET_WOULDBLOCK = -1, > > In addition, g++ does not support the __transparent_union__ gcc attribute > (it just ignores it). So we might want to rethink our use of this attribute > within wfcqueue.h. We current use it for > > /* > * Do not put head and tail on the same cache-line if concurrent > * enqueue/dequeue are expected from many CPUs. This eliminates > * false-sharing between enqueue and dequeue. > */ > struct __cds_wfcq_head { > struct cds_wfcq_node node; > }; > > struct cds_wfcq_head { > struct cds_wfcq_node node; > pthread_mutex_t lock; > }; > > /* > * The transparent union allows calling functions that work on both > * struct cds_wfcq_head and struct __cds_wfcq_head on any of those two > * types. > */ > typedef union { > struct __cds_wfcq_head *_h; > struct cds_wfcq_head *h; > } __attribute__((__transparent_union__)) cds_wfcq_head_ptr_t; > > Thoughts ? > > Thanks, > > Mathieu > > >> >> Thanx, Paul >> >> ------------------------------------------------------------------------ >> >> diff --git a/urcu-call-rcu.h b/urcu-call-rcu.h >> index 339ebacc3f7c..d37c49e9d958 100644 >> --- a/urcu-call-rcu.h >> +++ b/urcu-call-rcu.h >> @@ -32,7 +32,9 @@ >> #include <stdlib.h> >> #include <pthread.h> >> >> +#ifndef __cplusplus >> #include <urcu/wfcqueue.h> >> +#endif >> >> #ifdef __cplusplus >> extern "C" { >> @@ -57,7 +59,11 @@ struct call_rcu_data; >> */ >> >> struct rcu_head { >> +#ifdef __cplusplus >> + void *next; >> +#else >> struct cds_wfcq_node next; >> +#endif >> void (*func)(struct rcu_head *head); >> }; > > -- > Mathieu Desnoyers > EfficiOS Inc. > http://www.efficios.com > > _______________________________________________ > lttng-dev mailing list > lttng-dev@lists.lttng.org > http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev -- Mathieu Desnoyers EfficiOS Inc. http://www.efficios.com _______________________________________________ lttng-dev mailing list lttng-dev@lists.lttng.org http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev