40 #ifdef FOAM_USE_INOTIFY 42 #include <sys/inotify.h> 43 #include <sys/ioctl.h> 45 #define EVENT_SIZE ( sizeof (struct inotify_event) ) 46 #define EVENT_LEN (EVENT_SIZE + 16) 47 #define EVENT_BUF_LEN ( 1024 * EVENT_LEN ) 58 { fileState::UNMODIFIED,
"unmodified" },
59 { fileState::MODIFIED,
"modified" },
60 { fileState::DELETED,
"deleted" },
72 unsigned int operator()(
const unsigned int x,
const unsigned int y)
77 unsigned int mask = 3u;
78 unsigned int shift = 0;
79 unsigned int result = 0;
84 unsigned int xState = (
x & mask) >> shift;
85 unsigned int yState = (
y & mask) >> shift;
89 unsigned int state =
min(xState, yState);
90 result |= (state << shift);
102 void operator()(
unsigned int&
x,
const unsigned int y)
const 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 " 204 inline bool addWatch(
const label watchFd,
const fileName& fName)
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
294 void Foam::fileMonitor::checkFiles()
const 298 #ifdef FOAM_USE_INOTIFY 300 char buffer[EVENT_BUF_LEN];
304 struct timeval zeroTimeout = {0, 0};
310 FD_SET(watcher_->inotifyFd_, &fdSet);
314 watcher_->inotifyFd_+1,
324 <<
"Problem in issuing select." 327 else if (FD_ISSET(watcher_->inotifyFd_, &fdSet))
332 watcher_->inotifyFd_,
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)
368 forAll(watcher_->dirWatches_, i)
370 label
id = watcher_->dirWatches_[i];
373 id == inotifyEvent->wd
374 && inotifyEvent->name == watcher_->dirFiles_[i]
383 i += EVENT_SIZE + inotifyEvent->len;
396 forAll(watcher_->lastMod_, watchFd)
398 double oldTime = watcher_->lastMod_[watchFd];
402 const fileName& fName = watchFile_[watchFd];
407 localState_[watchFd] =
DELETED;
429 Foam::fileMonitor::fileMonitor(
const bool useInotify)
431 useInotify_(useInotify),
436 watcher_(new fileMonitorWatcher(useInotify_, 20))
454 Pout<<
"fileMonitor : adding watch on file " << fName <<
endl;
457 label watchFd = state_.size();
459 if (!freeWatchFds_.empty())
461 watchFd = freeWatchFds_.back();
462 freeWatchFds_.pop_back();
465 watcher_->addWatch(watchFd, fName);
469 Pout<<
"fileMonitor : added watch " << watchFd <<
" on file " 476 <<
"could not add watch for file " << fName <<
endl;
480 localState_(watchFd) = UNMODIFIED;
481 state_(watchFd) = UNMODIFIED;
482 watchFile_(watchFd) = fName;
492 Pout<<
"fileMonitor : removing watch " << watchFd <<
" on file " 493 << watchFile_[watchFd] <<
endl;
496 freeWatchFds_.push_uniq(watchFd);
498 return watcher_->removeWatch(watchFd);
504 return watchFile_[watchFd];
511 return state_[watchFd];
517 const bool masterOnly,
538 static_cast<unsigned int>(localState_[watchFd])
548 if (stats.storage().size() == 1)
560 if (stats.storage().size() == 1)
580 unsigned int stat = stats[watchFd];
586 if (state_[watchFd] != localState_[watchFd])
590 Pout<<
"fileMonitor : Delaying reading " 591 << watchFile_[watchFd]
592 <<
" due to inconsistent " 593 "file time-stamps between processors" 598 <<
"Delaying reading " << watchFile_[watchFd]
599 <<
" due to inconsistent " 600 "file time-stamps between processors" <<
endl;
607 state_ = localState_;
614 state_[watchFd] = UNMODIFIED;
615 localState_[watchFd] = UNMODIFIED;
static void listCombineGather(UList< T > &values, const CombineOp &cop, const int tag=UPstream::msgType(), const label comm=UPstream::worldComm)
Combines List elements.
DynamicList< double > lastMod_
From watch descriptor to modified time.
static const Enum< fileState > fileStateNames_
void size(const label n)
Older name for setAddressableSize.
Info<< "Creating field kinetic energy K\"<< endl;volScalarField K("K", 0.5 *magSqr(U));if(U.nOldTimes()){ volVectorField *Uold=&U.oldTime();volScalarField *Kold=&K.oldTime();*Kold==0.5 *magSqr(*Uold);while(Uold->nOldTimes()) { Uold=&Uold-> oldTime()
A class for handling file names.
Inter-processor communication reduction functions.
errorManipArg< error, int > exit(error &err, const int errNo=1)
Internal tracking via stat(3p) or inotify(7)
static float fileModificationSkew
Time skew (seconds) for file modification checks.
error FatalError
Error stream (stdout output on all processes), with additional 'FOAM FATAL ERROR' header text and sta...
Checking for changes to files.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
defineDebugSwitchWithName(pointMVCWeight, "pointMVCWeight", 0)
fileState getState(const label watchFd) const
Check state using handle.
fileState
Enumeration defining the file state.
void setUnmodified(const label watchFd)
Reset state (e.g. after having read it) using handle.
Combine operator for PackedList of fileState.
List< bool > select(const label n, const labelUList &locations)
Construct a selection list of bools (all false) with the given pre-size, subsequently add specified l...
Ostream & endl(Ostream &os)
Add newline and flush stream.
void setCapacity(const label len)
Alter the size of the underlying storage.
Reduction operator for PackedList of fileState.
static std::string path(const std::string &str)
Return directory path name (part before last /)
DynamicList< label > dirWatches_
Current watchIDs and corresponding directory id.
static void broadcast(Type &value, const label comm=UPstream::worldComm)
Broadcast content (contiguous or non-contiguous) to all communicator ranks. Does nothing in non-paral...
bool read(const char *buf, int32_t &val)
Same as readInt32.
#define forAll(list, i)
Loop across all elements in list.
Useful combination of include files which define Sin, Sout and Serr and the use of IO streams general...
fileMonitorWatcher(const bool useInotify, const label sz=20)
Initialise inotify.
bool isDir(const fileName &name, const bool followLink=true)
Does the name exist as a DIRECTORY in the file system?
Functions used by OpenFOAM that are specific to POSIX compliant operating systems and need to be repl...
bool removeWatch(const label watchFd)
Remove file to watch. Return true if successful.
void updateStates(const bool masterOnly, const bool syncPar) const
Check state of all files. Updates state_.
const fileName & getFile(const label watchFd) const
Get name of file being watched.
unsigned int operator()(const unsigned int x, const unsigned int y) const
label min(const labelHashSet &set, label minValue=labelMax)
Find the min value in labelHashSet, optionally limited by second argument.
errorManip< error > abort(error &err)
int inotifyFd_
File descriptor for the inotify instance.
int debug
Static debugging option.
~fileMonitor()
Destructor.
registerDebugSwitchWithName(solution, solution, "solution")
#define WarningInFunction
Report a warning using Foam::Warning.
Enum is a wrapper around a list of names/values that represent particular enumeration (or int) values...
label addWatch(const fileName &)
Add file to watch. Return watch descriptor.
Macro definitions for debug switches.
DynamicList< fileName > dirFiles_
static bool master(const label communicator=worldComm)
True if process corresponds to the master rank in the communicator.
void operator()(unsigned int &x, const unsigned int y) const
bool removeWatch(const label watchFd)
~fileMonitorWatcher()
Remove all watches.
bool addWatch(const label watchFd, const fileName &fName)
A class for handling character strings derived from std::string.
prefixOSstream Pout
OSstream wrapped stdout (std::cout) with parallel prefix.
void reduce(T &value, const BinaryOp &bop, const int tag=UPstream::msgType(), const label comm=UPstream::worldComm)
Reduce inplace (cf. MPI Allreduce) using linear/tree communication schedule.
double highResLastModified(const fileName &, const bool followLink=true)
Return time of last file modification.