X-Git-Url: https://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=urcu%2Fsystem.h;fp=urcu%2Fsystem.h;h=e36a13baf51dc79a8ad9b31351a75a1c3ed775b6;hp=0000000000000000000000000000000000000000;hb=7e30abe3df0e83eeb741bfc18d07cb016af804a1;hpb=074d8438a30f7da8ae12eb94caff69c37fb576bd diff --git a/urcu/system.h b/urcu/system.h new file mode 100644 index 0000000..e36a13b --- /dev/null +++ b/urcu/system.h @@ -0,0 +1,54 @@ +#ifndef _URCU_SYSTEM_H +#define _URCU_SYSTEM_H + +/* + * system.h + * + * System definitions. + * + * Copyright (c) 2009 Mathieu Desnoyers + * + * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED + * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + * + * Permission is hereby granted to use or copy this program + * for any purpose, provided the above notices are retained on all copies. + * Permission to modify the code and to distribute modified code is granted, + * provided the above notices are retained, and a notice that the code was + * modified is included with the above copyright notice. + */ + +#include +#include + +/* + * Identify a shared load. A smp_rmc() or smp_mc() should come before the load. + */ +#define _LOAD_SHARED(p) ACCESS_ONCE(p) + +/* + * Load a data from shared memory, doing a cache flush if required. + */ +#define LOAD_SHARED(p) \ + ({ \ + smp_rmc(); \ + _LOAD_SHARED(p); \ + }) + +/* + * Identify a shared store. A smp_wmc() or smp_mc() should follow the store. + */ +#define _STORE_SHARED(x, v) ({ ACCESS_ONCE(x) = (v); }) + +/* + * Store v into x, where x is located in shared memory. Performs the required + * cache flush after writing. Returns v. + */ +#define STORE_SHARED(x, v) \ + ({ \ + _STORE_SHARED(x, v); \ + smp_wmc(); \ + (v); \ + }) + +#endif /* _URCU_SYSTEM_H */