void reset(T* new_value=0) {
T * old_value = get();
+ set(new_value);
+ if (old_value) {
+ delete old_value;
+ }
+ }
+
+ T* release (void) {
+ T * old_value = get();
+ set(0);
+ return old_value;
+ }
+
+private:
+ void set(T* new_value) {
#ifdef _WIN32
TlsSetValue(dwTlsIndex, new_value);
#else
pthread_setspecific(key, new_value);
#endif
- if (old_value) {
- delete old_value;
- }
}
};
namespace glretrace {
-
-
static glws::Visual *
visuals[glws::PROFILE_MAX];
}
-typedef Context * CurrentData;
-static os::thread_specific_ptr<CurrentData> currentData;
+static os::thread_specific_ptr<Context>
+currentContextPtr;
bool
makeCurrent(trace::Call &call, glws::Drawable *drawable, Context *context)
{
- Context *currentContext = getCurrentContext();
+ Context *currentContext = currentContextPtr.release();
glws::Drawable *currentDrawable = currentContext ? currentContext->drawable : NULL;
if (drawable == currentDrawable && context == currentContext) {
currentContext->drawable = NULL;
}
- CurrentData *currentDataPtr = currentData.get();
- if (!currentDataPtr) {
- currentDataPtr = new CurrentData;
- currentData.reset(currentDataPtr);
- }
-
if (drawable && context) {
context->drawable = drawable;
- *currentData = context;
+ currentContextPtr.reset(context);
if (!context->used) {
initContext();
context->used = true;
}
- } else {
- *currentData = NULL;
}
return true;
Context *
getCurrentContext(void) {
- CurrentData *currentDataPtr = currentData.get();
- if (!currentDataPtr) {
- return NULL;
- }
- return *currentDataPtr;
+ return currentContextPtr.get();
}
-
-
/**
* Grow the current drawble.
*