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");
}
示例#2
0
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");
}
示例#3
0
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
}
示例#4
0
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;
}