Boolean SpawnSDThread(ThreadEntryProcPtr threadProc, ThreadID *tid) { OSErr err; err = NewThread(kCooperativeThread, (ThreadEntryProcPtr)threadProc, (void*) nil, 0, kCreateIfNeeded, (void**)nil, tid); // ^---- 0 means gimme the default stack size from Thread Manager if (err == noErr) YieldToThread(*tid); /* force ctx switch */ else { return false; } return true; }
pascal OSStatus MacOpMessageLoop::sMacMessageLoopHandler(EventHandlerCallRef nextHandler, EventRef inEvent, void *inUserData) { OSStatus retVal = noErr; ThreadID currThread = 0; GetCurrentThread(&currThread); if (gMainThreadID == currThread) { URestoreQDState savedState; MacOpMessageLoop *messageHandler = (MacOpMessageLoop *)inUserData; retVal = messageHandler->MessageLoopHandler(inEvent); } else { ::PostEventToQueue(gMainEventQueue, inEvent, kEventPriorityLow); YieldToThread(gMainThreadID); } return retVal; }