Initial commit for version 2.0.x patch release
[OpenFOAM-2.0.x.git] / src / OSspecific / POSIX / timer.H
blobdbab3cd61f519e546300bd8c464514ff32253511
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2004-2011 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     Foam::timer
27 Description
28     Implements a timeout mechanism via sigalarm.
30     Example usage:
31     \code
32         timer myTimer(5);     // 5 sec
33         ..
34         if (timedOut(myTimer))
35         {
36             // timed out
37         }
38         else
39         {
40             // do something possible blocking
41         }
42     \endcode
44     Constructor set signal handler on sigalarm and alarm(). Destructor
45     clears these.
47     timedOut is macro because setjmp can't be in member function of timer.
48     ?something to do with stack frames.
50 Warning
51     The setjmp restores complete register state so including local vars
52     held in regs. So if in blocking part something gets calced in a stack
53     based variable make sure it is declared 'volatile'.
55 SourceFiles
56     timer.C
58 \*---------------------------------------------------------------------------*/
60 #ifndef timer_H
61 #define timer_H
63 #include "className.H"
65 #include <signal.h>
66 #include <setjmp.h>
68 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
70 //- check it a timeout has occured
71 //  keep setjmp in same stack frame so no function calls
72 #define timedOut(x) \
73     (((x).newTimeOut_ > 0) ? setjmp(Foam::timer::envAlarm) : false)
75 namespace Foam
78 /*---------------------------------------------------------------------------*\
79                            Class timer Declaration
80 \*---------------------------------------------------------------------------*/
82 class timer
84     // Private data
86         //- old signal masks
87         static struct sigaction oldAction_;
89         //- old alarm() value
90         static unsigned int oldTimeOut_;
93     // Private Member Functions
95         //- alarm handler
96         static void signalHandler(int);
99 public:
101     // Public data
103         //- Declare name of the class and its debug switch
104         ClassName("timer");
106         //- current time out value. Needed by macro timedOut
107         unsigned int newTimeOut_;
109         //- state for setjmp. Needed by macro timedOut
110         static jmp_buf envAlarm;
113     // Constructors
115         //- Construct from components.
116         //  newTimeOut=0 makes it do nothing.
117         timer(const unsigned int newTimeOut);
120     //- Destructor
121     ~timer();
125 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
127 } // End namespace Foam
129 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
131 #endif
133 // ************************************************************************* //