diff --git a/src/OpenFOAM/db/regIOobject/regIOobject.C b/src/OpenFOAM/db/regIOobject/regIOobject.C index 3a14d5968ecc56d5f0a1e1010f7ca56ec21e059b..81715069b021e3117cd029e05539f051e9225a51 100644 --- a/src/OpenFOAM/db/regIOobject/regIOobject.C +++ b/src/OpenFOAM/db/regIOobject/regIOobject.C @@ -325,14 +325,42 @@ bool Foam::regIOobject::checkOut() bool Foam::regIOobject::upToDate(const regIOobject& a) const { - if (a.eventNo() >= eventNo_) + label da = a.eventNo()-eventNo_; + + // In case of overflow *this.event() might be 2G but a.event() might + // have overflowed to 0. + // Detect this by detecting a massive difference (labelMax/2) between + // the two events. + // + // a *this return + // - ----- ------ + // normal operation: + // 11 10 false + // 11 11 false + // 10 11 true + // overflow situation: + // 0 big false + // big 0 true + + if (da > labelMax/2) { + // *this.event overflowed but a.event not yet + return true; + } + else if (da < -labelMax/2) + { + // a.event overflowed but *this not yet return false; } - else + else if (da < 0) { + // My event number higher than a return true; } + else + { + return false; + } } @@ -342,18 +370,7 @@ bool Foam::regIOobject::upToDate const regIOobject& b ) const { - if - ( - a.eventNo() >= eventNo_ - || b.eventNo() >= eventNo_ - ) - { - return false; - } - else - { - return true; - } + return upToDate(a) && upToDate(b); } @@ -364,19 +381,7 @@ bool Foam::regIOobject::upToDate const regIOobject& c ) const { - if - ( - a.eventNo() >= eventNo_ - || b.eventNo() >= eventNo_ - || c.eventNo() >= eventNo_ - ) - { - return false; - } - else - { - return true; - } + return upToDate(a) && upToDate(b) && upToDate(c); } @@ -388,20 +393,7 @@ bool Foam::regIOobject::upToDate const regIOobject& d ) const { - if - ( - a.eventNo() >= eventNo_ - || b.eventNo() >= eventNo_ - || c.eventNo() >= eventNo_ - || d.eventNo() >= eventNo_ - ) - { - return false; - } - else - { - return true; - } + return upToDate(a) && upToDate(b) && upToDate(c) && upToDate(d); }