Update copyright to LGPL on all files
[dyninst.git] / dyninstAPI / src / BPatch_eventLock.C
1 /*
2  * Copyright (c) 1996-2009 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as "Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * By your use of Paradyn, you understand and agree that we (or any
12  * other person or entity with proprietary rights in Paradyn) are
13  * under no obligation to provide either maintenance services,
14  * update services, notices of latent defects, or correction of
15  * defects for Paradyn.
16  * 
17  * This library is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  * 
22  * This library is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * Lesser General Public License for more details.
26  * 
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30  */
31
32 #include "BPatch_eventLock.h"
33 #include "mailbox.h"
34 #include "BPatch_asyncEventHandler.h"
35 #include "BPatch_thread.h"
36 #include "BPatch_function.h"
37 #include "BPatch_point.h"
38 #include "common/h/Vector.h"
39
40 #if !defined(os_windows)
41 #include <pthread.h> // Trying native windows threads for now
42 #else
43 #define WIN32_LEAN_AND_MEAN
44 #include <windows.h>
45 #include <winsock2.h>
46 #endif
47
48 #if defined(os_windows)
49 #define MUTEX_TYPE eventLock *
50 extern MUTEX_TYPE global_mutex;
51 #else
52 #define MUTEX_TYPE eventLock *
53 extern MUTEX_TYPE global_mutex;
54 #endif
55
56 #if defined(os_linux) //&& defined (arch_x86)
57 #define PTHREAD_MUTEX_TYPE PTHREAD_MUTEX_RECURSIVE_NP
58 #define STRERROR_BUFSIZE 512
59 #define ERROR_BUFFER char buf[STRERROR_BUFSIZE]
60 #define STRERROR(x,y) strerror_r(x,y,STRERROR_BUFSIZE)
61 #else
62 #define ERROR_BUFFER
63 #define PTHREAD_MUTEX_TYPE PTHREAD_MUTEX_RECURSIVE
64 #define STRERROR_BUFSIZE 0
65 #define STRERROR(x,y) strerror(x)
66 #endif
67
68 eventLock *global_mutex = NULL;
69 bool mutex_created = false;
70
71 unsigned long primary_thread_id = (unsigned long) -1;
72
73 BPatch_eventLock::BPatch_eventLock() 
74 {
75   if (mutex_created) return;
76   global_mutex = new eventLock();
77   mutex_created = true;
78
79   //  Assume that this ctor is being called on the primary (UI) thread
80   //  and set its value accordingly.
81   primary_thread_id = getExecThreadID();
82 }
83
84 BPatch_eventLock::~BPatch_eventLock() {};
85
86 eventLock *BPatch_eventLock::getLock() 
87 {
88         assert(global_mutex); 
89         return global_mutex;
90 }
91
92 int BPatch_eventLock::_Lock(const char *__file__, unsigned int __line__) const
93 {
94   return global_mutex->_Lock(__file__, __line__);
95 }
96 int BPatch_eventLock::_Trylock(const char *__file__, unsigned int __line__) const
97 {
98   return global_mutex->_Trylock(__file__, __line__);
99 }
100
101 int BPatch_eventLock::_Unlock(const char *__file__, unsigned int __line__) const
102 {
103   return global_mutex->_Unlock(__file__, __line__);
104 }
105
106
107 int BPatch_eventLock::_Broadcast(const char *__file__, unsigned int __line__) const
108 {
109   return global_mutex->_Broadcast(__file__, __line__);
110 }
111
112 int BPatch_eventLock::_WaitForSignal(const char *__file__, unsigned int __line__) const
113 {
114   return global_mutex->_WaitForSignal(__file__, __line__);
115 }
116
117
118 #if defined (os_windows)
119 unsigned long BPatch_eventLock::threadID() const
120 {
121   return (unsigned long) _threadid;
122 }
123 #else
124 unsigned long BPatch_eventLock::threadID() const
125 {
126   return (unsigned long) pthread_self();
127 }
128 #endif
129
130 unsigned int BPatch_eventLock::lockDepth() const
131 {
132   return global_mutex->depth();
133 }