GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/file_watcher.h
Date: 2025-06-22 02:36:02
Exec Total Coverage
Lines: 3 3 100.0%
Branches: 0 0 -%

Line Branch Exec Source
1 /**
2 * This file is part of the CernVM File System.
3 */
4
5 #ifndef CVMFS_FILE_WATCHER_H_
6 #define CVMFS_FILE_WATCHER_H_
7
8 #include <pthread.h>
9
10 #include <map>
11 #include <string>
12
13 namespace file_watcher {
14
15 enum Event {
16 kModified,
17 kRenamed,
18 kAttributes,
19 kHardlinked,
20 kDeleted,
21 kIgnored,
22 kInvalid
23 };
24
25 class EventHandler {
26 public:
27 EventHandler();
28 virtual ~EventHandler();
29
30 /**
31 * Handle function called per event
32 *
33 * @param file_path - the path of the file this event corresponds to
34 * @param event - the type of event
35 * @param clear_handler - (output) set this to true to have the event
36 * handler remove from the loop after this call
37 *
38 * Should return false in case of failure.
39 *
40 * Setting the clear_handler parameter to false means that the FileWatcher
41 * object will attempt to re-register the handler for the same file name
42 * in the case a file was delete - useful for continuously watching a file
43 * which may be deleted and recreated
44 */
45 virtual bool Handle(const std::string &file_path,
46 Event event,
47 bool *clear_handler) = 0;
48 };
49
50 struct WatchRecord {
51 56 WatchRecord() : file_path_(), handler_(NULL) { }
52
53 56 WatchRecord(const std::string &path, file_watcher::EventHandler *h)
54 56 : file_path_(path), handler_(h) { }
55
56 std::string file_path_;
57 file_watcher::EventHandler *handler_;
58 };
59
60 class FileWatcher {
61 public:
62 typedef std::map<std::string, EventHandler *> HandlerMap;
63
64 FileWatcher();
65 virtual ~FileWatcher();
66 static FileWatcher *Create();
67
68 void RegisterHandler(const std::string &file_path, EventHandler *handler);
69
70 bool Spawn();
71
72 void Stop();
73
74 protected:
75 // Delays controlling the backoff throttle when registering new watches
76 static const unsigned kInitialDelay;
77 static const unsigned kMaxDelay;
78 static const unsigned kResetDelay;
79
80 void RegisterFilter(const std::string &file_path, EventHandler *handler);
81
82 virtual bool RunEventLoop(const HandlerMap &handler_map, int read_pipe,
83 int write_pipe) = 0;
84
85 virtual int TryRegisterFilter(const std::string &file_path) = 0;
86
87 std::map<int, WatchRecord> watch_records_;
88
89 private:
90 static void *BackgroundThread(void *d);
91
92 HandlerMap handler_map_;
93
94 int control_pipe_to_back_[2];
95 int control_pipe_to_front_[2];
96
97 pthread_t thread_;
98
99 bool started_;
100 };
101
102 } // namespace file_watcher
103
104 #endif // CVMFS_FILE_WATCHER_H_
105