From 0fb2b21ed558c4a9ecebd12494b49f7e800b7988 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Wed, 24 Jun 2015 18:57:47 +0800 Subject: [PATCH] use atom inc for object id counter --- lualib-src/lua-bson.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lualib-src/lua-bson.c b/lualib-src/lua-bson.c index 88f1be8e..37b5f7f6 100644 --- a/lualib-src/lua-bson.c +++ b/lualib-src/lua-bson.c @@ -1135,15 +1135,18 @@ lobjectid(lua_State *L) { } } else { time_t ti = time(NULL); + uint32_t id = oid_counter; + // old_counter is a static var, use atom inc. + __sync_add_and_fetch(&oid_counter,1); + oid[2] = (ti>>24) & 0xff; oid[3] = (ti>>16) & 0xff; oid[4] = (ti>>8) & 0xff; oid[5] = ti & 0xff; memcpy(oid+6 , oid_header, 5); - oid[11] = (oid_counter>>16) & 0xff; - oid[12] = (oid_counter>>8) & 0xff; - oid[13] = oid_counter & 0xff; - ++oid_counter; + oid[11] = (id>>16) & 0xff; + oid[12] = (id>>8) & 0xff; + oid[13] = id & 0xff; } lua_pushlstring( L, (const char *)oid, 14);