HOPS
HOPS class reference
MHO_LockFileHandler.hh
Go to the documentation of this file.
1 #ifndef MHO_LockFileHandler_HH__
2 #define MHO_LockFileHandler_HH__
3 
4 #include <csignal>
5 #include <cstdlib>
6 #include <unistd.h>
7 
9 #include "MHO_Tokenizer.hh"
10 
11 //return error codes
12 #define LOCK_FILESET_FAIL -6
13 #define LOCK_TIMEOUT_ERROR -5
14 #define LOCK_FILE_ERROR -4
15 #define LOCK_STALE_ERROR -3
16 #define LOCK_PARSE_ERROR -2
17 #define LOCK_PROCESS_NO_PRIORITY -1
18 #define LOCK_STATUS_OK 0
19 #define LOCK_PROCESS_HAS_PRIORITY 1
20 
21 //number of chars in lock file name
22 #define MAX_LOCKNAME_LEN 512
23 
24 namespace hops
25 {
26 
44 {
45  int validity;
46  unsigned int seq_number;
47  unsigned int pid;
48  unsigned long int time_sec;
49  unsigned long int time_usec;
50  char hostname[256];
53 };
54 
55 
60 {
61  public:
62  //since this is a singleton we need to remove ability to copy/move
67 
75  {
76  if(fInstance == nullptr)
77  {
78  fInstance = new MHO_LockFileHandler();
79  }
80  return *fInstance;
81  }
82 
83 
89  void EnableLegacyMode() { fEnableLegacyMode = true; };
90 
94  void DisableLegacyMode() { fEnableLegacyMode = false; };
95 
96 
104  int WaitForWriteLock(std::string directory, int& next_seq_no);
108  void RemoveWriteLock();
109 
110  private:
117  static void HandleSignal(int signal_value);
118 
125  static void init_lockfile_data(lockfile_data* data);
126 
135  static int parse_lockfile_name(char* lockfile_name_base, lockfile_data* result);
136 
147  static int create_lockfile(const char* directory, char* lockfile_name, lockfile_data* lock_data, int max_seq_no);
148 
156  static int check_stale(lockfile_data* other);
157 
166  static int lock_has_priority(lockfile_data* ours, lockfile_data* other);
177  static int at_front(const char* directory, char* lockfile_name, lockfile_data* lock_data, int cand_seq_no);
178 
185  static void remove_lockfile(lockfile_data* other);
186 
193  int wait_for_write_lock(int& next_seq_no);
194 
201  int get_max_seq_number(std::string dir);
202 
208  void SetDirectory(std::string dir);
209 
211  {
212  //register the various signals
213  std::signal(SIGINT, &HandleSignal);
214  std::signal(SIGTERM, &HandleSignal);
215  std::signal(SIGQUIT, &HandleSignal);
216  std::signal(SIGSEGV, &HandleSignal);
217  std::signal(SIGBUS, &HandleSignal);
218  std::signal(SIGHUP, &HandleSignal);
219  std::signal(SIGABRT, &HandleSignal);
220  fDirectory = "./";
221  fEnableLegacyMode = true;
222  fTokenizer.SetDelimiter(".");
223  fTokenizer.SetIncludeEmptyTokensFalse();
224  init_lockfile_data(&fProcessLockFileData);
225  };
226 
227  virtual ~MHO_LockFileHandler(){};
228 
229  //static global class instance
230  static MHO_LockFileHandler* fInstance;
231  //info of the current process
232  lockfile_data fProcessLockFileData;
233  //directory interface
234  std::string fDirectory;
235  MHO_DirectoryInterface fDirInterface;
236  MHO_Tokenizer fTokenizer;
237 
238  bool fEnableLegacyMode;
239 };
240 
241 } // namespace hops
242 
243 #endif
#define MAX_LOCKNAME_LEN
Definition: MHO_LockFileHandler.hh:22
Class MHO_LockFileHandler uses the singleton pattern.
Definition: MHO_LockFileHandler.hh:60
MHO_LockFileHandler & operator=(MHO_LockFileHandler &&)=delete
void RemoveWriteLock()
Removes a write lock from the file.
Definition: MHO_LockFileHandler.cc:50
void DisableLegacyMode()
Disables legacy mode by setting fEnableLegacyMode to false.
Definition: MHO_LockFileHandler.hh:94
void EnableLegacyMode()
configure the lock handler to write legacy type_2xx file (e.g. GE.X.1.ABCDEF) naming convention....
Definition: MHO_LockFileHandler.hh:89
static MHO_LockFileHandler & GetInstance()
provide public access to the only static instance
Definition: MHO_LockFileHandler.hh:74
MHO_LockFileHandler(MHO_LockFileHandler &&)=delete
MHO_LockFileHandler & operator=(MHO_LockFileHandler const &)=delete
int WaitForWriteLock(std::string directory, int &next_seq_no)
Waits for and acquires a write lock on the specified directory, setting it as the current directory.
Definition: MHO_LockFileHandler.cc:55
MHO_LockFileHandler(MHO_LockFileHandler const &)=delete
void SetIncludeEmptyTokensFalse()
Definition: MHO_Tokenizer.cc:30
void SetDelimiter(const std::string &aDelim)
Definition: MHO_Tokenizer.cc:70
Definition: MHO_ChannelLabeler.hh:17
unsigned int seq_number
Definition: MHO_LockFileHandler.hh:46
char hostname[256]
Definition: MHO_LockFileHandler.hh:50
char active_directory[MAX_LOCKNAME_LEN]
Definition: MHO_LockFileHandler.hh:51
unsigned int pid
Definition: MHO_LockFileHandler.hh:47
unsigned long int time_usec
Definition: MHO_LockFileHandler.hh:49
unsigned long int time_sec
Definition: MHO_LockFileHandler.hh:48
int validity
Definition: MHO_LockFileHandler.hh:45
char lockfile_name[MAX_LOCKNAME_LEN]
Definition: MHO_LockFileHandler.hh:52
struct lockfile_data - struct for holding data about the lock file's creation
Definition: MHO_LockFileHandler.hh:44
Definition: write_lock_mechanism.h:34