mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-16 11:06:06 -04:00
C client: Fix crashing when turning off music then back on again on linux
This commit is contained in:
parent
d8ed9b77a2
commit
cd1961f588
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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");
|
||||
|
@ -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);
|
||||
|
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user