diff --git a/ClassicalSharp/GraphicsAPI/Direct3D9Api.cs b/ClassicalSharp/GraphicsAPI/Direct3D9Api.cs index 623f0422e..f02b01fc8 100644 --- a/ClassicalSharp/GraphicsAPI/Direct3D9Api.cs +++ b/ClassicalSharp/GraphicsAPI/Direct3D9Api.cs @@ -561,7 +561,7 @@ namespace ClassicalSharp.GraphicsAPI { internal override void UpdateApiInfo() { float mem = VideoMemoryMB; - ApiInfo[3] = "Video memory: " + totalMem + " MB total, " + mem + " now"; + ApiInfo[3] = "Video memory: " + totalMem + " MB total, " + mem + " free"; } public override void TakeScreenshot(Stream output, int width, int height) { diff --git a/ClassicalSharp/GraphicsAPI/OpenGLApi.cs b/ClassicalSharp/GraphicsAPI/OpenGLApi.cs index 7f08e817f..f4d84f103 100644 --- a/ClassicalSharp/GraphicsAPI/OpenGLApi.cs +++ b/ClassicalSharp/GraphicsAPI/OpenGLApi.cs @@ -570,7 +570,7 @@ namespace ClassicalSharp.GraphicsAPI { if (totalKb <= 0 || curKb <= 0) return; float total = totalKb / 1024f, cur = curKb / 1024f; - ApiInfo[4] = "Video memory: " + total + " MB total, " + cur + " now"; + ApiInfo[4] = "Video memory: " + total + " MB total, " + cur + " free"; } public override bool WarnIfNecessary(Chat chat) { diff --git a/src/AsyncDownloader.c b/src/AsyncDownloader.c index 3a6572697..091daedbd 100644 --- a/src/AsyncDownloader.c +++ b/src/AsyncDownloader.c @@ -286,7 +286,7 @@ static void AsyncDownloader_Init(void) { async_pendingMutex = Mutex_Create(); async_processedMutex = Mutex_Create(); async_curRequestMutex = Mutex_Create(); - async_workerThread = Thread_Start(AsyncDownloader_WorkerFunc); + async_workerThread = Thread_Start(AsyncDownloader_WorkerFunc, false); } static void AsyncDownloader_Reset(void) { @@ -302,7 +302,6 @@ static void AsyncDownloader_Free(void) { async_terminate = true; AsyncDownloader_Reset(); Thread_Join(async_workerThread); - Thread_FreeHandle(async_workerThread); AsyncRequestList_Free(&async_pending); AsyncRequestList_Free(&async_processed); diff --git a/src/Audio.c b/src/Audio.c index 2840446bb..d8c2bc1df 100644 --- a/src/Audio.c +++ b/src/Audio.c @@ -438,7 +438,7 @@ static void Music_Init(void) { if (music_thread) return; music_pendingStop = false; Audio_Init(&music_out, AUDIO_MAX_CHUNKS); - music_thread = Thread_Start(Music_RunLoop); + music_thread = Thread_Start(Music_RunLoop, false); } static void Music_Free(void) { @@ -447,7 +447,6 @@ static void Music_Free(void) { if (music_out == -1) return; Thread_Join(music_thread); - Thread_FreeHandle(music_thread); Audio_Free(music_out); music_out = -1; music_thread = NULL; diff --git a/src/Core.h b/src/Core.h index 90710b524..ca75ae0e3 100644 --- a/src/Core.h +++ b/src/Core.h @@ -60,7 +60,7 @@ struct FontDesc { void* Handle; UInt16 Size, Style; }; #define UInt32_MaxValue ((UInt32)4294967295UL) #define CC_BUILD_GL11 false -#define CC_BUILD_D3D9 false +#define CC_BUILD_D3D9 true #define CC_BUILD_WIN true #define CC_BUILD_OSX false diff --git a/src/D3D9Api.c b/src/D3D9Api.c index cb42ef5f7..2f3020f44 100644 --- a/src/D3D9Api.c +++ b/src/D3D9Api.c @@ -668,7 +668,7 @@ void Gfx_MakeApiInfo(void) { void Gfx_UpdateApiInfo(void) { Real32 mem = IDirect3DDevice9_GetAvailableTextureMem(device) / (1024.0f * 1024.0f); Gfx_ApiInfo[3].length = 0; - String_Format2(&Gfx_ApiInfo[3], "Video memory: %f2 MB total, %f2 now", &d3d9_totalMem, &mem); + String_Format2(&Gfx_ApiInfo[3], "Video memory: %f2 MB total, %f2 free", &d3d9_totalMem, &mem); } void Gfx_OnWindowResize(void) { diff --git a/src/OpenGLApi.c b/src/OpenGLApi.c index 69f90d298..c22ebfea9 100644 --- a/src/OpenGLApi.c +++ b/src/OpenGLApi.c @@ -569,7 +569,7 @@ void Gfx_UpdateApiInfo(void) { if (totalKb <= 0 || curKb <= 0) return; Gfx_ApiInfo[4].length = 0; Real32 total = totalKb / 1024.0f, cur = curKb / 1024.0f; - String_Format2(&Gfx_ApiInfo[4], "Video memory: %f2 MB total, %f2 now", &total, &cur); + String_Format2(&Gfx_ApiInfo[4], "Video memory: %f2 MB total, %f2 free", &total, &cur); } bool Gfx_WarnIfNecessary(void) { diff --git a/src/Platform.c b/src/Platform.c index 4b70cb41e..8e033b676 100644 --- a/src/Platform.c +++ b/src/Platform.c @@ -506,23 +506,26 @@ DWORD WINAPI Thread_StartCallback(LPVOID lpParam) { return 0; } -void* Thread_Start(Thread_StartFunc* func) { +static void Thread_FreeHandle(void* handle) { + if (!CloseHandle((HANDLE)handle)) { + ErrorHandler_FailWithCode(GetLastError(), "Freeing thread handle"); + } +} + +void* Thread_Start(Thread_StartFunc* func, bool detach) { DWORD threadID; void* handle = CreateThread(NULL, 0, Thread_StartCallback, func, 0, &threadID); if (!handle) { ErrorHandler_FailWithCode(GetLastError(), "Creating thread"); } + + if (detach) Thread_FreeHandle(handle); return handle; } void Thread_Join(void* handle) { WaitForSingleObject((HANDLE)handle, INFINITE); -} - -void Thread_FreeHandle(void* handle) { - if (!CloseHandle((HANDLE)handle)) { - ErrorHandler_FailWithCode(GetLastError(), "Freeing thread handle"); - } + Thread_FreeHandle(handle); } CRITICAL_SECTION mutexList[3]; Int32 mutexIndex; @@ -568,12 +571,16 @@ void* Thread_StartCallback(void* lpParam) { } pthread_t threadList[3]; Int32 threadIndex; -void* Thread_Start(Thread_StartFunc* func) { +void* Thread_Start(Thread_StartFunc* func, bool detach) { if (threadIndex == Array_Elems(threadList)) ErrorHandler_Fail("Cannot allocate thread"); pthread_t* ptr = &threadList[threadIndex]; int result = pthread_create(ptr, NULL, Thread_StartCallback, func); - ErrorHandler_CheckOrFail(result, "Creating thread"); + + if (detach) { + result = pthread_detach(*ptr); + ErrorHandler_CheckOrFail(result, "Detaching thread"); + } threadIndex++; return ptr; } @@ -582,11 +589,6 @@ void Thread_Join(void* handle) { ErrorHandler_CheckOrFail(result, "Joining thread"); } -void Thread_FreeHandle(void* handle) { - int result = pthread_detach(*((pthread_t*)handle)); - ErrorHandler_CheckOrFail(result, "Detaching thread"); -} - pthread_mutex_t mutexList[3]; Int32 mutexIndex; void* Mutex_Create(void) { if (mutexIndex == Array_Elems(mutexList)) ErrorHandler_Fail("Cannot allocate mutex"); diff --git a/src/Platform.h b/src/Platform.h index 0fb5d44b2..7e1972300 100644 --- a/src/Platform.h +++ b/src/Platform.h @@ -74,10 +74,8 @@ ReturnCode File_Length(void* file, UInt32* length); void Thread_Sleep(UInt32 milliseconds); typedef void Thread_StartFunc(void); -void* Thread_Start(Thread_StartFunc* func); +void* Thread_Start(Thread_StartFunc* func, bool detach); void Thread_Join(void* handle); -/* Frees handle to thread - NOT THE THREAD ITSELF */ -void Thread_FreeHandle(void* handle); void* Mutex_Create(void); void Mutex_Free(void* handle); diff --git a/src/Screens.c b/src/Screens.c index 84ae228a8..35bc03e3d 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -620,12 +620,10 @@ static void GeneratingScreen_Init(void* screen) { void* threadHandle; if (Gen_Vanilla) { - threadHandle = Thread_Start(&NotchyGen_Generate); + Thread_Start(&NotchyGen_Generate, true); } else { - threadHandle = Thread_Start(&FlatgrassGen_Generate); + Thread_Start(&FlatgrassGen_Generate, true); } - /* don't leak thread handle here */ - Thread_FreeHandle(threadHandle); } static void GeneratingScreen_EndGeneration(void) {