Problem 1:
[dyninst.git] / dyninstAPI / src / BPatch_eventLock.C
1 /*
2  * Copyright (c) 1996-2004 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  * This license is for research uses.  For such uses, there is no
12  * charge. We define "research use" to mean you may freely use it
13  * inside your organization for whatever purposes you see fit. But you
14  * may not re-distribute Paradyn or parts of Paradyn, in any form
15  * source or binary (including derivatives), electronic or otherwise,
16  * to any other organization or entity without our permission.
17  *
18  * (for other uses, please contact us at paradyn@cs.wisc.edu)
19  *
20  * All warranties, including without limitation, any warranty of
21  * merchantability or fitness for a particular purpose, are hereby
22  * excluded.
23  *
24  * By your use of Paradyn, you understand and agree that we (or any
25  * other person or entity with proprietary rights in Paradyn) are
26  * under no obligation to provide either maintenance services,
27  * update services, notices of latent defects, or correction of
28  * defects for Paradyn.
29  *
30  * Even if advised of the possibility of such damages, under no
31  * circumstances shall we (or any other person or entity with
32  * proprietary rights in the software licensed hereunder) be liable
33  * to you or any third party for direct, indirect, or consequential
34  * damages of any character regardless of type of action, including,
35  * without limitation, loss of profits, loss of use, loss of good
36  * will, or computer failure or malfunction.  You agree to indemnify
37  * us (and any other person or entity with proprietary rights in the
38  * software licensed hereunder) for any and all liability it may
39  * incur to third parties resulting from your use of Paradyn.
40  */
41
42 #include "BPatch_eventLock.h"
43 #include "mailbox.h"
44 #include "BPatch_asyncEventHandler.h"
45 #include "BPatch_thread.h"
46 #include "BPatch_function.h"
47 #include "BPatch_point.h"
48 #include "common/h/Vector.h"
49
50 #if !defined(os_windows)
51 #include <pthread.h> // Trying native windows threads for now
52 #else
53 #define WIN32_LEAN_AND_MEAN
54 #include <windows.h>
55 #include <winsock2.h>
56 #endif
57
58 #if defined(os_windows)
59 #define MUTEX_TYPE eventLock *
60 extern MUTEX_TYPE global_mutex;
61 #else
62 #define MUTEX_TYPE eventLock *
63 extern MUTEX_TYPE global_mutex;
64 #endif
65
66 #if defined(os_linux) && defined (arch_x86)
67 #define PTHREAD_MUTEX_TYPE PTHREAD_MUTEX_RECURSIVE_NP
68 #define STRERROR_BUFSIZE 512
69 #define ERROR_BUFFER char buf[STRERROR_BUFSIZE]
70 #define STRERROR(x,y) strerror_r(x,y,STRERROR_BUFSIZE)
71 #else
72 #define ERROR_BUFFER
73 #define PTHREAD_MUTEX_TYPE PTHREAD_MUTEX_RECURSIVE
74 #define STRERROR_BUFSIZE 0
75 #define STRERROR(x,y) strerror(x)
76 #endif
77
78 eventLock *global_mutex = NULL;
79 bool mutex_created = false;
80
81 unsigned long primary_thread_id = (unsigned long) -1;
82
83 BPatch_eventLock::BPatch_eventLock() 
84 {
85   if (mutex_created) return;
86   global_mutex = new eventLock();
87   mutex_created = true;
88
89   //  Assume that this ctor is being called on the primary (UI) thread
90   //  and set its value accordingly.
91   primary_thread_id = getExecThreadID();
92
93 #ifdef NOTDEF // PDSEP
94 #if defined (os_windows)
95   primary_thread_id = _threadid;
96 #else
97   primary_thread_id = (unsigned long)pthread_self();
98 #endif
99 #endif
100 }
101
102 BPatch_eventLock::~BPatch_eventLock() {};
103
104 int BPatch_eventLock::_Lock(const char *__file__, unsigned int __line__) const
105 {
106   return global_mutex->_Lock(__file__, __line__);
107 }
108 int BPatch_eventLock::_Trylock(const char *__file__, unsigned int __line__) const
109 {
110   return global_mutex->_Trylock(__file__, __line__);
111 }
112
113 int BPatch_eventLock::_Unlock(const char *__file__, unsigned int __line__) const
114 {
115   return global_mutex->_Unlock(__file__, __line__);
116 }
117
118
119 int BPatch_eventLock::_Broadcast(const char *__file__, unsigned int __line__) const
120 {
121   return global_mutex->_Broadcast(__file__, __line__);
122 }
123
124 int BPatch_eventLock::_WaitForSignal(const char *__file__, unsigned int __line__) const
125 {
126   return global_mutex->_WaitForSignal(__file__, __line__);
127 }
128
129
130 #if defined (os_windows)
131 unsigned long BPatch_eventLock::threadID() const
132 {
133   return (unsigned long) _threadid;
134 }
135 #else
136 unsigned long BPatch_eventLock::threadID() const
137 {
138   return (unsigned long) pthread_self();
139 }
140 #endif
141
142 unsigned int BPatch_eventLock::lockDepth() const
143 {
144   return global_mutex->depth();
145 }