Changeset 39568 in vbox for trunk/src/VBox/GuestHost/OpenGL
- Timestamp:
- Dec 9, 2011 1:52:31 PM (13 years ago)
- Location:
- trunk/src/VBox/GuestHost/OpenGL
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/GuestHost/OpenGL/include/cr_glstate.h
r39507 r39568 46 46 #include "spu_dispatch_table.h" 47 47 48 #ifdef CHROMIUM_THREADSAFE 49 #include "cr_threads.h" 50 #endif 51 48 52 #include <iprt/cdefs.h> 49 53 … … 129 133 * => Thread2 still refers to destroyed ctx1 130 134 * */ 131 /* number of threads that have context set as current */ 132 volatile int cRefs; 135 CRTSDREFDATA 133 136 #endif 134 137 -
trunk/src/VBox/GuestHost/OpenGL/include/cr_threads.h
r15532 r39568 25 25 #endif 26 26 27 27 #include <iprt/asm.h> 28 28 /* 29 29 * Handle for Thread-Specific Data … … 101 101 extern DECLEXPORT(void) crSignalSemaphore(CRsemaphore *s); 102 102 103 typedef DECLCALLBACK(void) FNCRTSDREFDTOR(void*); 104 typedef FNCRTSDREFDTOR *PFNCRTSDREFDTOR; 103 105 106 typedef enum { 107 CRTSDREFDATA_STATE_UNDEFINED = 0, 108 CRTSDREFDATA_STATE_INITIALIZED, 109 CRTSDREFDATA_STATE_TOBE_DESTROYED, 110 CRTSDREFDATA_STATE_DESTROYING, 111 CRTSDREFDATA_STATE_32BIT_HACK = 0x7fffffff 112 } CRTSDREFDATA_STATE; 113 114 #define CRTSDREFDATA \ 115 volatile uint32_t cTsdRefs; \ 116 uint32_t enmTsdRefState; \ 117 PFNCRTSDREFDTOR pfnTsdRefDtor; \ 118 119 #define crTSDRefInit(_p, _pfnDtor) do { \ 120 (_p)->cTsdRefs = 1; \ 121 (_p)->enmTsdRefState = CRTSDREFDATA_STATE_INITIALIZED; \ 122 (_p)->pfnTsdRefDtor = (_pfnDtor); \ 123 } while (0) 124 125 #define crTSDRefIsFunctional(_p) (!!((_p)->enmTsdRefState == CRTSDREFDATA_STATE_INITIALIZED)) 126 127 #define crTSDRefAddRef(_p) do { \ 128 int cRefs = ASMAtomicIncS32(&(_p)->cTsdRefs); \ 129 CRASSERT(cRefs > 1 || (_p)->enmTsdRefState == CRTSDREFDATA_STATE_DESTROYING); \ 130 } while (0) 131 132 #define crTSDRefRelease(_p) do { \ 133 int cRefs = ASMAtomicDecS32(&(_p)->cTsdRefs); \ 134 CRASSERT(cRefs >= 0); \ 135 if (!cRefs && (_p)->enmTsdRefState != CRTSDREFDATA_STATE_DESTROYING /* <- avoid recursion if crTSDRefAddRef/Release is called from dtor */) { \ 136 (_p)->enmTsdRefState = CRTSDREFDATA_STATE_DESTROYING; \ 137 (_p)->pfnTsdRefDtor((_p)); \ 138 } \ 139 } while (0) 140 141 #define crTSDRefReleaseMarkDestroy(_p) do { \ 142 (_p)->enmTsdRefState = CRTSDREFDATA_STATE_TOBE_DESTROYED; \ 143 } while (0) 144 145 #define crTSDRefGetCurrent(_t, _pTsd) ((_t*) crGetTSD((_pTsd))) 146 147 #define crTSDRefSetCurrent(_t, _pTsd, _p) do { \ 148 _t * oldCur = crTSDRefGetCurrent(_t, _pTsd); \ 149 if (oldCur != (_p)) { \ 150 crSetTSD((_pTsd), (_p)); \ 151 if (oldCur) { \ 152 crTSDRefRelease(oldCur); \ 153 } \ 154 if ((_p)) { \ 155 crTSDRefAddRef((_t*)(_p)); \ 156 } \ 157 } \ 158 } while (0) 104 159 #ifdef __cplusplus 105 160 } -
trunk/src/VBox/GuestHost/OpenGL/state_tracker/state.h
r39507 r39568 11 11 #ifdef CHROMIUM_THREADSAFE 12 12 #include "cr_threads.h" 13 #include <iprt/asm.h>14 13 #endif 15 14 … … 25 24 #ifdef CHROMIUM_THREADSAFE 26 25 extern CRtsd __contextTSD; 27 #define GetCurrentContext() (CRContext *) crGetTSD(&__contextTSD)26 #define GetCurrentContext() crTSDRefGetCurrent(CRContext, &__contextTSD) 28 27 29 /* NOTE: below ref &SetCurrentContext stuff is supposed to be used only internally!!28 /* NOTE: below SetCurrentContext stuff is supposed to be used only internally!! 30 29 * it is placed here only to simplify things since some code besides state_init.c 31 30 * (i.e. state_glsl.c) is using it */ 32 void crStateFreeContext(CRContext *ctx); 33 #define CRCONTEXT_ADDREF(_ctx) do { \ 34 int cRefs = ASMAtomicIncS32(&((CRContext*)(_ctx))->cRefs); \ 35 CRASSERT(cRefs > 1); \ 36 } while (0) 37 #define CRCONTEXT_RELEASE(_ctx) do { \ 38 int cRefs = ASMAtomicDecS32(&((CRContext*)(_ctx))->cRefs); \ 39 CRASSERT(cRefs >= 0); \ 40 if (!cRefs) { \ 41 crStateFreeContext((_ctx)); \ 42 } \ 43 } while (0) 44 #define SetCurrentContext(_ctx) do { \ 45 CRContext * oldCur = GetCurrentContext(); \ 46 if (oldCur != (_ctx)) { \ 47 if (oldCur) { \ 48 CRCONTEXT_RELEASE(oldCur); \ 49 } \ 50 if ((_ctx)) { \ 51 CRCONTEXT_ADDREF(_ctx); \ 52 } \ 53 crSetTSD(&__contextTSD, _ctx); \ 54 } \ 55 } while (0) 31 #define SetCurrentContext(_ctx) crTSDRefSetCurrent(CRContext, &__contextTSD, _ctx) 56 32 #else 57 33 extern CRContext *__currentContext; -
trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_glsl.c
r39529 r39568 174 174 as the current context isn't the one being destroyed*/ 175 175 #ifdef CHROMIUM_THREADSAFE 176 CRASSERT( !ctx->cRefs);177 ++ctx->cRefs; /* <- this is a hack to avoid subsequent SetCurrentContext(g) do recursive Destroy for ctx */176 CRASSERT(g != ctx); 177 crTSDRefAddRef(ctx); /* <- this is a hack to avoid subsequent SetCurrentContext(g) do recursive Destroy for ctx */ 178 178 if (g) 179 CRCONTEXT_ADDREF(g); /* <- ensure the g is not destroyed by the following SetCurrentContext call */179 crTSDRefAddRef(g); /* <- ensure the g is not destroyed by the following SetCurrentContext call */ 180 180 SetCurrentContext(ctx); 181 181 #else … … 189 189 SetCurrentContext(g); 190 190 if (g) 191 CRCONTEXT_RELEASE(g);192 --ctx->cRefs; /* <- restore back the cRefs (see above) */191 crTSDRefRelease(g); 192 crTSDRefRelease(ctx); /* <- restore back the cRefs (see above) */ 193 193 #else 194 194 __currentContext = g; -
trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_init.c
r39507 r39568 145 145 } 146 146 147 #ifdef CHROMIUM_THREADSAFE 148 static void 149 crStateFreeContext(CRContext *ctx); 150 static DECLCALLBACK(void) crStateContextDtor(void *pvCtx) 151 { 152 crStateFreeContext((CRContext*)pvCtx); 153 } 154 #endif 155 147 156 /* 148 157 * Helper for crStateCreateContext, below. … … 159 168 ctx->id = i; 160 169 #ifdef CHROMIUM_THREADSAFE 161 c tx->cRefs = 1;170 crTSDRefInit(ctx, crStateContextDtor); 162 171 #endif 163 172 ctx->flush_func = NULL; … … 261 270 262 271 /*@todo crStateAttribDestroy*/ 263 void272 static void 264 273 crStateFreeContext(CRContext *ctx) 265 274 { … … 312 321 #ifdef CHROMIUM_THREADSAFE 313 322 SetCurrentContext(NULL); 314 CRCONTEXT_RELEASE(defaultContext);323 crTSDRefRelease(defaultContext); 315 324 #else 316 325 crStateFreeContext(defaultContext); … … 448 457 449 458 #ifdef CHROMIUM_THREADSAFE 450 CRCONTEXT_RELEASE(ctx);459 crTSDRefRelease(ctx); 451 460 #else 452 461 crStateFreeContext(ctx);
Note:
See TracChangeset
for help on using the changeset viewer.