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; }
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; }
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); }