Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : : #include <observablethread.hxx>
29 : :
30 : : #include <boost/shared_ptr.hpp>
31 : :
32 : : /** class for an observable thread
33 : :
34 : : #i73788#
35 : :
36 : : @author OD
37 : : */
38 : 8 : ObservableThread::ObservableThread()
39 : : : mnRefCount( 0 ),
40 : : mnThreadID( 0 ),
41 [ + - ]: 8 : mpThreadListener()
42 : : {
43 : 8 : }
44 : :
45 [ + - ]: 8 : ObservableThread::~ObservableThread()
46 : : {
47 [ - + ]: 8 : }
48 : :
49 : 48 : oslInterlockedCount ObservableThread::acquire()
50 : : {
51 : 48 : return osl_incrementInterlockedCount( &mnRefCount );
52 : : }
53 : :
54 : 48 : oslInterlockedCount ObservableThread::release()
55 : : {
56 : 48 : oslInterlockedCount nCount( osl_decrementInterlockedCount( &mnRefCount ) );
57 [ + + ]: 48 : if ( nCount == 0 )
58 [ + - ]: 8 : delete this;
59 : 48 : return nCount;
60 : : }
61 : :
62 : 8 : void ObservableThread::SetListener( boost::weak_ptr< IFinishedThreadListener > pThreadListener,
63 : : const oslInterlockedCount nThreadID )
64 : : {
65 : 8 : mpThreadListener = pThreadListener;
66 : 8 : mnThreadID = nThreadID;
67 : 8 : }
68 : :
69 : 8 : void SAL_CALL ObservableThread::run()
70 : : {
71 : 8 : acquire();
72 : :
73 : 8 : threadFunction();
74 : 8 : }
75 : :
76 : 8 : void SAL_CALL ObservableThread::onTerminated()
77 : : {
78 [ + - ]: 8 : threadFinished();
79 : :
80 : : // notify observer
81 [ + - ]: 8 : boost::shared_ptr< IFinishedThreadListener > pThreadListener = mpThreadListener.lock();
82 [ + - ]: 8 : if ( pThreadListener )
83 : : {
84 [ + - ]: 8 : pThreadListener->NotifyAboutFinishedThread( mnThreadID );
85 : : }
86 : :
87 [ + - ][ + - ]: 8 : release();
88 : 8 : }
89 : :
90 : 8 : void ObservableThread::threadFinished()
91 : : {
92 : : // empty default implementation
93 : 8 : }
94 : :
95 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|