Res ThreadRegister(Thread *threadReturn, Arena arena) { Res res; Thread thread; Ring ring; void *p; AVER(threadReturn != NULL); res = ControlAlloc(&p, arena, sizeof(ThreadStruct), /* withReservoirPermit */ FALSE); if(res != ResOK) return res; thread = (Thread)p; thread->arena = arena; RingInit(&thread->arenaRing); thread->sig = ThreadSig; thread->serial = arena->threadSerial; ++arena->threadSerial; AVERT(Thread, thread); ring = ArenaThreadRing(arena); AVER(RingCheckSingle(ring)); /* .single */ RingAppend(ring, &thread->arenaRing); *threadReturn = thread; return ResOK; }
Res ThreadRegister(Thread *threadReturn, Arena arena) { Res res; Thread thread; Ring ring; void *p; AVER(threadReturn != NULL); res = ControlAlloc(&p, arena, sizeof(ThreadStruct)); if (res != ResOK) return res; thread = (Thread)p; thread->arena = arena; RingInit(&thread->arenaRing); thread->serial = arena->threadSerial; ++arena->threadSerial; thread->alive = TRUE; thread->forking = FALSE; thread->port = mach_thread_self(); AVER(MACH_PORT_VALID(thread->port)); thread->sig = ThreadSig; AVERT(Thread, thread); ProtThreadRegister(); ring = ArenaThreadRing(arena); RingAppend(ring, &thread->arenaRing); *threadReturn = thread; return ResOK; }
Res ThreadRegister(Thread *threadReturn, Arena arena) { Res res; Thread thread; void *p; AVER(threadReturn != NULL); AVERT(Arena, arena); res = ControlAlloc(&p, arena, sizeof(ThreadStruct), /* withReservoirPermit */ FALSE); if(res != ResOK) return res; thread = (Thread)p; thread->id = pthread_self(); RingInit(&thread->arenaRing); thread->sig = ThreadSig; thread->serial = arena->threadSerial; ++arena->threadSerial; thread->arena = arena; thread->mfc = NULL; PThreadextInit(&thread->thrextStruct, thread->id); AVERT(Thread, thread); RingAppend(ArenaThreadRing(arena), &thread->arenaRing); *threadReturn = thread; return ResOK; }
void (ShieldSuspend)(Arena arena) { AVERT(Arena, arena); AVER(arena->insideShield); if (!arena->suspended) { ThreadRingSuspend(ArenaThreadRing(arena)); arena->suspended = TRUE; } }
static void shieldSuspend(Arena arena) { Shield shield; AVERT(Arena, arena); shield = ArenaShield(arena); AVER(shield->inside); if (!shield->suspended) { ThreadRingSuspend(ArenaThreadRing(arena), ArenaDeadRing(arena)); shield->suspended = TRUE; } }
void (ShieldLeave)(Arena arena) { AVERT(Arena, arena); AVER(arena->insideShield); ShieldFlush(arena); /* Cache is empty so inv.outside.depth holds */ AVER(arena->shDepth == 0); /* Ensuring the mutator is running at this point * guarantees inv.outside.running */ if (arena->suspended) { ThreadRingResume(ArenaThreadRing(arena)); arena->suspended = FALSE; } arena->insideShield = FALSE; }
Res ThreadRegister(Thread *threadReturn, Arena arena) { Res res; Thread thread; HANDLE procHandle; BOOL b; void *p; AVER(threadReturn != NULL); AVERT(Arena, arena); res = ControlAlloc(&p, arena, sizeof(ThreadStruct), /* withReservoirPermit */ FALSE); if(res != ResOK) return res; thread = (Thread)p; /* avoid pun */ /* Duplicate handle gives us a new handle with updated privileges. * .thread.handle describes the ones needed. */ procHandle = GetCurrentProcess(); b = DuplicateHandle(procHandle, GetCurrentThread(), procHandle, &thread->handle, THREAD_SUSPEND_RESUME | THREAD_GET_CONTEXT, FALSE, 0); if(!b) return ResRESOURCE; thread->id = GetCurrentThreadId(); RingInit(&thread->arenaRing); thread->sig = ThreadSig; thread->serial = arena->threadSerial; ++arena->threadSerial; thread->arena = arena; AVERT(Thread, thread); RingAppend(ArenaThreadRing(arena), &thread->arenaRing); *threadReturn = thread; return ResOK; }
void (ShieldLeave)(Arena arena) { Shield shield; AVERT(Arena, arena); shield = ArenaShield(arena); AVER(shield->inside); AVER(shield->depth == 0); /* no pending covers */ AVER(shield->holds == 0); ShieldFlush(arena); AVER(shield->unsynced == 0); /* everything back in sync */ /* Ensuring the mutator is running at this point guarantees .inv.outside.running */ if (shield->suspended) { ThreadRingResume(ArenaThreadRing(arena), ArenaDeadRing(arena)); shield->suspended = FALSE; } shield->inside = FALSE; }