1c6ed87c9SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3c6ed87c9SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4c6ed87c9SAndrew Rist * or more contributor license agreements. See the NOTICE file 5c6ed87c9SAndrew Rist * distributed with this work for additional information 6c6ed87c9SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7c6ed87c9SAndrew Rist * to you under the Apache License, Version 2.0 (the 8c6ed87c9SAndrew Rist * "License"); you may not use this file except in compliance 9c6ed87c9SAndrew Rist * with the License. You may obtain a copy of the License at 10c6ed87c9SAndrew Rist * 11c6ed87c9SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12c6ed87c9SAndrew Rist * 13c6ed87c9SAndrew Rist * Unless required by applicable law or agreed to in writing, 14c6ed87c9SAndrew Rist * software distributed under the License is distributed on an 15c6ed87c9SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16c6ed87c9SAndrew Rist * KIND, either express or implied. See the License for the 17c6ed87c9SAndrew Rist * specific language governing permissions and limitations 18c6ed87c9SAndrew Rist * under the License. 19c6ed87c9SAndrew Rist * 20c6ed87c9SAndrew Rist *************************************************************/ 21c6ed87c9SAndrew Rist 22c6ed87c9SAndrew Rist 23cdf0e10cSrcweir #include <hash_map> 24cdf0e10cSrcweir 25cdf0e10cSrcweir #include <osl/conditn.h> 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <rtl/byteseq.hxx> 28cdf0e10cSrcweir 29cdf0e10cSrcweir #include <boost/shared_ptr.hpp> 30cdf0e10cSrcweir 31cdf0e10cSrcweir #include "jobqueue.hxx" 32cdf0e10cSrcweir 33cdf0e10cSrcweir 34cdf0e10cSrcweir using namespace ::rtl; 35cdf0e10cSrcweir namespace cppu_threadpool { 36cdf0e10cSrcweir class ORequestThread; 37cdf0e10cSrcweir 38cdf0e10cSrcweir struct EqualThreadId 39cdf0e10cSrcweir { operator ()cppu_threadpool::EqualThreadId40cdf0e10cSrcweir sal_Int32 operator () ( const ::rtl::ByteSequence &a , const ::rtl::ByteSequence &b ) const 41cdf0e10cSrcweir { 42cdf0e10cSrcweir return a == b; 43cdf0e10cSrcweir } 44cdf0e10cSrcweir }; 45cdf0e10cSrcweir 46cdf0e10cSrcweir struct HashThreadId 47cdf0e10cSrcweir { operator ()cppu_threadpool::HashThreadId48cdf0e10cSrcweir sal_Int32 operator () ( const ::rtl::ByteSequence &a ) const 49cdf0e10cSrcweir { 50cdf0e10cSrcweir if( a.getLength() >= 4 ) 51cdf0e10cSrcweir { 52cdf0e10cSrcweir return *(sal_Int32 *)a.getConstArray(); 53cdf0e10cSrcweir } 54cdf0e10cSrcweir return 0; 55cdf0e10cSrcweir } 56cdf0e10cSrcweir }; 57cdf0e10cSrcweir 58cdf0e10cSrcweir typedef ::std::hash_map 59cdf0e10cSrcweir < 60cdf0e10cSrcweir ByteSequence, // ThreadID 61cdf0e10cSrcweir ::std::pair < JobQueue * , JobQueue * >, 62cdf0e10cSrcweir HashThreadId, 63cdf0e10cSrcweir EqualThreadId 64cdf0e10cSrcweir > ThreadIdHashMap; 65cdf0e10cSrcweir 66cdf0e10cSrcweir typedef ::std::list < sal_Int64 > DisposedCallerList; 67cdf0e10cSrcweir 68cdf0e10cSrcweir 69cdf0e10cSrcweir struct WaitingThread 70cdf0e10cSrcweir { 71cdf0e10cSrcweir oslCondition condition; 72cdf0e10cSrcweir ORequestThread *thread; 73cdf0e10cSrcweir }; 74cdf0e10cSrcweir 75cdf0e10cSrcweir typedef ::std::list < struct ::cppu_threadpool::WaitingThread * > WaitingThreadList; 76cdf0e10cSrcweir 77cdf0e10cSrcweir class DisposedCallerAdmin; 78cdf0e10cSrcweir typedef boost::shared_ptr<DisposedCallerAdmin> DisposedCallerAdminHolder; 79cdf0e10cSrcweir 80cdf0e10cSrcweir class DisposedCallerAdmin 81cdf0e10cSrcweir { 82cdf0e10cSrcweir public: 83cdf0e10cSrcweir ~DisposedCallerAdmin(); 84cdf0e10cSrcweir 85cdf0e10cSrcweir static DisposedCallerAdminHolder getInstance(); 86cdf0e10cSrcweir 87cdf0e10cSrcweir void dispose( sal_Int64 nDisposeId ); 88cdf0e10cSrcweir void stopDisposing( sal_Int64 nDisposeId ); 89cdf0e10cSrcweir sal_Bool isDisposed( sal_Int64 nDisposeId ); 90cdf0e10cSrcweir 91cdf0e10cSrcweir private: 92cdf0e10cSrcweir ::osl::Mutex m_mutex; 93cdf0e10cSrcweir DisposedCallerList m_lst; 94cdf0e10cSrcweir }; 95cdf0e10cSrcweir 96cdf0e10cSrcweir class ThreadPool; 97cdf0e10cSrcweir typedef boost::shared_ptr<ThreadPool> ThreadPoolHolder; 98cdf0e10cSrcweir 99cdf0e10cSrcweir class ThreadPool 100cdf0e10cSrcweir { 101cdf0e10cSrcweir public: 102cdf0e10cSrcweir ThreadPool(); 103cdf0e10cSrcweir ~ThreadPool(); 104cdf0e10cSrcweir static ThreadPoolHolder getInstance(); 105cdf0e10cSrcweir 106cdf0e10cSrcweir void dispose( sal_Int64 nDisposeId ); 107cdf0e10cSrcweir void stopDisposing( sal_Int64 nDisposeId ); 108cdf0e10cSrcweir 109cdf0e10cSrcweir void addJob( const ByteSequence &aThreadId, 110cdf0e10cSrcweir sal_Bool bAsynchron, 111cdf0e10cSrcweir void *pThreadSpecificData, 112cdf0e10cSrcweir RequestFun * doRequest ); 113cdf0e10cSrcweir 114cdf0e10cSrcweir void prepare( const ByteSequence &aThreadId ); 115cdf0e10cSrcweir void * enter( const ByteSequence &aThreadId, sal_Int64 nDisposeId ); 116cdf0e10cSrcweir 117cdf0e10cSrcweir /******** 118*07a3d7f1SPedro Giffuni * @return true, if queue could be successfully revoked. 119cdf0e10cSrcweir ********/ 120cdf0e10cSrcweir sal_Bool revokeQueue( const ByteSequence & aThreadId , sal_Bool bAsynchron ); 121cdf0e10cSrcweir 122cdf0e10cSrcweir void waitInPool( ORequestThread *pThread ); 123cdf0e10cSrcweir private: 124cdf0e10cSrcweir void createThread( JobQueue *pQueue, const ByteSequence &aThreadId, sal_Bool bAsynchron); 125cdf0e10cSrcweir 126cdf0e10cSrcweir 127cdf0e10cSrcweir ThreadIdHashMap m_mapQueue; 128cdf0e10cSrcweir ::osl::Mutex m_mutex; 129cdf0e10cSrcweir 130cdf0e10cSrcweir ::osl::Mutex m_mutexWaitingThreadList; 131cdf0e10cSrcweir WaitingThreadList m_lstThreads; 132cdf0e10cSrcweir 133cdf0e10cSrcweir DisposedCallerAdminHolder m_DisposedCallerAdmin; 134cdf0e10cSrcweir }; 135cdf0e10cSrcweir 136cdf0e10cSrcweir } // end namespace cppu_threadpool 137