proxygen
FilePoller.h
Go to the documentation of this file.
1 /*
2  * Copyright 2017-present Facebook, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #pragma once
17 
18 #include <chrono>
19 #include <functional>
20 #include <memory>
21 
22 #include <folly/SharedMutex.h>
23 #include <folly/ThreadLocal.h>
27 
28 namespace wangle {
29 
41 class FilePoller {
42  public:
45  FileModificationData(bool fileExists, time_t modificationTime)
46  : exists(fileExists), modTime(modificationTime) {}
47  bool exists{false};
48  time_t modTime{0};
49  };
50  using Cob = std::function<void()>;
51  // First arg is info about previous modification of a file,
52  // Second arg is info about last modification of a file
53  using Condition = std::function<
55 
56  explicit FilePoller(std::chrono::milliseconds pollInterval =
58 
59  virtual ~FilePoller();
60 
61  FilePoller(const FilePoller& other) = delete;
62  FilePoller& operator=(const FilePoller& other) = delete;
63 
64  FilePoller(FilePoller&& other) = delete;
65  FilePoller&& operator=(FilePoller&& other) = delete;
66 
67  // This is threadsafe
68  // yCob will be called if condition is met,
69  // nCob is called if condition is not met.
70  void addFileToTrack(
71  const std::string& fileName,
72  Cob yCob,
73  Cob nCob = nullptr,
75 
76  void removeFileToTrack(const std::string& fileName);
77 
78  void stop();
79 
80  static Condition fileTouchedWithinCond(std::chrono::seconds expireTime) {
81  return std::bind(
83  std::placeholders::_1,
84  std::placeholders::_2,
85  expireTime);
86  }
87 
89  return doAlwaysCondInternal;
90  }
91 
94  }
95 
96  protected:
98 
99  private:
100  static constexpr std::chrono::milliseconds kDefaultPollInterval =
101  std::chrono::milliseconds(10000);
102 
103  struct FileData {
104  FileData(Cob yesCob, Cob noCob, Condition cond)
105  : yCob(yesCob), nCob(noCob), condition(cond) {}
106  FileData() {}
107 
108  Cob yCob{nullptr};
109  Cob nCob{nullptr};
112  };
113  using FileDatas = std::unordered_map<std::string, FileData>;
114 
117  const FilePoller::FileModificationData& fModData,
118  std::chrono::seconds expireTime) {
119  return fModData.exists &&
120  (time(nullptr) < fModData.modTime + expireTime.count());
121  }
122 
123  static bool doAlwaysCondInternal(
124  const FileModificationData&,
125  const FileModificationData&) {
126  return true;
127  }
128 
130  const FileModificationData& oldModData,
131  const FileModificationData& modData) {
132  const bool fileStillExists = oldModData.exists && modData.exists;
133  const bool fileTouched = modData.modTime != oldModData.modTime;
134  const bool fileCreated = !oldModData.exists && modData.exists;
135  return (fileStillExists && fileTouched) || fileCreated;
136  }
137 
138  // Grabs a read lock
139  void checkFiles() noexcept;
140  void initFileData(const std::string& fName, FileData& fData) noexcept;
141  void init(std::chrono::milliseconds pollInterval);
142 
144 
145  // This protects fileDatum_.
147 
149 
150  // The poller hangs on to a scheduler that is initially created by a
151  // singleton. There should not be one per poller as that will create
152  // one thread per poller.
153  std::shared_ptr<folly::FunctionScheduler> scheduler_;
154 
155  // Used to disallow locking calls from callbacks.
157  public:
159  *polling_ = true;
160  }
162  *polling_ = false;
163  }
164  static bool inPollerThread() {
165  return *polling_;
166  }
168  };
169 };
170 }
std::function< bool(const FileModificationData &, const FileModificationData &)> Condition
Definition: FilePoller.h:54
virtual FileModificationData getFileModData(const std::string &path) noexcept
Definition: FilePoller.cpp:146
FileModificationData(bool fileExists, time_t modificationTime)
Definition: FilePoller.h:45
FilePoller(std::chrono::milliseconds pollInterval=kDefaultPollInterval)
Definition: FilePoller.cpp:65
static Condition fileTouchedWithinCond(std::chrono::seconds expireTime)
Definition: FilePoller.h:80
std::shared_ptr< folly::FunctionScheduler > scheduler_
Definition: FilePoller.h:153
std::unordered_map< std::string, FileData > FileDatas
Definition: FilePoller.h:113
static bool fileTouchedCondInternal(const FileModificationData &oldModData, const FileModificationData &modData)
Definition: FilePoller.h:129
FilePoller & operator=(const FilePoller &other)=delete
uint64_t pollerId_
Definition: FilePoller.h:148
FileData(Cob yesCob, Cob noCob, Condition cond)
Definition: FilePoller.h:104
requires E e noexcept(noexcept(s.error(std::move(e))))
static Condition doAlwaysCond()
Definition: FilePoller.h:88
FileDatas fileDatum_
Definition: FilePoller.h:143
static folly::ThreadLocal< bool > polling_
Definition: FilePoller.h:167
void addFileToTrack(const std::string &fileName, Cob yCob, Cob nCob=nullptr, Condition condition=fileTouchedCondInternal)
Definition: FilePoller.cpp:115
virtual ~FilePoller()
Definition: FilePoller.cpp:69
void removeFileToTrack(const std::string &fileName)
Definition: FilePoller.cpp:133
FileModificationData modData
Definition: FilePoller.h:111
void initFileData(const std::string &fName, FileData &fData) noexcept
Definition: FilePoller.cpp:107
static bool doAlwaysCondInternal(const FileModificationData &, const FileModificationData &)
Definition: FilePoller.h:123
static Condition fileTouchedCond()
Definition: FilePoller.h:92
std::mutex mutex
const char * string
Definition: Conv.cpp:212
int bind(NetworkSocket s, const sockaddr *name, socklen_t namelen)
Definition: NetOps.cpp:76
static constexpr std::chrono::milliseconds kDefaultPollInterval
Definition: FilePoller.h:100
std::function< void()> Cob
Definition: FilePoller.h:50
std::mutex filesMutex_
Definition: FilePoller.h:146
void init(std::chrono::milliseconds pollInterval)
Definition: FilePoller.cpp:71
static bool fileTouchedWithinCondInternal(const FilePoller::FileModificationData &, const FilePoller::FileModificationData &fModData, std::chrono::seconds expireTime)
Definition: FilePoller.h:115
void checkFiles() noexcept
Definition: FilePoller.cpp:92
std::chrono::nanoseconds time()