1
2
3
4
5
6 using System;
7 using System.Concepts;
8
9 namespace System.Threading
10 {
11 public class Mutex
12 {
13 public Mutex() : nativeHandle(RtmAllocateMutex())
14 {
15 }
16 public ~Mutex()
17 {
18 if (nativeHandle != null)
19 {
20 RtmFreeMutex(nativeHandle);
21 }
22 }
23 suppress Mutex(const Mutex&);
24 suppress void operator=(Mutex&);
25 suppress Mutex(Mutex&&);
26 suppress void operator=(Mutex&&);
27 public void Lock()
28 {
29 RtmLockMutex(nativeHandle);
30 }
31 public void Unlock()
32 {
33 RtmUnlockMutex(nativeHandle);
34 }
35 private void* nativeHandle;
36 }
37
38 public class RecursiveMutex
39 {
40 public RecursiveMutex() : nativeHandle(RtmAllocateRecursiveMutex())
41 {
42 }
43 public ~RecursiveMutex()
44 {
45 if (nativeHandle != null)
46 {
47 RtmFreeRecursiveMutex(nativeHandle);
48 }
49 }
50 suppress RecursiveMutex(const RecursiveMutex&);
51 suppress void operator=(RecursiveMutex&);
52 suppress RecursiveMutex(RecursiveMutex&&);
53 suppress void operator=(RecursiveMutex&&);
54 public void Lock()
55 {
56 RtmLockRecursiveMutex(nativeHandle);
57 }
58 public void Unlock()
59 {
60 RtmUnlockRecursiveMutex(nativeHandle);
61 }
62 public void* NativeHandle() const
63 {
64 return nativeHandle;
65 }
66 private void* nativeHandle;
67 }
68
69 public class LockGuard<Mtx> where Mtx is Lockable
70 {
71 private typedef LockGuard<Mtx> Self;
72 public LockGuard(Mtx& mtx_) : mtx(mtx_)
73 {
74 mtx.Lock();
75 }
76 public ~LockGuard()
77 {
78 mtx.Unlock();
79 }
80 suppress LockGuard(const Self&);
81 suppress void operator=(const Self&);
82 suppress LockGuard(Self&&);
83 suppress void operator=(Self&&);
84 private Mtx& mtx;
85 }