Changeset 39568 in vbox for trunk/src/VBox/GuestHost/OpenGL/include
- Timestamp:
- Dec 9, 2011 1:52:31 PM (13 years ago)
- Location:
- trunk/src/VBox/GuestHost/OpenGL/include
- Files:
-
- 2 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 }
Note:
See TracChangeset
for help on using the changeset viewer.