void MtSync_Destruct(CMtSync *p) { if (Thread_WasCreated(&p->thread)) { MtSync_StopWriting(p); p->exit = True; if (p->needStart) Event_Set(&p->canStart); Thread_Wait(&p->thread); Thread_Close(&p->thread); } if (p->csWasInitialized) { CriticalSection_Delete(&p->cs); p->csWasInitialized = False; } Event_Close(&p->canStart); Event_Close(&p->wasStarted); Event_Close(&p->wasStopped); Semaphore_Close(&p->freeSemaphore); Semaphore_Close(&p->filledSemaphore); p->wasCreated = False; }
WRes LoopThread_StopAndWait(CLoopThread *p) { p->stop = 1; if (Event_Set(&p->startEvent) != 0) return SZ_ERROR_THREAD; return Thread_Wait(&p->thread); }
/** * Thread_Shutdown_ */ static void Thread_Shutdown_(void) { if (thread_pool.num_threads) { thread_t *t = thread_pool.threads; uint16_t i = 0; for (i = 0; i < thread_pool.num_threads; i++, t++) { Thread_Wait(t); SDL_CondSignal(t->cond); SDL_WaitThread(t->thread, NULL); SDL_DestroyCond(t->cond); SDL_DestroyMutex(t->mutex); } Mem_Free(thread_pool.threads); } }
/* * RunThreads */ static void RunThreads(void){ thread_t *t[64]; int i; if(!threads->integer){ ThreadWork(0); return; } lock = SDL_CreateMutex(); for(i = 0; i < threads->integer; i++) t[i] = Thread_Create(ThreadWork, NULL); for(i = 0; i < threads->integer; i++) Thread_Wait(&t[i]); SDL_DestroyMutex(lock); lock = NULL; }
/* * @brief Main entry point for drawing the scene (world and entities). */ void R_DrawView(void) { R_UpdateFrustum(); R_UpdateVis(); R_MarkBspSurfaces(); R_EnableFog(true); R_DrawSkyBox(); // wait for the client to populate our lights array Thread_Wait(&r_view.thread); // now dispatch another thread to cull entities while we draw the world r_view.thread = Thread_Create(R_CullEntities, NULL); R_MarkLights(); const r_sorted_bsp_surfaces_t *surfs = r_model_state.world->bsp->sorted_surfaces; R_DrawOpaqueBspSurfaces(&surfs->opaque); R_DrawOpaqueWarpBspSurfaces(&surfs->opaque_warp); R_DrawAlphaTestBspSurfaces(&surfs->alpha_test); R_EnableBlend(true); R_DrawBackBspSurfaces(&surfs->back); R_DrawMaterialBspSurfaces(&surfs->material); R_DrawFlareBspSurfaces(&surfs->flare); R_EnableBlend(false); R_DrawBspNormals(); // ensure the thread has finished culling entities Thread_Wait(&r_view.thread); // now dispatch another thread to update particles while we draw entities r_view.thread = Thread_Create(R_UpdateParticles, NULL); R_DrawEntities(); R_EnableBlend(true); R_DrawBspLights(); R_DrawBlendBspSurfaces(&surfs->blend); R_DrawBlendWarpBspSurfaces(&surfs->blend_warp); // ensure the thread has finished updating particles Thread_Wait(&r_view.thread); R_DrawParticles(); R_EnableFog(false); R_DrawCoronas(); R_DrawBspLeafs(); R_EnableBlend(false); R_ResetArrayState(); }
/* * @brief Main entry point for drawing the scene (world and entities). */ void R_DrawView(void) { R_UpdateFrustum(); R_UpdateVis(); R_MarkBspSurfaces(); R_EnableFog(true); R_DrawSkyBox(); // wait for the client to fully populate the scene Thread_Wait(r_view.thread); // dispatch threads to cull entities and sort elements while we draw the world thread_t *cull_entities = Thread_Create(R_CullEntities, NULL); thread_t *sort_elements = Thread_Create(R_SortElements, NULL); R_MarkLights(); const r_sorted_bsp_surfaces_t *surfs = r_model_state.world->bsp->sorted_surfaces; R_DrawOpaqueBspSurfaces(&surfs->opaque); R_DrawOpaqueWarpBspSurfaces(&surfs->opaque_warp); R_DrawAlphaTestBspSurfaces(&surfs->alpha_test); R_EnableBlend(true); R_DrawBackBspSurfaces(&surfs->back); R_DrawMaterialBspSurfaces(&surfs->material); R_DrawFlareBspSurfaces(&surfs->flare); R_EnableBlend(false); // wait for entity culling to complete Thread_Wait(cull_entities); R_DrawEntities(); R_EnableBlend(true); // wait for element sorting to complete Thread_Wait(sort_elements); R_DrawElements(); R_EnableFog(false); R_DrawDeveloperTools(); R_DrawCoronas(); R_EnableBlend(false); R_ResetArrayState(); #if 0 vec3_t tmp; VectorMA(r_view.origin, MAX_WORLD_DIST, r_view.forward, tmp); cm_trace_t tr = Cl_Trace(r_view.origin, tmp, NULL, NULL, cl.client_num + 1, MASK_SOLID); if (tr.fraction > 0.0 && tr.fraction < 1.0) { Com_Print("%s: %d: %s\n", tr.surface->name, tr.plane.num, vtos(tr.plane.normal)); } #endif }