forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			61 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			61 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | #include <kinc/threads/mutex.h>
 | ||
|  | 
 | ||
|  | void kinc_mutex_init(kinc_mutex_t *mutex) { | ||
|  | 	assert(sizeof(RTL_CRITICAL_SECTION) == sizeof(kinc_microsoft_critical_section_t)); | ||
|  | 	InitializeCriticalSection((LPCRITICAL_SECTION)&mutex->impl.criticalSection); | ||
|  | } | ||
|  | 
 | ||
|  | void kinc_mutex_destroy(kinc_mutex_t *mutex) { | ||
|  | 	DeleteCriticalSection((LPCRITICAL_SECTION)&mutex->impl.criticalSection); | ||
|  | } | ||
|  | 
 | ||
|  | void kinc_mutex_lock(kinc_mutex_t *mutex) { | ||
|  | 	EnterCriticalSection((LPCRITICAL_SECTION)&mutex->impl.criticalSection); | ||
|  | } | ||
|  | 
 | ||
|  | bool kinc_mutex_try_to_lock(kinc_mutex_t *mutex) { | ||
|  | 	return TryEnterCriticalSection((LPCRITICAL_SECTION)&mutex->impl.criticalSection); | ||
|  | } | ||
|  | 
 | ||
|  | void kinc_mutex_unlock(kinc_mutex_t *mutex) { | ||
|  | 	LeaveCriticalSection((LPCRITICAL_SECTION)&mutex->impl.criticalSection); | ||
|  | } | ||
|  | 
 | ||
|  | bool kinc_uber_mutex_init(kinc_uber_mutex_t *mutex, const char *name) { | ||
|  | #if defined(KINC_WINDOWS) || defined(KINC_WINDOWSAPP)
 | ||
|  | 	mutex->impl.id = (void *)CreateMutexA(NULL, FALSE, name); | ||
|  | 	HRESULT res = GetLastError(); | ||
|  | 	if (res && res != ERROR_ALREADY_EXISTS) { | ||
|  | 		mutex->impl.id = NULL; | ||
|  | 		assert(false); | ||
|  | 		return false; | ||
|  | 	} | ||
|  | 	return true; | ||
|  | #else
 | ||
|  | 	return false; | ||
|  | #endif
 | ||
|  | } | ||
|  | 
 | ||
|  | void kinc_uber_mutex_destroy(kinc_uber_mutex_t *mutex) { | ||
|  | #if defined(KINC_WINDOWS) || defined(KINC_WINDOWSAPP)
 | ||
|  | 	if (mutex->impl.id) { | ||
|  | 		CloseHandle((HANDLE)mutex->impl.id); | ||
|  | 		mutex->impl.id = NULL; | ||
|  | 	} | ||
|  | #endif
 | ||
|  | } | ||
|  | 
 | ||
|  | void kinc_uber_mutex_lock(kinc_uber_mutex_t *mutex) { | ||
|  | #if defined(KINC_WINDOWS) || defined(KINC_WINDOWSAPP)
 | ||
|  | 	bool succ = WaitForSingleObject((HANDLE)mutex->impl.id, INFINITE) == WAIT_FAILED ? false : true; | ||
|  | 	assert(succ); | ||
|  | #endif
 | ||
|  | } | ||
|  | 
 | ||
|  | void kinc_uber_mutex_unlock(kinc_uber_mutex_t *mutex) { | ||
|  | #if defined(KINC_WINDOWS) || defined(KINC_WINDOWSAPP)
 | ||
|  | 	bool succ = ReleaseMutex((HANDLE)mutex->impl.id) == FALSE ? false : true; | ||
|  | 	assert(succ); | ||
|  | #endif
 | ||
|  | } |