1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: thread.cxx,v $
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 <vos/diagnose.hxx>
33 #include <vos/object.hxx>
34 #include <vos/thread.hxx>
38 void vos::threadWorkerFunction_impl(void * pthis
)
40 NAMESPACE_VOS(OThread
)* pThis
= (NAMESPACE_VOS(OThread
)*)pthis
;
42 // call Handler-Function of OThread-derived class
45 // if not already terminating, by a kill do normal shutdown
46 if (! pThis
->m_bTerminating
)
48 pThis
->m_bTerminating
= sal_True
;
50 pThis
->onTerminated(); // could e.g. delete this
54 /////////////////////////////////////////////////////////////////////////////
59 VOS_IMPLEMENT_CLASSINFO(VOS_CLASSNAME(OThread
, vos
),
60 VOS_NAMESPACE(OThread
, vos
),
61 VOS_NAMESPACE(OObject
, vos
), 0);
66 m_bTerminating
= sal_False
;
67 m_aCondition
= osl_createCondition();
74 osl_destroyThread(m_hThread
);
77 osl_destroyCondition( m_aCondition
);
80 sal_Bool
OThread::create()
82 VOS_ASSERT(m_hThread
== 0); // only one running thread per instance
84 m_hThread
= osl_createSuspendedThread(
85 threadWorkerFunction_impl
, (void*)this);
87 osl_resumeThread(m_hThread
);
89 return m_hThread
!= 0;
92 sal_Bool
OThread::createSuspended()
94 VOS_ASSERT(m_hThread
== 0); // only one running thread per instance
96 m_hThread
= osl_createSuspendedThread(threadWorkerFunction_impl
, (void*)this);
97 return m_hThread
!= 0;
100 void OThread::suspend()
102 VOS_ASSERT(m_hThread
!= 0); // use only on running thread
104 osl_suspendThread(m_hThread
);
107 void OThread::resume()
109 VOS_ASSERT(m_hThread
!= 0); // use only on running thread
111 osl_resumeThread(m_hThread
);
114 sal_Bool
OThread::isRunning()
116 return m_hThread
!= 0 && osl_isThreadRunning(m_hThread
);
119 OThread::TThreadIdentifier
OThread::getIdentifier() const
121 return (TThreadIdentifier
)osl_getThreadIdentifier(m_hThread
);
124 OThread::TThreadIdentifier
OThread::getCurrentIdentifier()
126 return (TThreadIdentifier
)osl_getThreadIdentifier(0);
132 VOS_ASSERT(getCurrentIdentifier() != getIdentifier());
133 osl_joinWithThread(m_hThread
);
137 OThread::TThreadSleep
OThread::sleep(const TimeValue
& Delay
)
141 switch( osl_waitCondition( m_aCondition
, &Delay
) )
143 case osl_cond_result_ok
:
144 eRet
= TSleep_Normal
;
147 case osl_cond_result_timeout
:
148 eRet
= TSleep_Cancel
;
159 void OThread::wait(const TimeValue
& Delay
) {
160 osl_waitThread(&Delay
);
163 sal_Bool
OThread::awake()
165 osl_setCondition( m_aCondition
);
166 return osl_resetCondition( m_aCondition
);
169 void OThread::terminate()
171 osl_terminateThread(m_hThread
);
174 sal_Bool
OThread::schedule() {
175 return osl_scheduleThread(m_hThread
);
180 if (osl_isThreadRunning(m_hThread
))
182 // flag we are shutting down
183 m_bTerminating
= sal_True
;
190 void OThread::setPriority(OThread::TThreadPriority Priority
)
192 osl_setThreadPriority(m_hThread
, (oslThreadPriority
)Priority
);
195 OThread::TThreadPriority
OThread::getPriority()
197 return (TThreadPriority
)osl_getThreadPriority(m_hThread
);
201 void OThread::yield()
206 void OThread::onTerminated()
210 /////////////////////////////////////////////////////////////////////////////
215 VOS_IMPLEMENT_CLASSINFO(VOS_CLASSNAME(OThreadData
, vos
),
216 VOS_NAMESPACE(OThreadData
, vos
),
217 VOS_NAMESPACE(OObject
, vos
), 0);
219 OThreadData::OThreadData( oslThreadKeyCallbackFunction pCallback
)
221 m_hKey
= osl_createThreadKey( pCallback
);
225 OThreadData::~OThreadData()
227 osl_destroyThreadKey(m_hKey
);
230 sal_Bool
OThreadData::setData(void *pData
)
232 VOS_ASSERT(m_hKey
!= 0);
234 return (osl_setThreadKeyData(m_hKey
, pData
));
237 void *OThreadData::getData()
239 VOS_ASSERT(m_hKey
!= 0);
241 return (osl_getThreadKeyData(m_hKey
));