// 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.

#ifndef rr_MutexLock_hpp
#define rr_MutexLock_hpp

#include "Thread.hpp"

#if defined(__linux__)
// Use a pthread mutex on Linux. Since many processes may use Reactor
// at the same time it's best to just have the scheduler overhead.
#	include <pthread.h>

namespace rr {

class MutexLock
{
public:
	MutexLock()
	{
		pthread_mutex_init(&mutex, NULL);
	}

	~MutexLock()
	{
		pthread_mutex_destroy(&mutex);
	}

	bool attemptLock()
	{
		return pthread_mutex_trylock(&mutex) == 0;
	}

	void lock()
	{
		pthread_mutex_lock(&mutex);
	}

	void unlock()
	{
		pthread_mutex_unlock(&mutex);
	}

private:
	pthread_mutex_t mutex;
};

}  // namespace rr

#else  // !__linux__

#	include <atomic>

namespace rr {

class BackoffLock
{
public:
	BackoffLock()
	{
		mutex = 0;
	}

	bool attemptLock()
	{
		if(!isLocked())
		{
			if(mutex.exchange(true) == false)
			{
				return true;
			}
		}

		return false;
	}

	void lock()
	{
		int backoff = 1;

		while(!attemptLock())
		{
			if(backoff <= 64)
			{
				for(int i = 0; i < backoff; i++)
				{
					nop();
					nop();
					nop();
					nop();
					nop();

					nop();
					nop();
					nop();
					nop();
					nop();

					nop();
					nop();
					nop();
					nop();
					nop();

					nop();
					nop();
					nop();
					nop();
					nop();

					nop();
					nop();
					nop();
					nop();
					nop();

					nop();
					nop();
					nop();
					nop();
					nop();

					nop();
					nop();
					nop();
					nop();
					nop();
				}

				backoff *= 2;
			}
			else
			{
				Thread::yield();

				backoff = 1;
			}
		};
	}

	void unlock()
	{
		mutex.store(false, std::memory_order_release);
	}

	bool isLocked()
	{
		return mutex.load(std::memory_order_acquire);
	}

private:
	struct
	{
		// Ensure that the mutex variable is on its own 64-byte cache line to avoid false sharing
		// Padding must be public to avoid compiler warnings
		volatile int padding1[16];
		std::atomic<bool> mutex;
		volatile int padding2[15];
	};
};

using MutexLock = BackoffLock;

}  // namespace rr

#endif  // !__linux__

#endif  // rr_MutexLock_hpp
