? t ? t2 Index: ThreadWin32.i3 =================================================================== RCS file: /usr/cvs/cm3/m3-libs/m3core/src/thread/WIN32/ThreadWin32.i3,v retrieving revision 1.21 diff -u -r1.21 ThreadWin32.i3 --- ThreadWin32.i3 22 Nov 2009 11:11:27 -0000 1.21 +++ ThreadWin32.i3 22 Nov 2009 11:37:56 -0000 @@ -7,15 +7,14 @@ UNSAFE INTERFACE ThreadWin32; -FROM WinDef IMPORT LONG, BOOL(*int*); +FROM WinDef IMPORT LONG; FROM Thread IMPORT T; FROM ThreadF IMPORT State; -(*----------------------------------------- Exceptions, types and globals ---*) +(*---------------------------------------------------------------------------*) (* locks (aka critical section aka mutex) *) -(*---------------------------------------------------------------------------*) TYPE Lock_t = ADDRESS; @@ -42,22 +41,18 @@ (*------------------------------------------------------------------ Self ---*) -(* thread local threadIndex: TlsGetValue, TlsSetValue - GetValue called before InitC returns 0 (aka NULL) - SetValue called before InitC returns 0 (aka FALSE) -*) -<*EXTERNAL ThreadWin32__TlsSetValue_threadIndex*> -PROCEDURE TlsSetValue_threadIndex(a: INTEGER): BOOL; -<*EXTERNAL ThreadWin32__TlsGetValue_threadIndex*> -PROCEDURE TlsGetValue_threadIndex(): INTEGER; +(* The untraced state of a thread, a thread local. *) +TYPE Activation <: ADDRESS; + +<*EXTERNAL ThreadWin32__SetActivation*> PROCEDURE SetActivation (act: Activation); +<*EXTERNAL ThreadWin32__GetActivation*> PROCEDURE GetActivation (): Activation; (*------------------------------------------------------ ShowThread hooks ---*) <*EXTERNAL ThreadWin32__perfLock*> VAR perfLock: Lock_t; (*------------------------------------------------------------- collector ---*) -(* These procedures provide synchronization primitives for the allocator - and collector. *) +(* synchronization for the allocator and collector. *) <*EXTERNAL ThreadWin32__heapLock*> VAR heapLock: Lock_t; Index: ThreadWin32.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-libs/m3core/src/thread/WIN32/ThreadWin32.m3,v retrieving revision 1.116 diff -u -r1.116 ThreadWin32.m3 --- ThreadWin32.m3 22 Nov 2009 11:11:27 -0000 1.116 +++ ThreadWin32.m3 22 Nov 2009 11:37:56 -0000 @@ -12,7 +12,7 @@ IMPORT Word, MutexRep, RTHeapRep, RTCollectorSRC; IMPORT ThreadEvent, RTPerfTool, RTProcess, ThreadDebug; FROM Compiler IMPORT ThisFile, ThisLine; -FROM WinNT IMPORT LONG, HANDLE, DWORD, SIZE_T, DUPLICATE_SAME_ACCESS; +FROM WinNT IMPORT LONG, HANDLE, DWORD, DUPLICATE_SAME_ACCESS; FROM WinBase IMPORT WaitForSingleObject, INFINITE, ReleaseSemaphore, GetCurrentProcess, DuplicateHandle, GetCurrentThread, CreateSemaphore, CloseHandle, CreateThread, ResumeThread, Sleep, SuspendThread, @@ -60,7 +60,7 @@ END; TYPE - Activation = UNTRACED REF RECORD + REVEAL Activation = UNTRACED BRANDED REF RECORD frame: ADDRESS := NIL; (* exception handling support; this field is accessed MANY times so perhaps therefore should be first *) next, prev: Activation := NIL; (* LL = activeMu; global doubly-linked, circular list of all active threads *) @@ -167,7 +167,7 @@ (********** PROCEDURE DumpSlots () = VAR - me := LOOPHOLE (TlsGetValue_threadIndex(), Activation); + me := GetActivation(); BEGIN RTIO.PutText ("me = "); RTIO.PutAddr (me); @@ -336,21 +336,6 @@ next_slot := 1; slots : REF ARRAY OF T; (* NOTE: we don't use slots[0]. *) -PROCEDURE SetActivation (act: Activation) = - (* LL = 0 *) - BEGIN - IF TlsSetValue_threadIndex(LOOPHOLE (act, SIZE_T)) = 0 THEN - Choke(ThisLine()); - END; - END SetActivation; - -PROCEDURE GetActivation (): Activation = - (* If not the initial thread and not created by Fork, returns NIL *) - (* LL = 0 *) - BEGIN - RETURN LOOPHOLE (TlsGetValue_threadIndex(), Activation); - END GetActivation; - PROCEDURE Self (): T = (* If not the initial thread and not created by Fork, returns NIL *) (* LL = 0 *) Index: ThreadWin32C.c =================================================================== RCS file: /usr/cvs/cm3/m3-libs/m3core/src/thread/WIN32/ThreadWin32C.c,v retrieving revision 1.19 diff -u -r1.19 ThreadWin32C.c --- ThreadWin32C.c 22 Nov 2009 11:11:27 -0000 1.19 +++ ThreadWin32C.c 22 Nov 2009 11:37:56 -0000 @@ -30,22 +30,7 @@ CRITSEC(perf) CRITSEC(slot) -#define THREAD_LOCAL(name) \ -DWORD ThreadWin32__##name = TLS_OUT_OF_INDEXES; \ -void* __cdecl ThreadWin32__TlsGetValue_##name(void) \ -{ \ - if (ThreadWin32__##name == TLS_OUT_OF_INDEXES) \ - return 0; \ - return TlsGetValue(ThreadWin32__##name); \ -} \ -BOOL __cdecl ThreadWin32__TlsSetValue_##name(void* a) \ -{ \ - if (ThreadWin32__##name == TLS_OUT_OF_INDEXES) \ - return 0; \ - return TlsSetValue(ThreadWin32__##name, a); \ -} - -THREAD_LOCAL(threadIndex) +DWORD ThreadWin32__threadIndex = TLS_OUT_OF_INDEXES; void __cdecl ThreadWin32__InitC(void) { @@ -56,6 +41,7 @@ InitializeCriticalSection(&perfLock); InitializeCriticalSection(&slotLock); ThreadWin32__threadIndex = TlsAlloc(); + /* NOTE: This CAN fail. */ assert(ThreadWin32__threadIndex != TLS_OUT_OF_INDEXES); } @@ -145,6 +131,25 @@ HeapFree(GetProcessHeap(), 0, lock); } +void __cdecl ThreadWin32__SetActivation(void* act) + /* LL = 0 */ + /* This function is called VERY frequently. */ +{ + BOOL success; + assert(ThreadWin32__threadIndex != TLS_OUT_OF_INDEXES); + success = TlsSetValue(ThreadWin32__threadIndex, act); + /* NOTE: This CAN fail. */ + assert(success); +} + +void* __cdecl ThreadWin32__GetActivation(void) + /* If not the initial thread and not created by Fork, returns NIL */ + /* LL = 0 */ + /* This function is called VERY frequently. */ +{ + assert(ThreadWin32__threadIndex != TLS_OUT_OF_INDEXES); + return TlsGetValue(ThreadWin32__threadIndex); +} #ifdef __cplusplus } /* extern "C" */