diff options
author | Simon Rettberg | 2020-07-27 12:56:35 +0200 |
---|---|---|
committer | Simon Rettberg | 2020-07-27 12:56:35 +0200 |
commit | 1f212fa1fd0a381b42175dc1bac79baa164e1e45 (patch) | |
tree | 7d911d7fe40817cbb433acebc3ed735eafe9c6df /src/server/reftypes.h | |
parent | [FUSE] Tweak timeout values to prevent stale status file (diff) | |
parent | [SERVER] Fix: NULL pointer access in saveLoadAllCacheMaps() (diff) | |
download | dnbd3-1f212fa1fd0a381b42175dc1bac79baa164e1e45.tar.gz dnbd3-1f212fa1fd0a381b42175dc1bac79baa164e1e45.tar.xz dnbd3-1f212fa1fd0a381b42175dc1bac79baa164e1e45.zip |
Merge branch 'no-working-flag' into fuse_ll
Diffstat (limited to 'src/server/reftypes.h')
-rw-r--r-- | src/server/reftypes.h | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/server/reftypes.h b/src/server/reftypes.h new file mode 100644 index 0000000..45c0c20 --- /dev/null +++ b/src/server/reftypes.h @@ -0,0 +1,25 @@ +#ifndef _REFTYPES_H_ +#define _REFTYPES_H_ + +#include <stdatomic.h> + +_Static_assert( sizeof( void * ) == sizeof( _Atomic( void * ) ), "Atomic pointer bad" ); + +typedef _Atomic( void * ) weakref; + +#define aligned_ref(ptr) \ + ((union _aligned_ref_ *)((ptr) - (uintptr_t)(ptr) % sizeof(union _aligned_ref_))) + +union _aligned_ref_ { + struct _ref_ *ref; + void *_padding[( 32 - 1 ) / sizeof( void * ) + 1]; +}; + +typedef struct _ref_ { + _Atomic long count; + void ( *free )( struct _ref_ * ); + char _padding[sizeof( union _aligned_ref_ )]; + char _aligned_ref[sizeof( union _aligned_ref_ )]; +} ref; + +#endif |