[lttng-dev] [PATCH 07/12] Add rcu_flavor

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Mon Nov 28 08:23:44 EST 2011


* Lai Jiangshan (laijs at cn.fujitsu.com) wrote:
> Not all related functions are added.
> Left functions will be added when needed.

merged, thanks!

Mathieu

> 
> Signed-off-by: Lai Jiangshan <laijs at cn.fujitsu.com>
> ---
>  Makefile.am          |    2 +-
>  urcu-bp.c            |    2 +
>  urcu-bp.h            |    1 +
>  urcu-flavor.h        |   65 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  urcu-qsbr.c          |    2 +
>  urcu-qsbr.h          |    1 +
>  urcu.c               |    2 +
>  urcu.h               |    1 +
>  urcu/map/urcu-bp.h   |    2 +
>  urcu/map/urcu-qsbr.h |    2 +
>  urcu/map/urcu.h      |    6 ++++
>  11 files changed, 85 insertions(+), 1 deletions(-)
>  create mode 100644 urcu-flavor.h
> 
> diff --git a/Makefile.am b/Makefile.am
> index 4e4ce89..1290551 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -8,7 +8,7 @@ AM_CFLAGS=-Wall
>  SUBDIRS = . tests
>  
>  include_HEADERS = urcu.h urcu-bp.h urcu-call-rcu.h urcu-defer.h \
> -		urcu-pointer.h urcu-qsbr.h
> +		urcu-pointer.h urcu-qsbr.h urcu-flavor.h
>  nobase_dist_include_HEADERS = urcu/compiler.h urcu/hlist.h urcu/list.h \
>  		urcu/rculist.h urcu/rcuhlist.h urcu/system.h urcu/futex.h \
>  		urcu/uatomic/generic.h urcu/arch/generic.h urcu/wfstack.h \
> diff --git a/urcu-bp.c b/urcu-bp.c
> index 4c0ab54..3b2062d 100644
> --- a/urcu-bp.c
> +++ b/urcu-bp.c
> @@ -421,5 +421,7 @@ void rcu_bp_after_fork_child(void)
>  	assert(!ret);
>  }
>  
> +DEFINE_RCU_FLAVOR()
> +
>  #include "urcu-call-rcu-impl.h"
>  #include "urcu-defer-impl.h"
> diff --git a/urcu-bp.h b/urcu-bp.h
> index 451bedb..efb5dca 100644
> --- a/urcu-bp.h
> +++ b/urcu-bp.h
> @@ -135,5 +135,6 @@ static inline void rcu_thread_online(void)
>  
>  #include <urcu-call-rcu.h>
>  #include <urcu-defer.h>
> +#include <urcu-flavor.h>
>  
>  #endif /* _URCU_BP_H */
> diff --git a/urcu-flavor.h b/urcu-flavor.h
> new file mode 100644
> index 0000000..e46c9a1
> --- /dev/null
> +++ b/urcu-flavor.h
> @@ -0,0 +1,65 @@
> +#ifndef _URCU_FLAVOR_H
> +#define _URCU_FLAVOR_H
> +
> +/*
> + * urcu-flavor.h
> + *
> + * Userspace RCU header - rcu flavor declarations
> + *
> + * Copyright (c) 2011 Lai Jiangshan <laijs at cn.fujitsu.com>
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> + */
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +struct rcu_flavor_struct {
> +	void (*read_lock)(void);
> +	void (*read_unlock)(void);
> +	void (*read_quiescent_state)(void);
> +	void (*update_call_rcu)(struct rcu_head *head,
> +				void (*func)(struct rcu_head *head));
> +	void (*update_synchronize_rcu)(void);
> +	void (*update_defer_rcu)(void (*fct)(void *p), void *p);
> +
> +	void (*thread_offline)(void);
> +	void (*thread_online)(void);
> +	void (*register_thread)(void);
> +	void (*unregister_thread)(void);
> +};
> +
> +#define DEFINE_RCU_FLAVOR()				\
> +const struct rcu_flavor_struct rcu_flavor = {		\
> +	.read_lock		= rcu_read_lock,	\
> +	.read_unlock		= rcu_read_unlock,	\
> +	.read_quiescent_state	= rcu_quiescent_state,	\
> +	.update_call_rcu	= call_rcu,		\
> +	.update_synchronize_rcu	= synchronize_rcu,	\
> +	.update_defer_rcu	= defer_rcu,		\
> +	.thread_offline		= rcu_thread_offline,	\
> +	.thread_online		= rcu_thread_online,	\
> +	.register_thread	= rcu_register_thread,	\
> +	.unregister_thread	= rcu_unregister_thread,\
> +};
> +
> +extern const struct rcu_flavor_struct rcu_flavor;
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* _URCU_FLAVOR_H */
> diff --git a/urcu-qsbr.c b/urcu-qsbr.c
> index 5530295..06e81c7 100644
> --- a/urcu-qsbr.c
> +++ b/urcu-qsbr.c
> @@ -356,5 +356,7 @@ void rcu_exit(void)
>  	 */
>  }
>  
> +DEFINE_RCU_FLAVOR()
> +
>  #include "urcu-call-rcu-impl.h"
>  #include "urcu-defer-impl.h"
> diff --git a/urcu-qsbr.h b/urcu-qsbr.h
> index b362304..a2f6575 100644
> --- a/urcu-qsbr.h
> +++ b/urcu-qsbr.h
> @@ -127,5 +127,6 @@ extern void rcu_unregister_thread(void);
>  
>  #include <urcu-call-rcu.h>
>  #include <urcu-defer.h>
> +#include <urcu-flavor.h>
>  
>  #endif /* _URCU_QSBR_H */
> diff --git a/urcu.c b/urcu.c
> index ba013d9..b434655 100644
> --- a/urcu.c
> +++ b/urcu.c
> @@ -452,5 +452,7 @@ void rcu_exit(void)
>  
>  #endif /* #ifdef RCU_SIGNAL */
>  
> +DEFINE_RCU_FLAVOR()
> +
>  #include "urcu-call-rcu-impl.h"
>  #include "urcu-defer-impl.h"
> diff --git a/urcu.h b/urcu.h
> index 1ad971c..cd4fcbb 100644
> --- a/urcu.h
> +++ b/urcu.h
> @@ -128,5 +128,6 @@ static inline void rcu_thread_online(void)
>  
>  #include <urcu-call-rcu.h>
>  #include <urcu-defer.h>
> +#include <urcu-flavor.h>
>  
>  #endif /* _URCU_H */
> diff --git a/urcu/map/urcu-bp.h b/urcu/map/urcu-bp.h
> index 4abe8dc..16601a1 100644
> --- a/urcu/map/urcu-bp.h
> +++ b/urcu/map/urcu-bp.h
> @@ -64,4 +64,6 @@
>  #define rcu_defer_barrier		rcu_defer_barrier_bp
>  #define rcu_defer_barrier_thread	rcu_defer_barrier_thread_bp
>  
> +#define rcu_flavor			rcu_flavor_bp
> +
>  #endif /* _URCU_BP_MAP_H */
> diff --git a/urcu/map/urcu-qsbr.h b/urcu/map/urcu-qsbr.h
> index 0d88d83..a95441d 100644
> --- a/urcu/map/urcu-qsbr.h
> +++ b/urcu/map/urcu-qsbr.h
> @@ -66,4 +66,6 @@
>  #define	rcu_defer_barrier		rcu_defer_barrier_qsbr
>  #define rcu_defer_barrier_thread	rcu_defer_barrier_thread_qsbr
>  
> +#define rcu_flavor			rcu_flavor_qsbr
> +
>  #endif /* _URCU_QSBR_MAP_H */
> diff --git a/urcu/map/urcu.h b/urcu/map/urcu.h
> index 3f436a7..dd7a691 100644
> --- a/urcu/map/urcu.h
> +++ b/urcu/map/urcu.h
> @@ -95,6 +95,8 @@
>  #define rcu_defer_barrier		rcu_defer_barrier_memb
>  #define rcu_defer_barrier_thread	rcu_defer_barrier_thread_memb
>  
> +#define rcu_flavor			rcu_flavor_memb
> +
>  #elif defined(RCU_SIGNAL)
>  
>  #define rcu_read_lock			rcu_read_lock_sig
> @@ -127,6 +129,8 @@
>  #define rcu_defer_barrier		rcu_defer_barrier_sig
>  #define rcu_defer_barrier_thread	rcu_defer_barrier_thread_sig
>  
> +#define rcu_flavor			rcu_flavor_sig
> +
>  #elif defined(RCU_MB)
>  
>  #define rcu_read_lock			rcu_read_lock_mb
> @@ -159,6 +163,8 @@
>  #define rcu_defer_barrier		rcu_defer_barrier_mb
>  #define rcu_defer_barrier_thread	rcu_defer_barrier_thread_mb
>  
> +#define rcu_flavor			rcu_flavor_mb
> +
>  #else
>  
>  #error "Undefined selection"
> -- 
> 1.7.4.4
> 

-- 
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com



More information about the lttng-dev mailing list