File diff r23496:661d21df67d7 → r23497:a0ab44ebd2fa
src/thread/thread_win32.cpp
Show inline comments
 
@@ -46,28 +46,28 @@ public:
 
	{
 
		this->thread = (HANDLE)_beginthreadex(NULL, 0, &stThreadProc, this, CREATE_SUSPENDED, &this->id);
 
		if (this->thread == NULL) return;
 
		ResumeThread(this->thread);
 
	}
 

	
 
	/* virtual */ ~ThreadObject_Win32()
 
	~ThreadObject_Win32() override
 
	{
 
		if (this->thread != NULL) {
 
			CloseHandle(this->thread);
 
			this->thread = NULL;
 
		}
 
	}
 

	
 
	/* virtual */ bool Exit()
 
	bool Exit() override
 
	{
 
		assert(GetCurrentThreadId() == this->id);
 
		/* For now we terminate by throwing an error, gives much cleaner cleanup */
 
		throw OTTDThreadExitSignal();
 
	}
 

	
 
	/* virtual */ void Join()
 
	void Join() override
 
	{
 
		/* You cannot join yourself */
 
		assert(GetCurrentThreadId() != this->id);
 
		WaitForSingleObject(this->thread, INFINITE);
 
	}
 

	
 
@@ -123,42 +123,42 @@ public:
 
	ThreadMutex_Win32() : recursive_count(0)
 
	{
 
		InitializeCriticalSection(&this->critical_section);
 
		this->event = CreateEvent(NULL, FALSE, FALSE, NULL);
 
	}
 

	
 
	/* virtual */ ~ThreadMutex_Win32()
 
	~ThreadMutex_Win32() override
 
	{
 
		DeleteCriticalSection(&this->critical_section);
 
		CloseHandle(this->event);
 
	}
 

	
 
	/* virtual */ void BeginCritical(bool allow_recursive = false)
 
	void BeginCritical(bool allow_recursive = false) override
 
	{
 
		/* windows mutex is recursive by itself */
 
		EnterCriticalSection(&this->critical_section);
 
		this->recursive_count++;
 
		if (!allow_recursive && this->recursive_count != 1) NOT_REACHED();
 
	}
 

	
 
	/* virtual */ void EndCritical(bool allow_recursive = false)
 
	void EndCritical(bool allow_recursive = false) override
 
	{
 
		if (!allow_recursive && this->recursive_count != 1) NOT_REACHED();
 
		this->recursive_count--;
 
		LeaveCriticalSection(&this->critical_section);
 
	}
 

	
 
	/* virtual */ void WaitForSignal()
 
	void WaitForSignal() override
 
	{
 
		assert(this->recursive_count == 1); // Do we need to call Begin/EndCritical multiple times otherwise?
 
		this->EndCritical();
 
		WaitForSingleObject(this->event, INFINITE);
 
		this->BeginCritical();
 
	}
 

	
 
	/* virtual */ void SendSignal()
 
	void SendSignal() override
 
	{
 
		SetEvent(this->event);
 
	}
 
};
 

	
 
/* static */ ThreadMutex *ThreadMutex::New()