File: SpringMutex.h

package info (click to toggle)
spring 103.0%2Bdfsg2-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 43,720 kB
  • ctags: 63,685
  • sloc: cpp: 368,283; ansic: 33,988; python: 12,417; java: 12,203; awk: 5,879; sh: 1,846; xml: 655; perl: 405; php: 211; objc: 194; makefile: 77; sed: 2
file content (69 lines) | stat: -rw-r--r-- 1,267 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */

#ifndef SPRINGMUTEX_H
#define SPRINGMUTEX_H

//#define USE_FUTEX

#include <atomic>
#if   defined(_WIN32)
	#include "CriticalSection.h"
#elif defined(__APPLE__) || !defined(USE_FUTEX)
	#include <mutex>
#else
	#include "Futex.h"
	#include <mutex>
#endif
#include <boost/thread/shared_mutex.hpp>



namespace spring {
#if   defined(_WIN32)
	typedef CriticalSection mutex;
	typedef CriticalSection recursive_mutex;
#elif defined(__APPLE__) || !defined(USE_FUTEX)
	typedef std::mutex mutex;
	typedef std::recursive_mutex recursive_mutex;
#else
	typedef spring_futex mutex;
	//typedef recursive_futex recursive_mutex;
	typedef std::recursive_mutex recursive_mutex;
#endif


	class spinlock {
	private:
		std::atomic_flag state;

	public:
		spinlock() {
			state.clear();
		}

		void lock()
		{
			while (state.test_and_set(std::memory_order_acquire)) {
				/* busy-wait */
			}
		}
		void unlock()
		{
			state.clear(std::memory_order_release);
		}
	};


	class shared_spinlock : public boost::shared_mutex {
	public:
		void lock() {
			while (!try_lock()) { /* busy-wait */ }
		}

		void lock_shared() {
			while (!try_lock_shared()) { /* busy-wait */ }
		}
	};
}

#endif // SPRINGMUTEX_H