// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "Thread.hpp"

namespace rr {

Thread::Thread(void (*threadFunction)(void *parameters), void *parameters)
{
	Event init;
	Entry entry = {threadFunction, parameters, &init};

	#if defined(_WIN32)
		handle = CreateThread(NULL, 1024 * 1024, startFunction, &entry, 0, NULL);
	#else
		pthread_create(&handle, NULL, startFunction, &entry);
	#endif

	init.wait();
}

Thread::~Thread()
{
	join();   // Make threads exit before deleting them to not block here
}

void Thread::join()
{
	if(!hasJoined)
	{
		#if defined(_WIN32)
			WaitForSingleObject(handle, INFINITE);
			CloseHandle(handle);
		#else
			pthread_join(handle, NULL);
		#endif

		hasJoined = true;
	}
}

#if defined(_WIN32)
	unsigned long __stdcall Thread::startFunction(void *parameters)
	{
		Entry entry = *(Entry*)parameters;
		entry.init->signal();
		entry.threadFunction(entry.threadParameters);
		return 0;
	}
#else
	void *Thread::startFunction(void *parameters)
	{
		Entry entry = *(Entry*)parameters;
		entry.init->signal();
		entry.threadFunction(entry.threadParameters);
		return nullptr;
	}
#endif

Event::Event()
{
	#if defined(_WIN32)
		handle = CreateEvent(NULL, FALSE, FALSE, NULL);
	#else
		pthread_cond_init(&handle, NULL);
		pthread_mutex_init(&mutex, NULL);
		signaled = false;
	#endif
}

Event::~Event()
{
	#if defined(_WIN32)
		CloseHandle(handle);
	#else
		pthread_cond_destroy(&handle);
		pthread_mutex_destroy(&mutex);
	#endif
}

}  // namespace rr
