00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef SBUILD_LOCK_H
00021 #define SBUILD_LOCK_H
00022
00023 #include <string>
00024
00025 #include <sys/time.h>
00026 #include <fcntl.h>
00027 #include <signal.h>
00028 #include <unistd.h>
00029
00030 #include "sbuild-error.h"
00031
00032 namespace sbuild
00033 {
00034
00039 class Lock
00040 {
00041 public:
00043 enum Type
00044 {
00045 LOCK_SHARED = F_RDLCK,
00046 LOCK_EXCLUSIVE = F_WRLCK,
00047 LOCK_NONE = F_UNLCK
00048 };
00049
00051 typedef runtime_error_custom<Lock> error;
00052
00059 virtual void
00060 set_lock (Type lock_type,
00061 unsigned int timeout) = 0;
00062
00067 virtual void
00068 unset_lock () = 0;
00069
00070 protected:
00072 Lock();
00074 virtual ~Lock();
00075
00081 void
00082 set_alarm ();
00083
00088 void
00089 clear_alarm ();
00090
00100 void
00101 set_timer(struct itimerval const& timer);
00102
00109 void
00110 unset_timer();
00111
00112 private:
00114 struct sigaction saved_signals;
00115 };
00116
00121 class FileLock : public Lock
00122 {
00123 public:
00129 FileLock (int fd);
00130
00132 virtual ~FileLock();
00133
00134 void
00135 set_lock (Type lock_type,
00136 unsigned int timeout);
00137
00138 void
00139 unset_lock ();
00140
00141 private:
00143 int fd;
00144 };
00145
00152 class DeviceLock : public Lock
00153 {
00154 public:
00160 DeviceLock (std::string const& device);
00161 virtual ~DeviceLock();
00162
00163 void
00164 set_lock (Type lock_type,
00165 unsigned int timeout);
00166
00167 void
00168 unset_lock ();
00169
00170 private:
00172 std::string device;
00173 };
00174
00175 }
00176
00177 #endif
00178
00179
00180
00181
00182
00183