1 /*
2  Copyright (C) 2004-2008 Grame
3 
4  This program is free software; you can redistribute it and/or modify
5  it under the terms of the GNU Lesser General Public License as published by
6  the Free Software Foundation; either version 2.1 of the License, or
7  (at your option) any later version.
8 
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  GNU Lesser General Public License for more details.
13 
14  You should have received a copy of the GNU Lesser General Public License
15  along with this program; if not, write to the Free Software
16  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 
18  */
19 
20 #include "JackWinMutex.h"
21 #include "JackError.h"
22 
23 namespace Jack
24 {
25 
Lock()26     bool JackBaseWinMutex::Lock()
27     {
28         if (fOwner != GetCurrentThreadId()) {
29             DWORD res = WaitForSingleObject(fMutex, INFINITE);
30             if (res == WAIT_OBJECT_0) {
31                 fOwner = GetCurrentThreadId();
32                 return true;
33             } else {
34                 jack_log("JackBaseWinMutex::Lock res = %d", res);
35                 return false;
36             }
37         } else {
38             jack_error("JackBaseWinMutex::Lock mutex already locked by thread = %d", GetCurrentThreadId());
39             return false;
40         }
41     }
42 
Trylock()43     bool JackBaseWinMutex::Trylock()
44     {
45         if (fOwner != GetCurrentThreadId()) {
46             DWORD res = WaitForSingleObject(fMutex, 0);
47             if (res == WAIT_OBJECT_0) {
48                 fOwner = GetCurrentThreadId();
49                 return true;
50             } else {
51                 jack_log("JackBaseWinMutex::Trylock res = %d", res);
52                 return false;
53             }
54         } else {
55             jack_error("JackBaseWinMutex::Trylock mutex already locked by thread = %d", GetCurrentThreadId());
56             return false;
57         }
58     }
59 
Unlock()60     bool JackBaseWinMutex::Unlock()
61     {
62         if (fOwner == GetCurrentThreadId()) {
63             fOwner = 0;
64             int res = ReleaseMutex(fMutex);
65             if (res != 0) {
66                 return true;
67             } else {
68                 jack_log("JackBaseWinMutex::Unlock res = %d", res);
69                 return false;
70             }
71         } else {
72             jack_error("JackBaseWinMutex::Unlock mutex not locked by thread = %d", GetCurrentThreadId());
73             return false;
74         }
75     }
76 
Lock()77     bool JackWinMutex::Lock()
78     {
79         if (WAIT_OBJECT_0 == WaitForSingleObject(fMutex, INFINITE)) {
80             return true;
81         } else  {
82             jack_log("JackWinProcessSync::Lock WaitForSingleObject err = %d", GetLastError());
83             return false;
84         }
85     }
86 
Trylock()87     bool JackWinMutex::Trylock()
88     {
89         if (WAIT_OBJECT_0 == WaitForSingleObject(fMutex, 0)) {
90             return true;
91         } else  {
92             jack_log("JackWinProcessSync::Trylock WaitForSingleObject err = %d", GetLastError());
93             return false;
94         }
95     }
96 
Unlock()97     bool JackWinMutex::Unlock()
98     {
99         if (!ReleaseMutex(fMutex)) {
100             jack_log("JackWinProcessSync::Unlock ReleaseMutex err = %d", GetLastError());
101             return false;
102         } else  {
103             return true;
104         }
105     }
106 
Lock()107     bool JackWinCriticalSection::Lock()
108     {
109         EnterCriticalSection(&fSection);
110         return true;
111     }
112 
Trylock()113     bool JackWinCriticalSection::Trylock()
114     {
115         return (TryEnterCriticalSection(&fSection));
116     }
117 
Unlock()118     bool JackWinCriticalSection::Unlock()
119     {
120         LeaveCriticalSection(&fSection);
121         return true;
122     }
123 
124 } // namespace
125 
126 
127