00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef FILE_LOCK_H
00015 #define FILE_LOCK_H
00016
00017
00018 #include <sys/types.h>
00019
00020 #include "assa/Assure.h"
00021
00022
00023 #include <string>
00024 using std::string;
00025
00026 #if defined(WIN32)
00027 struct flock {
00028 off_t l_start;
00029 off_t l_len;
00030 pid_t l_pid;
00031 short l_type;
00032 short l_whence;
00033 };
00034 #endif
00035
00036 namespace ASSA {
00037
00043 class PidFileLock : public flock
00044 {
00045 public:
00047 PidFileLock ();
00048
00052 ~PidFileLock ();
00053
00057 bool lock (const string& filename_);
00058
00062 int get_error () const;
00063
00067 const char* get_error_msg () const;
00068
00072 void dump ();
00073
00074 private:
00077 pid_t open_pid_file (const std::string& fname_);
00078
00083 int lock_region ();
00084
00089 int lock_region_exclusive ();
00090
00094 int unlock_region ();
00095
00100 int get_lock_status ();
00101
00102
00106 int write_pid ();
00107
00112 pid_t test_region ();
00113
00116 void log_error (const char* msg_);
00117
00118 private:
00120 string m_filename;
00121
00123 int m_fd;
00124
00126 int m_error;
00127
00129 string m_error_msg;
00130 };
00131
00132 inline int
00133 PidFileLock::
00134 get_error () const
00135 {
00136 return m_error;
00137 }
00138
00139 inline const char*
00140 PidFileLock::
00141 get_error_msg () const
00142 {
00143 return m_error_msg.c_str ();
00144 }
00145
00146 }
00147
00148 #endif