summaryrefslogtreecommitdiff
path: root/examples/APG/ThreadSafety/Mutex.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/APG/ThreadSafety/Mutex.cpp')
-rw-r--r--examples/APG/ThreadSafety/Mutex.cpp54
1 files changed, 54 insertions, 0 deletions
diff --git a/examples/APG/ThreadSafety/Mutex.cpp b/examples/APG/ThreadSafety/Mutex.cpp
new file mode 100644
index 00000000000..073a7ecfb3e
--- /dev/null
+++ b/examples/APG/ThreadSafety/Mutex.cpp
@@ -0,0 +1,54 @@
+// $Id$
+
+#include "ace/Synch.h"
+
+class LogMessage
+{
+public:
+ enum { CRITICAL, NORMAL};
+
+ virtual int priority (void)
+ {
+ return NORMAL;
+ }
+};
+
+class CriticalLogMessage : public LogMessage
+{
+ virtual int priority (void)
+ {
+ return LogMessage::CRITICAL;
+ }
+};
+
+// Listing 1 code/ch14
+typedef ACE_Thread_Mutex MUTEX;
+class Logger
+{
+public:
+ void log (LogMessage *msg)
+ {
+ ACE_GUARD (MUTEX, mon, mutex_);
+ if (msg->priority () == LogMessage::CRITICAL)
+ logCritical (msg);
+ }
+
+ void logCritical (LogMessage *)
+ {
+ // Acquires the same mutex as log()!
+ ACE_GUARD(MUTEX, mon, mutex_);
+ }
+
+private:
+ MUTEX mutex_;
+};
+
+static Logger logger;
+
+int ACE_TMAIN (int, ACE_TCHAR *[])
+{
+ CriticalLogMessage cm;
+ logger.log(&cm); // Will cause deadlock.
+ return 0;
+}
+// Listing 1