update dev300-m58
[ooovba.git] / salhelper / source / condition.cxx
blob2f7878815a6b62897569b89c0d4cf252acc09025
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: condition.cxx,v $
10 * $Revision: 1.5 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
32 #include <salhelper/condition.hxx>
33 #include <osl/time.h>
36 using namespace salhelper;
39 /******************************************************************
40 * *
41 * Condition *
42 * *
43 ******************************************************************/
45 Condition::Condition(osl::Mutex& aMutex)
46 : m_aMutex(aMutex),
47 m_aCondition(osl_createCondition())
52 Condition::~Condition()
54 osl_destroyCondition(m_aCondition);
58 /******************************************************************
59 * *
60 * ConditionModifier *
61 * *
62 ******************************************************************/
64 ConditionModifier::ConditionModifier(Condition& aCond)
65 : m_aCond(aCond)
67 m_aCond.m_aMutex.acquire();
71 ConditionModifier::~ConditionModifier()
73 if(m_aCond.applies())
74 osl_setCondition(m_aCond.m_aCondition);
76 m_aCond.m_aMutex.release();
81 /******************************************************************
82 * *
83 * ConditionWaiter *
84 * *
85 ******************************************************************/
87 ConditionWaiter::timedout::timedout() {}
89 ConditionWaiter::timedout::timedout(timedout const &) {}
91 ConditionWaiter::timedout::~timedout() {}
93 ConditionWaiter::timedout &
94 ConditionWaiter::timedout::operator =(timedout const &) { return *this; }
96 ConditionWaiter::ConditionWaiter(Condition& aCond)
97 : m_aCond(aCond)
99 while(true) {
100 osl_waitCondition(m_aCond.m_aCondition,0);
101 m_aCond.m_aMutex.acquire();
103 if(m_aCond.applies())
104 break;
105 else {
106 osl_resetCondition(m_aCond.m_aCondition);
107 m_aCond.m_aMutex.release();
113 ConditionWaiter::ConditionWaiter(Condition& aCond,sal_uInt32 milliSec)
114 throw(
115 ConditionWaiter::timedout
117 : m_aCond(aCond)
119 TimeValue aTime;
120 aTime.Seconds = milliSec / 1000;
121 aTime.Nanosec = 1000000 * ( milliSec % 1000 );
123 while(true) {
124 if( osl_waitCondition(m_aCond.m_aCondition,&aTime) ==
125 osl_cond_result_timeout )
126 throw timedout();
128 m_aCond.m_aMutex.acquire();
130 if(m_aCond.applies())
131 break;
132 else {
133 osl_resetCondition(m_aCond.m_aCondition);
134 m_aCond.m_aMutex.release();
140 ConditionWaiter::~ConditionWaiter()
142 if(! m_aCond.applies())
143 osl_resetCondition(m_aCond.m_aCondition);
144 m_aCond.m_aMutex.release();