00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
#ifndef __itkSemaphore_h_
00018
#define __itkSemaphore_h_
00019
00020
#include "itkObjectFactory.h"
00021
#include "itkLightObject.h"
00022
#include "itkConfigure.h"
00023
#include <string>
00024
00025
#ifdef ITK_USE_UNIX_IPC_SEMAPHORES
00026
#include "itkMutexLock.h"
00027
#include <stdio.h>
00028
#include <sys/types.h>
00029
#include <sys/ipc.h>
00030
#include <sys/sem.h>
00031
#include <errno.h>
00032
#endif
00033
00034
#ifndef ITK_USE_UNIX_IPC_SEMAPHORES
00035
#ifdef ITK_USE_SPROC
00036
#include "itkMultiThreader.h"
00037
#include <ulocks.h>
00038
#endif
00039
#ifdef ITK_USE_PTHREADS
00040
#ifdef sun
00041
#include <synch.h>
00042
#else
00043
#include <semaphore.h>
00044
#endif
00045
#endif
00046
#endif
00047
00048
#ifdef ITK_USE_WIN32_THREADS
00049
#include "itkWindows.h"
00050
#endif
00051
00052
namespace itk {
00053
00054
#ifdef ITK_USE_UNIX_IPC_SEMAPHORES
00055
typedef int SemaphoreType;
00056
#endif
00057
00058
#ifndef ITK_USE_UNIX_IPC_SEMAPHORES
00059
#ifdef ITK_USE_SPROC
00060
typedef usema_t *
SemaphoreType;
00061
#endif
00062
#ifdef ITK_USE_PTHREADS
00063
#ifdef sun
00064
typedef sema_t
SemaphoreType;
00065
#else
00066
#ifdef __APPLE__
00067
typedef sem_t *
SemaphoreType;
00068
#else
00069
typedef sem_t
SemaphoreType;
00070
#endif
00071
#endif
00072
#endif
00073
#endif
00074
00075
#ifdef ITK_USE_WIN32_THREADS
00076
typedef HANDLE
SemaphoreType;
00077
#endif
00078
00079
#ifndef ITK_USE_UNIX_IPC_SEMAPHORES
00080
#ifndef ITK_USE_SPROC
00081
#ifndef ITK_USE_PTHREADS
00082
#ifndef ITK_USE_WIN32_THREADS
00083 typedef int SemaphoreType;
00084
#endif
00085
#endif
00086
#endif
00087
#endif
00088
00112 class ITKCommon_EXPORT Semaphore :
public LightObject
00113 {
00114
public:
00116 typedef Semaphore
Self;
00117 typedef LightObject Superclass;
00118 typedef SmartPointer<Self> Pointer;
00119 typedef SmartPointer<const Self> ConstPointer;
00120
00122
itkNewMacro(
Self);
00123
00125
itkTypeMacro(Semaphore,
LightObject);
00126
00128
void Initialize(
unsigned int value);
00129
00132
void Up();
00133
00139
void Down();
00140
00142
void Remove ();
00143
00144
protected:
00145 Semaphore ();
00146 ~Semaphore();
00147
00148
private:
00149
00150
#ifdef ITK_USE_UNIX_IPC_SEMAPHORES
00151
00153
static int m_IPCSemaphoreKey;
00155
static SimpleMutexLock m_Mutex;
00156
00157
int UnixIpcSemaphoreCreate (
int unix_semaphore_key);
00158
void UnixIpcSemaphoreRemove (
int sid);
00159
void UnixIpcSemaphoreCall (
int sid,
int op);
00160
void UnixIpcSemaphoreDown (
int sid);
00161
void UnixIpcSemaphoreUp (
int sid);
00162
#endif
00163
00164
char Pad1[128];
00165
SemaphoreType m_Sema;
00166
char Pad2[128];
00167
00168
#ifdef __APPLE__
00169
std::string GetUniqueName();
00170
static int m_SemaphoreCount;
00171 std::string m_SemaphoreName;
00172
#endif
00173
00174 };
00175
00176 }
00177
00178
#endif