| urcu-bp.h | | urcu-bp.h | |
| | | | |
| skipping to change at line 40 | | skipping to change at line 40 | |
| * You should have received a copy of the GNU Lesser General Public | | * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; if not, write to the Free Software | | * License along with this library; if not, write to the Free Software | |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
USA | | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
USA | |
| * | | * | |
| * IBM's contributions to this file may be relicensed under LGPLv2 or later
. | | * IBM's contributions to this file may be relicensed under LGPLv2 or later
. | |
| */ | | */ | |
| | | | |
| #include <stdlib.h> | | #include <stdlib.h> | |
| #include <pthread.h> | | #include <pthread.h> | |
| | | | |
|
| /* | | | |
| * See urcu-pointer.h and urcu/static/urcu-pointer.h for pointer | | | |
| * publication headers. | | | |
| */ | | | |
| #include <urcu-pointer.h> | | | |
| | | | |
| #ifdef __cplusplus | | #ifdef __cplusplus | |
| extern "C" { | | extern "C" { | |
| #endif | | #endif | |
| | | | |
| #include <urcu/map/urcu-bp.h> | | #include <urcu/map/urcu-bp.h> | |
| | | | |
| /* | | /* | |
| * Important ! | | * Important ! | |
| * | | * | |
| * Each thread containing read-side critical sections must be registered | | * Each thread containing read-side critical sections must be registered | |
| * with rcu_register_thread() before calling rcu_read_lock(). | | * with rcu_register_thread() before calling rcu_read_lock(). | |
| * rcu_unregister_thread() should be called before the thread exits. | | * rcu_unregister_thread() should be called before the thread exits. | |
| */ | | */ | |
| | | | |
|
| | | /* | |
| | | * See urcu-pointer.h and urcu/static/urcu-pointer.h for pointer | |
| | | * publication headers. | |
| | | */ | |
| | | #include <urcu-pointer.h> | |
| | | | |
| #ifdef _LGPL_SOURCE | | #ifdef _LGPL_SOURCE | |
| | | | |
| #include <urcu/static/urcu-bp.h> | | #include <urcu/static/urcu-bp.h> | |
| | | | |
| /* | | /* | |
| * Mappings for static use of the userspace RCU library. | | * Mappings for static use of the userspace RCU library. | |
| * Should only be used in LGPL-compatible code. | | * Should only be used in LGPL-compatible code. | |
| */ | | */ | |
| | | | |
| /* | | /* | |
| * rcu_read_lock() | | * rcu_read_lock() | |
| * rcu_read_unlock() | | * rcu_read_unlock() | |
| * | | * | |
| * Mark the beginning and end of a read-side critical section. | | * Mark the beginning and end of a read-side critical section. | |
| */ | | */ | |
| #define rcu_read_lock_bp _rcu_read_lock | | #define rcu_read_lock_bp _rcu_read_lock | |
| #define rcu_read_unlock_bp _rcu_read_unlock | | #define rcu_read_unlock_bp _rcu_read_unlock | |
| | | | |
|
| | | #define rcu_dereference_bp rcu_dereference | |
| | | #define rcu_cmpxchg_pointer_bp rcu_cmpxchg_pointer | |
| | | #define rcu_xchg_pointer_bp rcu_xchg_pointer | |
| | | #define rcu_set_pointer_bp rcu_set_pointer | |
| | | | |
| #else /* !_LGPL_SOURCE */ | | #else /* !_LGPL_SOURCE */ | |
| | | | |
| /* | | /* | |
| * library wrappers to be used by non-LGPL compatible source code. | | * library wrappers to be used by non-LGPL compatible source code. | |
| * See LGPL-only urcu/static/urcu-pointer.h for documentation. | | * See LGPL-only urcu/static/urcu-pointer.h for documentation. | |
| */ | | */ | |
| | | | |
| extern void rcu_read_lock(void); | | extern void rcu_read_lock(void); | |
| extern void rcu_read_unlock(void); | | extern void rcu_read_unlock(void); | |
| | | | |
|
| | | extern void *rcu_dereference_sym_bp(void *p); | |
| | | #define rcu_dereference_bp(p) | |
| | | \ | |
| | | ({ | |
| | | \ | |
| | | typeof(p) _________p1 = URCU_FORCE_CAST(typeof(p), | |
| | | \ | |
| | | rcu_dereference_sym_bp(URCU_FORCE_CAST(void *, p))); | |
| | | \ | |
| | | (_________p1); | |
| | | \ | |
| | | }) | |
| | | | |
| | | extern void *rcu_cmpxchg_pointer_sym_bp(void **p, void *old, void *_new); | |
| | | #define rcu_cmpxchg_pointer_bp(p, old, _new) | |
| | | \ | |
| | | ({ | |
| | | \ | |
| | | typeof(*(p)) _________pold = (old); | |
| | | \ | |
| | | typeof(*(p)) _________pnew = (_new); | |
| | | \ | |
| | | typeof(*(p)) _________p1 = URCU_FORCE_CAST(typeof(*(p)), | |
| | | \ | |
| | | rcu_cmpxchg_pointer_sym_bp(URCU_FORCE_CAST(void **, | |
| | | p),\ | |
| | | _________pold, | |
| | | \ | |
| | | _________pnew)); | |
| | | \ | |
| | | (_________p1); | |
| | | \ | |
| | | }) | |
| | | | |
| | | extern void *rcu_xchg_pointer_sym_bp(void **p, void *v); | |
| | | #define rcu_xchg_pointer_bp(p, v) | |
| | | \ | |
| | | ({ | |
| | | \ | |
| | | typeof(*(p)) _________pv = (v); | |
| | | \ | |
| | | typeof(*(p)) _________p1 = URCU_FORCE_CAST(typeof(*(p)), | |
| | | \ | |
| | | rcu_xchg_pointer_sym_bp(URCU_FORCE_CAST(void **, p), | |
| | | \ | |
| | | _________pv)); | |
| | | \ | |
| | | (_________p1); | |
| | | \ | |
| | | }) | |
| | | | |
| | | extern void *rcu_set_pointer_sym_bp(void **p, void *v); | |
| | | #define rcu_set_pointer_bp(p, v) | |
| | | \ | |
| | | ({ | |
| | | \ | |
| | | typeof(*(p)) _________pv = (v); | |
| | | \ | |
| | | typeof(*(p)) _________p1 = URCU_FORCE_CAST(typeof(*(p)), | |
| | | \ | |
| | | rcu_set_pointer_sym_bp(URCU_FORCE_CAST(void **, p), | |
| | | \ | |
| | | _________pv)); | |
| | | \ | |
| | | (_________p1); | |
| | | \ | |
| | | }) | |
| | | | |
| #endif /* !_LGPL_SOURCE */ | | #endif /* !_LGPL_SOURCE */ | |
| | | | |
| extern void synchronize_rcu(void); | | extern void synchronize_rcu(void); | |
| | | | |
| /* | | /* | |
| * rcu_bp_before_fork, rcu_bp_after_fork_parent and rcu_bp_after_fork_child | | * rcu_bp_before_fork, rcu_bp_after_fork_parent and rcu_bp_after_fork_child | |
| * should be called around fork() system calls when the child process is no
t | | * should be called around fork() system calls when the child process is no
t | |
| * expected to immediately perform an exec(). For pthread users, see | | * expected to immediately perform an exec(). For pthread users, see | |
| * pthread_atfork(3). | | * pthread_atfork(3). | |
| */ | | */ | |
| | | | |
End of changes. 4 change blocks. |
| 6 lines changed or deleted | | 79 lines changed or added | |
|
| urcu-call-rcu.h | | urcu-call-rcu.h | |
| | | | |
| skipping to change at line 89 | | skipping to change at line 89 | |
| struct call_rcu_data *get_thread_call_rcu_data(void); | | struct call_rcu_data *get_thread_call_rcu_data(void); | |
| struct call_rcu_data *get_call_rcu_data(void); | | struct call_rcu_data *get_call_rcu_data(void); | |
| pthread_t get_call_rcu_thread(struct call_rcu_data *crdp); | | pthread_t get_call_rcu_thread(struct call_rcu_data *crdp); | |
| | | | |
| void set_thread_call_rcu_data(struct call_rcu_data *crdp); | | void set_thread_call_rcu_data(struct call_rcu_data *crdp); | |
| int set_cpu_call_rcu_data(int cpu, struct call_rcu_data *crdp); | | int set_cpu_call_rcu_data(int cpu, struct call_rcu_data *crdp); | |
| | | | |
| int create_all_cpu_call_rcu_data(unsigned long flags); | | int create_all_cpu_call_rcu_data(unsigned long flags); | |
| void free_all_cpu_call_rcu_data(void); | | void free_all_cpu_call_rcu_data(void); | |
| | | | |
|
| | | void call_rcu_before_fork(void); | |
| | | void call_rcu_after_fork_parent(void); | |
| void call_rcu_after_fork_child(void); | | void call_rcu_after_fork_child(void); | |
| | | | |
| #ifdef __cplusplus | | #ifdef __cplusplus | |
| } | | } | |
| #endif | | #endif | |
| | | | |
| #endif /* _URCU_CALL_RCU_H */ | | #endif /* _URCU_CALL_RCU_H */ | |
| | | | |
End of changes. 1 change blocks. |
| 0 lines changed or deleted | | 2 lines changed or added | |
|