#include "test/birdtest.h" #include "test/bt-utils.h" #include "lib/locking.h" #include #include DEFINE_DOMAIN(proto); struct foo_public { const char *name; _Atomic uint counter; DOMAIN(proto) lock; }; struct foo_private { struct foo_public; struct foo_private **locked_at; uint private_counter; }; typedef union foo { struct foo_public; struct foo_private priv; } foo; LOBJ_UNLOCK_CLEANUP(foo, proto); #define FOO_LOCK(_foo, _fpp) LOBJ_LOCK(_foo, _fpp, foo, proto) #define FOO_LOCKED(_foo, _fpp) LOBJ_LOCKED(_foo, _fpp, foo, proto) #define FOO_IS_LOCKED(_foo) LOBJ_IS_LOCKED(_foo, proto) static uint inc_public(foo *f) { return atomic_fetch_add_explicit(&f->counter, 1, memory_order_relaxed) + 1; } static uint inc_private(foo *f) { FOO_LOCKED(f, fp) return ++fp->private_counter; bug("Returning always"); } #define BLOCKCOUNT 4096 #define THREADS 16 #define REPEATS 128 static void * thread_run(void *_foo) { foo *f = _foo; for (int i=0; i