[lttng-dev] Horrible hack to make C++ link to liburcu
Mathieu Desnoyers
mathieu.desnoyers at efficios.com
Sat Mar 5 15:10:30 UTC 2016
----- On Mar 4, 2016, at 3:32 PM, Paul E. McKenney paulmck at 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?
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
More information about the lttng-dev
mailing list