Skip to content

Commit 78de281

Browse files
committed
SERVER-6572 - use pthread specifics on os x for performance
1 parent 5d1e7ee commit 78de281

File tree

2 files changed

+45
-7
lines changed

2 files changed

+45
-7
lines changed

src/mongo/db/record.cpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -306,14 +306,9 @@ namespace mongo {
306306
return &_pointerTableData;
307307
}
308308
#else
309-
boost::thread_specific_ptr<ps::PointerTable::Data> _pointerTable;
309+
TSP_DEFINE(ps::PointerTable::Data, _pointerTableData);
310310
ps::PointerTable::Data* ps::PointerTable::getData() {
311-
PointerTable::Data* pt = _pointerTable.get();
312-
if ( ! pt ) {
313-
pt = new ps::PointerTable::Data();
314-
_pointerTable.reset( pt );
315-
}
316-
return pt;
311+
return _pointerTableData.getMake();
317312
}
318313
#endif
319314

src/mongo/util/concurrency/threadlocal.h

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
#include "mongo/client/undef_macros.h"
2020
#include <boost/thread/tss.hpp>
21+
#include <boost/bind.hpp>
2122
#include "mongo/client/redef_macros.h"
2223

2324

@@ -116,6 +117,48 @@ namespace mongo {
116117
TSP<T> p;
117118
# endif
118119

120+
#elif defined(__APPLE__)
121+
template< class T>
122+
struct TSP {
123+
pthread_key_t _key;
124+
public:
125+
TSP() {
126+
verify( pthread_key_create( &_key, TSP::dodelete ) == 0 );
127+
}
128+
129+
~TSP() {
130+
pthread_key_delete( _key );
131+
}
132+
133+
static void dodelete( void* x ) {
134+
T* t = reinterpret_cast<T*>(x);
135+
delete t;
136+
}
137+
138+
T* get() const {
139+
return reinterpret_cast<T*>( pthread_getspecific( _key ) );
140+
}
141+
142+
void reset(T* v) {
143+
T* old = get();
144+
delete old;
145+
verify( pthread_setspecific( _key, v ) == 0 );
146+
}
147+
148+
T* getMake() {
149+
T *t = get();
150+
if( t == 0 ) {
151+
t = new T();
152+
reset( t );
153+
}
154+
return t;
155+
}
156+
};
157+
158+
# define TSP_DECLARE(T,p) extern TSP<T> p;
159+
160+
# define TSP_DEFINE(T,p) TSP<T> p;
161+
119162
#else
120163

121164
template< class T >

0 commit comments

Comments
 (0)