Changeset 4298 for trunk/src/kernel32/wintls.cpp
- Timestamp:
- Sep 21, 2000, 9:44:32 PM (25 years ago)
- File:
-
- 1 edited
-
trunk/src/kernel32/wintls.cpp (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/wintls.cpp
r4285 r4298 1 /* $Id: wintls.cpp,v 1.1 2 2000-09-20 21:32:54 hughExp $ */1 /* $Id: wintls.cpp,v 1.13 2000-09-21 19:39:57 sandervl Exp $ */ 2 2 /* 3 3 * Win32 TLS API functions … … 25 25 { 26 26 if(!tlsAddress) 27 return;27 return; 28 28 29 29 tlsIndex = TlsAlloc(); 30 30 if(tlsIndex >= TLS_MINIMUM_AVAILABLE) { 31 dprintf(("tlsAttachThread: invalid tlsIndex %x!!!!", tlsIndex));32 DebugInt3();33 return;31 dprintf(("tlsAttachThread: invalid tlsIndex %x!!!!", tlsIndex)); 32 DebugInt3(); 33 return; 34 34 } 35 35 dprintf(("Win32ImageBase::tlsAlloc (%d) for module %x", tlsIndex, hinstance)); … … 40 40 { 41 41 if(!tlsAddress) 42 return;42 return; 43 43 44 44 if(tlsIndex >= TLS_MINIMUM_AVAILABLE) { 45 dprintf(("tlsAttachThread: invalid tlsIndex %x!!!!", tlsIndex));46 DebugInt3();47 return;45 dprintf(("tlsAttachThread: invalid tlsIndex %x!!!!", tlsIndex)); 46 DebugInt3(); 47 return; 48 48 } 49 49 dprintf(("Win32ImageBase::tlsDestroy (%d) for module %x", tlsIndex, hinstance)); … … 60 60 61 61 if(!tlsAddress) 62 return;62 return; 63 63 64 64 if(tlsIndex >= TLS_MINIMUM_AVAILABLE) { 65 dprintf(("tlsAttachThread: invalid tlsIndex %x!!!!", tlsIndex));66 DebugInt3();67 return;65 dprintf(("tlsAttachThread: invalid tlsIndex %x!!!!", tlsIndex)); 66 DebugInt3(); 67 return; 68 68 } 69 69 … … 77 77 tibmem = VirtualAlloc(0, tlsTotalSize, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE); 78 78 if(tibmem == NULL) { 79 dprintf(("tlsAttachThread: tibmem == NULL!!!!"));80 DebugInt3();81 return;79 dprintf(("tlsAttachThread: tibmem == NULL!!!!")); 80 DebugInt3(); 81 return; 82 82 } 83 83 memset(tibmem, 0, tlsTotalSize); … … 88 88 89 89 if(tlsCallBackAddr && (ULONG)*tlsCallBackAddr != 0) { 90 pCallback = tlsCallBackAddr;91 while(*pCallback) {92 dprintf(("tlsAttachThread: calling TLS Callback %x", *pCallback));93 94 (*pCallback)((LPVOID)hinstance, DLL_THREAD_ATTACH, 0);95 96 dprintf(("tlsAttachThread: finished calling TLS Callback %x", *pCallback));97 *pCallback++;98 }90 pCallback = tlsCallBackAddr; 91 while(*pCallback) { 92 dprintf(("tlsAttachThread: calling TLS Callback %x", *pCallback)); 93 94 (*pCallback)((LPVOID)hinstance, DLL_THREAD_ATTACH, 0); 95 96 dprintf(("tlsAttachThread: finished calling TLS Callback %x", *pCallback)); 97 *pCallback++; 98 } 99 99 } 100 100 return; … … 109 109 110 110 if(!tlsAddress) 111 return;111 return; 112 112 113 113 dprintf(("Win32ImageBase::tlsDetachThread for module %x, thread id %x", hinstance, GetCurrentThreadId())); 114 114 115 115 if(tlsCallBackAddr && (ULONG)*tlsCallBackAddr != 0) { 116 pCallback = tlsCallBackAddr;117 while(*pCallback) {118 dprintf(("tlsDetachThread: calling TLS Callback %x", *pCallback));119 120 (*pCallback)((LPVOID)hinstance, DLL_THREAD_DETACH, 0);121 122 dprintf(("tlsDetachThread: finished calling TLS Callback %x", *pCallback));123 *pCallback++;124 }116 pCallback = tlsCallBackAddr; 117 while(*pCallback) { 118 dprintf(("tlsDetachThread: calling TLS Callback %x", *pCallback)); 119 120 (*pCallback)((LPVOID)hinstance, DLL_THREAD_DETACH, 0); 121 122 dprintf(("tlsDetachThread: finished calling TLS Callback %x", *pCallback)); 123 *pCallback++; 124 } 125 125 } 126 126 tlsmem = TlsGetValue(tlsIndex); 127 127 if(tlsmem) { 128 VirtualFree(tlsmem, tlsTotalSize, MEM_RELEASE);128 VirtualFree(tlsmem, tlsTotalSize, MEM_RELEASE); 129 129 } 130 130 else { 131 dprintf(("ERROR: tlsDetachThread: tlsmem == NULL!!!"));131 dprintf(("ERROR: tlsDetachThread: tlsmem == NULL!!!")); 132 132 } 133 133 TlsFree(tlsIndex); … … 154 154 tibidx = 0; 155 155 if(pdb->tls_bits[0] == 0xFFFFFFFF) { 156 if(pdb->tls_bits[1] == 0xFFFFFFFF) {157 LeaveCriticalSection(&pdb->crit_section);158 SetLastError(ERROR_NO_MORE_ITEMS); //TODO: correct error?159 return -1;160 }161 tibidx = 1;156 if(pdb->tls_bits[1] == 0xFFFFFFFF) { 157 LeaveCriticalSection(&pdb->crit_section); 158 SetLastError(ERROR_NO_MORE_ITEMS); //TODO: correct error? 159 return -1; 160 } 161 tibidx = 1; 162 162 } 163 163 for(i=0;i<32;i++) { 164 mask = (1 << i);165 if((pdb->tls_bits[tibidx] & mask) == 0) {166 pdb->tls_bits[tibidx] |= mask;167 index = (tibidx*32) + i;168 break;169 }164 mask = (1 << i); 165 if((pdb->tls_bits[tibidx] & mask) == 0) { 166 pdb->tls_bits[tibidx] |= mask; 167 index = (tibidx*32) + i; 168 break; 169 } 170 170 } 171 171 LeaveCriticalSection(&pdb->crit_section); … … 205 205 if(pdb->tls_bits[tlsidx] & mask) { 206 206 LeaveCriticalSection(&pdb->crit_section); 207 pdb->tls_bits[tlsidx] &= ~mask;207 pdb->tls_bits[tlsidx] &= ~mask; 208 208 thdb->tls_array[index] = 0; 209 209 SetLastError(ERROR_SUCCESS); 210 return TRUE;210 return TRUE; 211 211 } 212 212 LeaveCriticalSection(&pdb->crit_section);
Note:
See TracChangeset
for help on using the changeset viewer.
