Example #1
0
void *easy_atomic_mthread_op_start(void *args)
{
    easy_atomic_mt_op_args_t *p = (easy_atomic_mt_op_args_t *)args;
    int                     i;

    for(i = 0; i < p->loop_count; i++) {
        easy_atomic_add(&p->int64_add, 1);
        easy_atomic_add(&p->int64_sum, 1);
    }

    for(i = 0; i < p->loop_count; i++) {
        easy_atomic_add_return(&p->int64_add_return, 1);
        easy_atomic_add_return(&p->int64_sum, 1);
    }

    for(i = 0; i < p->loop_count; i++) {
        easy_atomic_inc(&p->int64_inc);
        easy_atomic_inc(&p->int64_sum);
    }

    for(i = 0; i < p->loop_count; i++) {
        easy_atomic_dec(&p->int64_dec);
        easy_atomic_dec(&p->int64_sum);
    }

    for(i = 0; i < p->loop_count; i++) {
        easy_atomic32_add(&p->int32_add, 1);
        easy_atomic32_add(&p->int32_sum, 1);
    }

    for(i = 0; i < p->loop_count; i++) {
        easy_atomic32_add_return(&p->int32_add_return, 1);
        easy_atomic32_add_return(&p->int32_sum, 1);
    }

    for(i = 0; i < p->loop_count; i++) {
        easy_atomic32_inc(&p->int32_inc);
        easy_atomic32_inc(&p->int32_sum);
    }

    for(i = 0; i < p->loop_count; i++) {
        easy_atomic32_dec(&p->int32_dec);
        easy_atomic32_dec(&p->int32_sum);
    }

    int                     j = 0;
    int                     t = 0;
    easy_atomic_t           v;

    for(j = 0; j < p->loop_count; j++) {
        do {
            v = p->int64_set;
            t = easy_atomic_cmp_set(&p->int64_set, v, v + 1);
        } while(t == 0);

        easy_atomic_add(&p->int64_set_sum, t);
    }

    return (void *)NULL;
}
Example #2
0
 uint64_t BasePacketStreamer::get_packet_id_handler(easy_connection_t *c, void *packet) {
   UNUSED(c);
   int32_t packet_id = 0;
   if (packet != NULL) {
     BasePacket *bp = (BasePacket*)packet;
     packet_id = bp->getChannelId();
   }
   if (packet_id == 0) {
     while (packet_id == 0 || packet_id == -1) {
       packet_id = (int32_t)easy_atomic32_add_return(&global_chid, 1);
     }
   }
   return packet_id;
 }
Example #3
0
TEST(easy_atomic, func)
{
    easy_atomic32_t         v1 = 0;
    easy_atomic_t           v2 = 0;

    easy_atomic32_add(&v1, 1);
    EXPECT_EQ(v1, 1);
    easy_atomic32_add(&v1, 10);
    EXPECT_EQ(v1, 11);
    EXPECT_EQ(easy_atomic32_add_return(&v1, 100), 111);
    EXPECT_EQ(v1, 111);

    TEST_ATOMIC_ADD32(v1, INT32_MAX_VALUE, INT32_MIN_VALUE); // 2147483647 + -2147483648 = -1
    TEST_ATOMIC_ADD32(v1, INT32_MAX_VALUE, INT32_MAX_VALUE); // 2147483647 + 2147483647 = -2
    TEST_ATOMIC_ADD32(v1, 0x0, INT32_MIN_VALUE);  // 0 + -2147483648 = -2147483648
    TEST_ATOMIC_ADD32(v1, 0x0, INT32_MAX_VALUE);  // 0 + 2147483647 = 2147483647
    TEST_ATOMIC_ADD32(v1, INT32_MIN_VALUE, INT32_MIN_VALUE);  // -2147483648 + -2147483648 = 0
    TEST_ATOMIC_ADD32(v1, INT32_MIN_VALUE, INT32_MAX_VALUE);  // -2147483648 + 2147483647 = -1

    easy_atomic_add(&v2, 1);
    EXPECT_EQ(v2, 1);
    easy_atomic_add(&v2, 10);
    EXPECT_EQ(v2, 11);
    EXPECT_EQ(easy_atomic_add_return(&v2, 100), 111);
    EXPECT_EQ(v2, 111);

    EXPECT_EQ(easy_atomic_cmp_set(&v2, 110, 1), 0);
    EXPECT_EQ(v2, 111);
    EXPECT_EQ(easy_atomic_cmp_set(&v2, 111, 1), 1);
    EXPECT_EQ(v2, 1);

    TEST_ATOMIC_ADD(v2, INT64_MAX_VALUE, INT64_MIN_VALUE);
    //TEST_ATOMIC_ADD(v2, INT64_MAX_VALUE, INT64_MAX_VALUE);
    TEST_ATOMIC_ADD(v2, 0x0, INT64_MIN_VALUE);
    TEST_ATOMIC_ADD(v2, 0x0, INT64_MAX_VALUE);
    TEST_ATOMIC_ADD(v2, INT64_MIN_VALUE, INT64_MIN_VALUE);
    TEST_ATOMIC_ADD(v2, INT64_MIN_VALUE, INT64_MAX_VALUE);

    TEST_ATOMIC_CMP_SET(v2, INT64_MAX_VALUE, INT64_MIN_VALUE);
    TEST_ATOMIC_CMP_SET(v2, INT64_MAX_VALUE, INT64_MAX_VALUE);
    TEST_ATOMIC_CMP_SET(v2, 0x0, INT64_MIN_VALUE);
    TEST_ATOMIC_CMP_SET(v2, 0x0, INT64_MAX_VALUE);
    TEST_ATOMIC_CMP_SET(v2, INT64_MIN_VALUE, INT64_MIN_VALUE);
    TEST_ATOMIC_CMP_SET(v2, INT64_MIN_VALUE, INT64_MAX_VALUE);

    EXPECT_EQ(easy_trylock(&v2), 0);
    easy_unlock(&v2);
    EXPECT_EQ(v2, 0);

    EXPECT_EQ(easy_trylock(&v2), 1);
    EXPECT_EQ(v2, 1);
    easy_unlock(&v2);
    EXPECT_EQ(v2, 0);

    easy_spin_lock(&v2);
    EXPECT_EQ(v2, 1);
    EXPECT_EQ(easy_trylock(&v2), 0);
    easy_unlock(&v2);
    EXPECT_EQ(v2, 0);

    // 64 bit, atomic inc and dec
    int64_t                 i = 0;
    easy_atomic_t           v3 = 0;
    TEST_ATOMIC_INC(i, v3, -1000, 1000);
    TEST_ATOMIC_DEC(i, v3, 1000, -1000);
    easy_atomic_t           v3_t = INT64_MAX_VALUE;
    easy_atomic_add_return(&v3_t, 1000);
    TEST_ATOMIC_INC(i, v3, INT64_MAX_VALUE - 1000, v3_t);
    TEST_ATOMIC_DEC(i, v3, v3_t, INT64_MAX_VALUE - 1000);

    // 32 bit, atomic inc and dec
    easy_atomic32_t         v4 = 0;
    TEST_ATOMIC_INC32(i, v4, -1000, 1000);
    TEST_ATOMIC_DEC32(i, v4, 1000, -1000);
    easy_atomic32_t         v4_t = INT32_MAX_VALUE;
    easy_atomic32_add_return(&v4_t, 1000);
    TEST_ATOMIC_INC32(i, v4, INT32_MAX_VALUE - 1000, v4_t);
    TEST_ATOMIC_DEC32(i, v4, v4_t, INT32_MAX_VALUE - 1000);
}