Initial commit for version 2.0.x patch release
[OpenFOAM-2.0.x.git] / src / OSspecific / POSIX / fileMonitor.H
blobbdb0dd2bb2f75a82473ef12ffb87c04f844317d8
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2010-2010 OpenCFD Ltd.
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of OpenFOAM.
11     OpenFOAM is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by
13     the Free Software Foundation, either version 3 of the License, or
14     (at your option) any later version.
16     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
24 Class
25     fileMonitor
27 Description
28     Checking for changes to files.
30 Note
31     The default is to use stat to get the timestamp.
33     Compile with FOAM_USE_INOTIFY to use the inotify
34     (Linux specific, since 2.6.13) framework. The problem is that inotify does
35     not work on nfs3 mounted directories!!
37 SourceFiles
38     fileMonitor.C
40 \*---------------------------------------------------------------------------*/
42 #ifndef fileMonitor_H
43 #define fileMonitor_H
45 #include <sys/types.h>
46 #include "NamedEnum.H"
47 #include "className.H"
48 #include "DynamicList.H"
50 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
52 namespace Foam
55 class fileMonitor;
56 class fileMonitorWatcher;
58 /*---------------------------------------------------------------------------*\
59                          Class fileMonitor Declaration
60 \*---------------------------------------------------------------------------*/
62 class fileMonitor
65 public:
67     // Public data types
69         //- Enumeration defining the file state.
70         enum fileState
71         {
72             UNMODIFIED = 0,
73             MODIFIED = 1,
74             DELETED = 2
75         };
77         static const NamedEnum<fileState, 3> fileStateNames_;
79 private:
80     // Private data
82         //- Whether to use inotify (requires -DFOAM_USE_INOTIFY, see above)
83         const bool useInotify_;
85         //- State for all watchFds based on local files
86         mutable DynamicList<fileState> localState_;
88         //- State for all watchFds - synchronised
89         mutable DynamicList<fileState> state_;
91         //- Filename for all watchFds
92         DynamicList<fileName> watchFile_;
94         //- Free watchFds
95         DynamicList<label> freeWatchFds_;
97         //- Watch mechanism (stat or inotify)
98         mutable autoPtr<fileMonitorWatcher> watcher_;
101     // Private Member Functions
103         //- Update localState_ from any events.
104         void checkFiles() const;
106         //- Disallow default bitwise copy construct
107         fileMonitor(const fileMonitor&);
109         //- Disallow default bitwise assignment
110         void operator=(const fileMonitor&);
113 public:
115     // Declare name of the class and its debug switch
116     ClassName("fileMonitor");
118     // Constructors
120         //- Construct null
121         fileMonitor(const bool useInotify);
124     //- Destructor
125     ~fileMonitor();
128     // Member Functions
130         //- Add file to watch. Return watch descriptor
131         label addWatch(const fileName&);
133         //- Remove file to watch. Return true if successful
134         bool removeWatch(const label watchFd);
136         //- Get name of file being watched
137         const fileName& getFile(const label watchFd) const;
139         //- Check state using handle
140         fileState getState(const label watchFd) const;
142         //- Check state of all files. Updates state_.
143         void updateStates
144         (
145             const bool masterOnly,
146             const bool syncPar
147         ) const;
149         //- Reset state (e.g. after having read it) using handle
150         void setUnmodified(const label watchFd);
154 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
156 } // End namespace Foam
158 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
160 #endif
162 // ************************************************************************* //