int main(void) { printf("_Atomic struct A is lock free? %s\n", atomic_is_lock_free(&a) ? "true" : "false"); printf("_Atomic struct B is lock free? %s\n", atomic_is_lock_free(&b) ? "true" : "false"); }
COLD AsyncJobRouter::AsyncJobRouter(void* ctxArg, Tablespace& tablespaceArg) : AbstractFrameProcessor(ctxArg, ZMQ_PULL, ZMQ_PUSH, "Async job router"), processSocketMap(), processThreadMap(), apTerminationInfo(), scrubJobsRequested(), apidGenerator("next-apid.txt"), ctx(ctxArg), tablespace(tablespaceArg) { //Print warnings if not using lockfree atomics std::atomic<bool> boolAtomic; std::atomic<unsigned int> uintAtomic; std::atomic<uint64_t> uint64Atomic; if(!atomic_is_lock_free(&boolAtomic)) { logger.warn("atomic<bool> is not lockfree, some operations might be slower than expected"); } if(!atomic_is_lock_free(&uintAtomic)) { logger.warn("atomic<unsigned int> is not lockfree, some operations might be slower than expected"); } if(!atomic_is_lock_free(&uint64Atomic)) { logger.warn("atomic<uint64_t> is not lockfree, some operations might be slower than expected"); } //Connect the socket that is used by the send() member function if(unlikely(zmq_connect(processorInputSocket, asyncJobRouterAddr) == -1)) { logger.critical("Failed to bind processor input socket: " + std::string(zmq_strerror(errno))); } //Connect the socket that is used to proxy requests to the external req/rep socket if(unlikely(zmq_connect(processorOutputSocket, externalRequestProxyEndpoint) == -1)) { logger.critical("Failed to bind processor output socket: " + std::string(zmq_strerror(errno))); } logger.debug("Asynchronous job router starting up"); }
TEST(stdatomic, atomic_is_lock_free) { atomic_char small; ASSERT_TRUE(atomic_is_lock_free(&small)); atomic_intmax_t big; // atomic_intmax_t(size = 64) is not lock free on mips32. #if defined(__mips__) && !defined(__LP64__) ASSERT_FALSE(atomic_is_lock_free(&big)); #else ASSERT_TRUE(atomic_is_lock_free(&big)); #endif }
int main () { int b; if (!atomic_is_lock_free (&a)) abort (); if ((atomic_flag_test_and_set) (&a)) abort (); (atomic_flag_clear_explicit) (&a, memory_order_relaxed); if ((atomic_flag_test_and_set) (&a)) abort (); (atomic_flag_clear) (&a); b = (atomic_flag_test_and_set_explicit) (&a, memory_order_seq_cst); if (!(atomic_flag_test_and_set) (&a) || b != 0) abort (); b = (atomic_flag_test_and_set_explicit) (&a, memory_order_acq_rel); if (!(atomic_flag_test_and_set) (&a) || b != 1) abort (); (atomic_flag_clear_explicit) (&a, memory_order_seq_cst); if ((atomic_flag_test_and_set) (&a)) abort (); return 0; }