Go to the documentation of this file.
34 #ifdef FOAM_USE_INOTIFY
36 # include <sys/inotify.h>
37 # include <sys/ioctl.h>
39 # define EVENT_SIZE ( sizeof (struct inotify_event) )
40 # define EVENT_LEN (EVENT_SIZE + 16)
41 # define EVENT_BUF_LEN ( 1024 * EVENT_LEN )
71 unsigned int operator()(
const unsigned int x,
const unsigned int y)
76 unsigned int mask = 3u;
77 unsigned int shift = 0;
78 unsigned int result = 0;
83 unsigned int xState = (
x & mask) >> shift;
84 unsigned int yState = (
y & mask) >> shift;
88 unsigned int state =
min(xState, yState);
89 result |= (state << shift);
141 #ifdef FOAM_USE_INOTIFY
148 static bool hasWarned =
false;
153 <<
"Failed allocating an inotify descriptor : "
155 <<
" Please increase the number of allowable "
156 <<
"inotify instances" <<
endl
157 <<
" (/proc/sys/fs/inotify/max_user_instances"
158 <<
" on Linux)" <<
endl
159 <<
" , switch off runTimeModifiable." <<
endl
160 <<
" or compile this file without "
161 <<
"FOAM_USE_INOTIFY"
162 <<
" to use time stamps instead of inotify." <<
endl
163 <<
" Continuing without additional file"
170 <<
"You selected inotify but this file was compiled"
171 <<
" without FOAM_USE_INOTIFY"
172 <<
" Please select another fileModification test method"
185 #ifdef FOAM_USE_INOTIFY
195 <<
"Failed deleting directory watch "
213 #ifdef FOAM_USE_INOTIFY
220 label dirWatchID = -1;
223 dirWatchID = inotify_add_watch
233 <<
"Failed adding watch " << watchFd
234 <<
" to directory " << fName <<
" due to "
235 <<
string(strerror(errno))
244 <<
"Problem adding watch " << watchFd
245 <<
" to file " << fName
259 <<
"Problem adding watch " << watchFd
260 <<
" to file " << fName
298 #ifdef FOAM_USE_INOTIFY
300 char buffer[EVENT_BUF_LEN];
304 struct timeval zeroTimeout = {0, 0};
310 FD_SET(
watcher_->inotifyFd_, &fdSet);
324 <<
"Problem in issuing select."
327 else if (FD_ISSET(
watcher_->inotifyFd_, &fdSet))
340 <<
"read of " <<
watcher_->inotifyFd_
341 <<
" failed with " <<
label(nBytes)
349 const struct inotify_event* inotifyEvent =
350 reinterpret_cast<const struct inotify_event*
>
363 (inotifyEvent->mask & IN_CLOSE_WRITE)
373 id == inotifyEvent->wd
374 && inotifyEvent->name ==
watcher_->dirFiles_[i]
383 i += EVENT_SIZE + inotifyEvent->len;
431 useInotify_(useInotify),
454 label sz = freeWatchFds_.size();
458 watchFd = freeWatchFds_[sz-1];
459 freeWatchFds_.setSize(sz-1);
463 watchFd = state_.size();
466 watcher_->addWatch(watchFd, fName);
470 Pout<<
"fileMonitor : added watch " << watchFd <<
" on file "
477 <<
"could not add watch for file " << fName <<
endl;
481 localState_(watchFd) = UNMODIFIED;
482 state_(watchFd) = UNMODIFIED;
483 watchFile_(watchFd) = fName;
493 Pout<<
"fileMonitor : removing watch " << watchFd <<
" on file "
494 << watchFile_[watchFd] <<
endl;
497 freeWatchFds_.append(watchFd);
498 return watcher_->removeWatch(watchFd);
504 return watchFile_[watchFd];
511 return state_[watchFd];
517 const bool masterOnly,
535 stats[watchFd] =
static_cast<unsigned int>
547 if (stats.
storage().size() == 1)
559 if (stats.
storage().size() == 1)
579 unsigned int stat = stats[watchFd];
585 if (state_[watchFd] != localState_[watchFd])
589 Pout<<
"fileMonitor : Delaying reading "
590 << watchFile_[watchFd]
591 <<
" due to inconsistent "
592 "file time-stamps between processors"
597 <<
"Delaying reading " << watchFile_[watchFd]
598 <<
" due to inconsistent "
599 "file time-stamps between processors" <<
endl;
606 state_ = localState_;
613 state_[watchFd] = UNMODIFIED;
614 localState_[watchFd] = UNMODIFIED;
618 watcher_->lastMod_[watchFd] =
lastModified(watchFile_[watchFd]);
DynamicList< fileState > localState_
State for all watchFds based on local files.
Combine operator for PackedList of fileState.
Functions used by OpenFOAM that are specific to POSIX compliant operating systems and need to be repl...
Useful combination of include files which define Sin, Sout and Serr and the use of IO streams general...
fileMonitor(const fileMonitor &)
Disallow default bitwise copy construct.
A class for handling file names.
#define forAll(list, i)
Loop across all elements in list.
const fileName & getFile(const label watchFd) const
Get name of file being watched.
bool read(const char *, int32_t &)
bool removeWatch(const label watchFd)
Remove file to watch. Return true if successful.
List< unsigned int > & storage()
Return the underlying packed storage.
fileMonitorWatcher(const bool useInotify, const label sz=20)
Initialise inotify.
fileName path() const
Return directory path name (part before last /)
label addWatch(const fileName &)
Add file to watch. Return watch descriptor.
static void scatter(const List< commsStruct > &comms, T &Value, const int tag, const label comm)
Scatter data. Distribute without modification. Reverse of gather.
fileState
Enumeration defining the file state.
time_t lastModified(const fileName &)
Return time of last file modification.
Ostream & endl(Ostream &os)
Add newline and flush stream.
A class for handling character strings derived from std::string.
DynamicList< label > dirWatches_
Current watchIDs and corresponding directory id.
word name() const
Return file name (part beyond last /)
~fileMonitor()
Destructor.
int inotifyFd_
File descriptor for the inotify instance.
void reduce(const List< UPstream::commsStruct > &comms, T &Value, const BinaryOp &bop, const int tag, const label comm)
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
autoPtr< fileMonitorWatcher > watcher_
Watch mechanism (stat or inotify)
void setCapacity(const label)
Alter the size of the underlying storage.
void operator()(unsigned int &x, const unsigned int y) const
DynamicList< fileName > dirFiles_
static const NamedEnum< fileState, 3 > fileStateNames_
const bool useInotify_
Whether to use inotify (requires -DFOAM_USE_INOTIFY, see above)
errorManip< error > abort(error &err)
bool isDir(const fileName &)
Does the name exist as a DIRECTORY in the file system?
Reduction operator for PackedList of fileState.
errorManipArg< error, int > exit(error &err, const int errNo=1)
static bool master(const label communicator=0)
Am I the master process.
DynamicList< time_t > lastMod_
From watch descriptor to modified time.
static void listCombineGather(const List< commsStruct > &comms, List< T > &Value, const CombineOp &cop, const int tag, const label comm)
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
fileState getState(const label watchFd) const
Check state using handle.
void setUnmodified(const label watchFd)
Reset state (e.g. after having read it) using handle.
prefixOSstream Pout(cout, "Pout")
bool addWatch(const label watchFd, const fileName &fName)
DynamicList< fileName > watchFile_
Filename for all watchFds.
void updateStates(const bool masterOnly, const bool syncPar) const
Check state of all files. Updates state_.
bool removeWatch(const label watchFd)
Internal tracking via stat(3p) or inotify(7)
unsigned int operator()(const unsigned int x, const unsigned int y) const
void checkFiles() const
Update localState_ from any events.
static void listCombineScatter(const List< commsStruct > &comms, List< T > &Value, const int tag, const label comm)
Scatter data. Reverse of combineGather.
static int fileModificationSkew
defineTypeNameAndDebug(combustionModel, 0)
dimensioned< Type > min(const dimensioned< Type > &, const dimensioned< Type > &)
#define WarningInFunction
Report a warning using Foam::Warning.
~fileMonitorWatcher()
Remove all watches.
Initialise the NamedEnum HashTable from the static list of names.