Magick++: Thread.cpp Source File

Magick++ 7.1.0

Thread.cpp
Go to the documentation of this file.
1 // This may look like C code, but it is really -*- C++ -*-
2 //
3 // Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002
4 //
5 // Copyright @ 2014 ImageMagick Studio LLC, a non-profit organization
6 // dedicated to making software imaging solutions freely available.
7 //
8 // Implementation of thread support
9 //
10
11 #define MAGICKCORE_IMPLEMENTATION 1
12 #define MAGICK_PLUSPLUS_IMPLEMENTATION 1
13
14 #include "Magick++/Thread.h"
15 #include "Magick++/Exception.h"
16
17 #include <string.h>
18
19 // Default constructor
20 Magick::MutexLock::MutexLock(void)
21 #if defined(MAGICKCORE_HAVE_PTHREAD)
22 // POSIX threads
23 : _mutex()
24 {
25 ::pthread_mutexattr_t
26 attr;
27
28 int
29 sysError;
30
31 if ((sysError=::pthread_mutexattr_init(&attr)) == 0)
32 if ((sysError=::pthread_mutex_init(&_mutex,&attr)) == 0)
33 {
34 ::pthread_mutexattr_destroy(&attr);
35 return;
36 }
37 throwExceptionExplicit(MagickCore::OptionError,"mutex initialization failed",
38 strerror(sysError));
39 }
40 #else
41 #if defined(_VISUALC_) && defined(_MT)
42 // Win32 threads
43 {
44 SECURITY_ATTRIBUTES
45 security;
46
47 /* Allow the semaphore to be inherited */
48 security.nLength=sizeof(security);
49 security.lpSecurityDescriptor=(LPVOID) NULL;
50 security.bInheritHandle=TRUE;
51
52 /* Create the semaphore, with initial value signaled */
53 _mutex=::CreateSemaphore(&security,1,1,(LPCSTR) NULL);
54 if (_mutex != (HANDLE) NULL)
55 return;
56 throwExceptionExplicit(MagickCore::OptionError,
57 "mutex initialization failed");
58 }
59 #else
60 // Threads not supported
61 {
62 }
63 #endif
64 #endif
65
66 // Destructor
67 Magick::MutexLock::~MutexLock(void)
68 {
69 #if defined(MAGICKCORE_HAVE_PTHREAD)
70 (void) ::pthread_mutex_destroy(&_mutex);
71 #endif
72 #if defined(_MT) && defined(_VISUALC_)
73 (void) ::CloseHandle(_mutex);
74 #endif
75 }
76
77 // Lock mutex
78 void Magick::MutexLock::lock(void)
79 {
80 #if defined(MAGICKCORE_HAVE_PTHREAD)
81 int
82 sysError;
83
84 if ((sysError=::pthread_mutex_lock(&_mutex)) == 0)
85 return;
86 throwExceptionExplicit(MagickCore::OptionError,"mutex lock failed",
87 strerror(sysError));
88 #endif
89 #if defined(_MT) && defined(_VISUALC_)
90 if (WaitForSingleObject(_mutex,INFINITE) != WAIT_FAILED)
91 return;
92 throwExceptionExplicit(MagickCore::OptionError,"mutex lock failed");
93 #endif
94 }
95
96 // Unlock mutex
97 void Magick::MutexLock::unlock(void)
98 {
99 #if defined(MAGICKCORE_HAVE_PTHREAD)
100 int
101 sysError;
102
103 if ((sysError=::pthread_mutex_unlock(&_mutex)) == 0)
104 return;
105 throwExceptionExplicit(MagickCore::OptionError,"mutex unlock failed",
106 strerror(sysError));
107 #endif
108 #if defined(_MT) && defined(_VISUALC_)
109 if (ReleaseSemaphore(_mutex,1,(LPLONG) NULL) == TRUE)
110 return;
111 throwExceptionExplicit(MagickCore::OptionError,"mutex unlock failed");
112 #endif
113 }
Magick::MutexLock::~MutexLock
~MutexLock(void)
Definition: Thread.cpp:67
Magick::MutexLock::unlock
void unlock(void)
Definition: Thread.cpp:97
Magick::MutexLock::lock
void lock(void)
Definition: Thread.cpp:78
Thread.h
Magick::throwExceptionExplicit
MagickPPExport void throwExceptionExplicit(const MagickCore::ExceptionType severity_, const char *reason_, const char *description_=(char *) NULL)
Definition: Exception.cpp:808
Magick::MutexLock::MutexLock
MutexLock(void)
Definition: Thread.cpp:20
Exception.h