File tree Expand file tree Collapse file tree 2 files changed +45
-7
lines changed Expand file tree Collapse file tree 2 files changed +45
-7
lines changed Original file line number Diff line number Diff 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
Original file line number Diff line number Diff line change 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 >
You can’t perform that action at this time.
0 commit comments