Initial commit for version 2.0.x patch release
[OpenFOAM-2.0.x.git] / src / OSspecific / POSIX / timer.C
blob21168246a78974a9e7821ac67c4a01c0ebd4275f
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2004-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 \*---------------------------------------------------------------------------*/
26 #include <unistd.h>
28 #include "error.H"
29 #include "timer.H"
31 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
33 defineTypeNameAndDebug(Foam::timer, 0);
35 jmp_buf Foam::timer::envAlarm;
37 struct sigaction Foam::timer::oldAction_;
39 unsigned int Foam::timer::oldTimeOut_ = 0;
41 // * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
43 void Foam::timer::signalHandler(int)
45     if (debug)
46     {
47         Info<< "Foam::timer::signalHandler(int sig) : "
48             << " timed out. Jumping."
49             << endl;
50     }
51     longjmp(envAlarm, 1);
54 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
56 Foam::timer::timer(const unsigned int newTimeOut)
58     newTimeOut_(newTimeOut)
61     if (newTimeOut > 0)
62     {
63         // Is singleton since handler is static function
64         if (oldTimeOut_ != 0)
65         {
66             FatalErrorIn
67             (
68                 "Foam::timer::timer(const unsigned int)"
69             )   << "timer already used."
70                 << abort(FatalError);
71         }
73         // Install alarm signal handler:
74         // - do not block any signals while in it
75         // - clear list of signals to mask
76         struct sigaction newAction;
77         newAction.sa_handler = timer::signalHandler;
78         newAction.sa_flags = SA_NODEFER;
79         sigemptyset(&newAction.sa_mask);
81         if (sigaction(SIGALRM, &newAction, &oldAction_) < 0)
82         {
83             FatalErrorIn
84             (
85                 "Foam::timer::timer(const unsigned int)"
86             )   << "sigaction(SIGALRM) error"
87                 << abort(FatalError);
88         }
90         oldTimeOut_ = ::alarm(newTimeOut);
92         if (debug)
93         {
94             Info<< "Foam::timer::timer(const unsigned int) : "
95                 << " installing timeout " << int(newTimeOut_)
96                 << " seconds"
97                 << " (overriding old timeout " << int(oldTimeOut_)
98                 << ")." << endl;
99         }
100     }
104 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
106 Foam::timer::~timer()
108     if (newTimeOut_ > 0)
109     {
110         if (debug)
111         {
112             Info<< "Foam::timer::~timer(const unsigned int) : timeOut="
113                 << int(newTimeOut_)
114                 << " : resetting timeOut to " << int(oldTimeOut_) << endl;
115         }
117         // Reset timer
118         ::alarm(oldTimeOut_);
119         oldTimeOut_ = 0;
121         // Restore signal handler
122         if (sigaction(SIGALRM, &oldAction_, NULL) < 0)
123         {
124             FatalErrorIn
125             (
126                 "Foam::timer::~timer(const struct sigaction&"
127                 "const struct sigaction&)"
128             )   << "sigaction(SIGALRM) error"
129                 << abort(FatalError);
130         }
131     }
134 // ************************************************************************* //