0
0
mirror of https://github.com/mongodb/mongo.git synced 2024-12-01 09:32:32 +01:00

Make OID and MSGID increments atomic

This commit is contained in:
Mathias Stearn 2009-12-01 19:28:27 -05:00
parent 7564ceb774
commit 7133196d6b
3 changed files with 20 additions and 10 deletions

View File

@ -1430,7 +1430,7 @@ namespace mongo {
}
void OID::init() {
static unsigned inc = (unsigned) security.getNonce();
static WrappingInt inc = (unsigned) security.getNonce();
unsigned t = (unsigned) time(0);
char *T = (char *) &t;
data[0] = T[3];
@ -1440,9 +1440,8 @@ namespace mongo {
(unsigned&) data[4] = _machine;
// TODO: use compiler intrinsic atomic increment instead of inc++
int old_inc = inc++;
T = (char *) &old_inc;
int new_inc = inc.atomicIncrement();
T = (char *) &new_inc;
char * raw = (char*)&b;
raw[0] = T[3];
raw[1] = T[2];

View File

@ -19,6 +19,10 @@
#pragma once
#if defined(__MSCV__)
# include <windows.h>
#endif
namespace mongo {
#if !defined(_WIN32) && !defined(NOEXECINFO)
@ -112,14 +116,22 @@ namespace mongo {
x = 0;
}
WrappingInt(unsigned z) : x(z) { }
unsigned x;
volatile unsigned x;
operator unsigned() const {
return x;
}
WrappingInt& operator++() {
x++;
return *this;
WrappingInt atomicIncrement(){
#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)
return __sync_add_and_fetch(&x, 1);
#elif defined(__MSCV__)
return InterlockedIncrement((long*)&x); //long is 32bits in Win64
#else
# warning "OID and MSGID generation will not be thread safe"
return ++inc;
#endif
}
static int diff(unsigned a, unsigned b) {
return a-b;
}

View File

@ -429,8 +429,7 @@ again:
} msgstart;
MSGID nextMessageId(){
MSGID msgid = NextMsgId;
++NextMsgId;
MSGID msgid = NextMsgId.atomicIncrement();
if ( usingClientIds ){
msgid = msgid & 0xFFFF;