fileModification: time checking now with nano-second precision

fileModificationSkew: now a floating-point number to support sub-second
specification.

Patch contributed by Mattijs Janssens
This commit is contained in:
Henry Weller
2016-11-25 15:36:10 +00:00
parent 5272d324a4
commit bf326cc4f7
8 changed files with 67 additions and 13 deletions

View File

@ -523,6 +523,22 @@ time_t Foam::lastModified(const fileName& name)
} }
double Foam::highResLastModified(const fileName& name)
{
fileStat fileStatus(name);
if (fileStatus.isValid())
{
return
fileStatus.status().st_mtime
+ 1e-9d*fileStatus.status().st_atim.tv_nsec;
}
else
{
return 0.0;
}
}
Foam::fileNameList Foam::readDir Foam::fileNameList Foam::readDir
( (
const fileName& directory, const fileName& directory,

View File

@ -126,7 +126,7 @@ namespace Foam
// For stat // For stat
//- From watch descriptor to modified time //- From watch descriptor to modified time
DynamicList<time_t> lastMod_; DynamicList<double> lastMod_;
@ -261,7 +261,7 @@ namespace Foam
<< abort(FatalError); << abort(FatalError);
} }
lastMod_(watchFd) = lastModified(fName); lastMod_(watchFd) = highResLastModified(fName);
} }
return true; return true;
@ -395,12 +395,12 @@ void Foam::fileMonitor::checkFiles() const
{ {
forAll(watcher_->lastMod_, watchFd) forAll(watcher_->lastMod_, watchFd)
{ {
time_t oldTime = watcher_->lastMod_[watchFd]; double oldTime = watcher_->lastMod_[watchFd];
if (oldTime != 0) if (oldTime != 0)
{ {
const fileName& fName = watchFile_[watchFd]; const fileName& fName = watchFile_[watchFd];
time_t newTime = lastModified(fName); double newTime = highResLastModified(fName);
if (newTime == 0) if (newTime == 0)
{ {
@ -615,7 +615,7 @@ void Foam::fileMonitor::setUnmodified(const label watchFd)
if (!useInotify_) if (!useInotify_)
{ {
watcher_->lastMod_[watchFd] = lastModified(watchFile_[watchFd]); watcher_->lastMod_[watchFd] = highResLastModified(watchFile_[watchFd]);
} }
} }

View File

@ -48,14 +48,14 @@ namespace Foam
}; };
} }
int Foam::regIOobject::fileModificationSkew float Foam::regIOobject::fileModificationSkew
( (
Foam::debug::optimisationSwitch("fileModificationSkew", 30) Foam::debug::floatOptimisationSwitch("fileModificationSkew", 30)
); );
registerOptSwitch registerOptSwitch
( (
"fileModificationSkew", "fileModificationSkew",
int, float,
Foam::regIOobject::fileModificationSkew Foam::regIOobject::fileModificationSkew
); );

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -124,7 +124,7 @@ public:
//- Runtime type information //- Runtime type information
TypeName("regIOobject"); TypeName("regIOobject");
static int fileModificationSkew; static float fileModificationSkew;
static fileCheckTypes fileModificationChecking; static fileCheckTypes fileModificationChecking;

View File

@ -872,8 +872,23 @@ void Foam::argList::parse
<< regIOobject::fileCheckTypesNames << regIOobject::fileCheckTypesNames
[ [
regIOobject::fileModificationChecking regIOobject::fileModificationChecking
] ];
<< endl; if
(
(
regIOobject::fileModificationChecking
== regIOobject::timeStamp
)
|| (
regIOobject::fileModificationChecking
== regIOobject::timeStampMaster
)
)
{
Info<< " (fileModificationSkew "
<< regIOobject::fileModificationSkew << ")";
}
Info<< endl;
Info<< "allowSystemOperations : "; Info<< "allowSystemOperations : ";
if (dynamicCode::allowSystemOperations) if (dynamicCode::allowSystemOperations)

View File

@ -190,6 +190,19 @@ int Foam::debug::optimisationSwitch(const char* name, const int defaultValue)
} }
float Foam::debug::floatOptimisationSwitch
(
const char* name,
const float defaultValue
)
{
return optimisationSwitches().lookupOrAddDefault
(
name, defaultValue, false, false
);
}
void Foam::debug::addDebugObject(const char* name, simpleRegIOobject* obj) void Foam::debug::addDebugObject(const char* name, simpleRegIOobject* obj)
{ {
simpleObjectRegistryEntry* ptr = debugObjects().lookupPtr(name); simpleObjectRegistryEntry* ptr = debugObjects().lookupPtr(name);

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -74,6 +74,13 @@ namespace debug
//- Lookup optimisation switch or add default value. //- Lookup optimisation switch or add default value.
int optimisationSwitch(const char* name, const int defaultValue=0); int optimisationSwitch(const char* name, const int defaultValue=0);
//- Lookup optimisation switch or add default value.
float floatOptimisationSwitch
(
const char* name,
const float defaultValue=0
);
//- Internal function to lookup a sub-dictionary from controlDict. //- Internal function to lookup a sub-dictionary from controlDict.
dictionary& switchSet(const char* subDictName, dictionary*& subDictPtr); dictionary& switchSet(const char* subDictName, dictionary*& subDictPtr);

View File

@ -122,6 +122,9 @@ off_t fileSize(const fileName&);
//- Return time of last file modification //- Return time of last file modification
time_t lastModified(const fileName&); time_t lastModified(const fileName&);
//- Return time of last file modification
double highResLastModified(const fileName&);
//- Read a directory and return the entries as a string list //- Read a directory and return the entries as a string list
fileNameList readDir fileNameList readDir
( (