1*2be43276SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*2be43276SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*2be43276SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*2be43276SAndrew Rist * distributed with this work for additional information 6*2be43276SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*2be43276SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*2be43276SAndrew Rist * "License"); you may not use this file except in compliance 9*2be43276SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*2be43276SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*2be43276SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*2be43276SAndrew Rist * software distributed under the License is distributed on an 15*2be43276SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*2be43276SAndrew Rist * KIND, either express or implied. See the License for the 17*2be43276SAndrew Rist * specific language governing permissions and limitations 18*2be43276SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*2be43276SAndrew Rist *************************************************************/ 21*2be43276SAndrew Rist 22*2be43276SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir package com.sun.star.lib.uno.environments.remote; 25cdf0e10cSrcweir 26cdf0e10cSrcweir /** 27cdf0e10cSrcweir * This class implements a java thread pool. 28cdf0e10cSrcweir * <p> 29cdf0e10cSrcweir * @version $Revision: 1.13 $ $ $Date: 2008-04-11 11:20:22 $ 30cdf0e10cSrcweir * @author Kay Ramme 31cdf0e10cSrcweir * @see com.sun.star.uno.UnoRuntime 32cdf0e10cSrcweir * @see com.sun.star.lib.uno.environments.remote.ThreadPool 33cdf0e10cSrcweir * @see com.sun.star.lib.uno.environments.remote.IThreadPool 34cdf0e10cSrcweir * @see com.sun.star.lib.uno.environments.remote.Job 35cdf0e10cSrcweir * @see com.sun.star.lib.uno.environments.remote.JobQueue 36cdf0e10cSrcweir * @since UDK1.0 37cdf0e10cSrcweir */ 38cdf0e10cSrcweir public class JavaThreadPool implements IThreadPool { 39cdf0e10cSrcweir /** 40cdf0e10cSrcweir * When set to true, enables various debugging output. 41cdf0e10cSrcweir */ 42cdf0e10cSrcweir private static final boolean DEBUG = false; 43cdf0e10cSrcweir 44cdf0e10cSrcweir JavaThreadPoolFactory _javaThreadPoolFactory; 45cdf0e10cSrcweir JavaThreadPool(JavaThreadPoolFactory javaThreadPoolFactory)46cdf0e10cSrcweir JavaThreadPool(JavaThreadPoolFactory javaThreadPoolFactory) { 47cdf0e10cSrcweir _javaThreadPoolFactory = javaThreadPoolFactory; 48cdf0e10cSrcweir } 49cdf0e10cSrcweir getThreadId()50cdf0e10cSrcweir public ThreadId getThreadId() { 51cdf0e10cSrcweir return JavaThreadPoolFactory.getThreadId(); 52cdf0e10cSrcweir } 53cdf0e10cSrcweir attach( ThreadId threadId )54cdf0e10cSrcweir public Object attach( ThreadId threadId ) 55cdf0e10cSrcweir { 56cdf0e10cSrcweir if(DEBUG) System.err.println("##### " + getClass().getName() + ".attach - id:" + threadId); 57cdf0e10cSrcweir JobQueue jobQueue = _javaThreadPoolFactory.getJobQueue(threadId); 58cdf0e10cSrcweir if(jobQueue == null) 59cdf0e10cSrcweir jobQueue = new JobQueue(_javaThreadPoolFactory, threadId, false); 60cdf0e10cSrcweir 61cdf0e10cSrcweir // acquiring the jobQueue registers it at the ThreadPoolFactory 62cdf0e10cSrcweir jobQueue.acquire(); 63cdf0e10cSrcweir return jobQueue; 64cdf0e10cSrcweir } 65cdf0e10cSrcweir attach()66cdf0e10cSrcweir public void attach() { 67cdf0e10cSrcweir attach( getThreadId() ); 68cdf0e10cSrcweir } 69cdf0e10cSrcweir detach( Object handle, ThreadId id )70cdf0e10cSrcweir public void detach( Object handle, ThreadId id ) 71cdf0e10cSrcweir { 72cdf0e10cSrcweir ((JobQueue)handle).release(); 73cdf0e10cSrcweir } 74cdf0e10cSrcweir detach()75cdf0e10cSrcweir public void detach() { 76cdf0e10cSrcweir ThreadId threadId = getThreadId(); 77cdf0e10cSrcweir detach(_javaThreadPoolFactory.getJobQueue(threadId), threadId ); 78cdf0e10cSrcweir } 79cdf0e10cSrcweir 80cdf0e10cSrcweir enter( )81cdf0e10cSrcweir public Object enter( ) throws Throwable { 82cdf0e10cSrcweir ThreadId threadId = getThreadId(); 83cdf0e10cSrcweir return enter( _javaThreadPoolFactory.getJobQueue( threadId ), threadId ); 84cdf0e10cSrcweir } 85cdf0e10cSrcweir enter( Object handle, ThreadId threadId )86cdf0e10cSrcweir public Object enter( Object handle, ThreadId threadId ) throws Throwable { 87cdf0e10cSrcweir return ((JobQueue)handle).enter(this); 88cdf0e10cSrcweir } 89cdf0e10cSrcweir putJob(Job job)90cdf0e10cSrcweir public void putJob(Job job) { 91cdf0e10cSrcweir if (!job.isRequest() || job.isSynchronous()) { 92cdf0e10cSrcweir JobQueue jobQueue = _javaThreadPoolFactory.getJobQueue(job.getThreadId()); 93cdf0e10cSrcweir 94cdf0e10cSrcweir // this has not be synchronized, cause 95cdf0e10cSrcweir // sync jobs can only come over one bridge 96cdf0e10cSrcweir // (cause the thread blocks on other side) 97cdf0e10cSrcweir if(jobQueue == null) 98cdf0e10cSrcweir jobQueue = new JobQueue(_javaThreadPoolFactory, job.getThreadId(), true); 99cdf0e10cSrcweir 100cdf0e10cSrcweir // put job acquires the queue and registers it at the ThreadPoolFactory 101cdf0e10cSrcweir jobQueue.putJob(job, this); 102cdf0e10cSrcweir } 103cdf0e10cSrcweir else { 104cdf0e10cSrcweir // this has to be synchronized, cause 105cdf0e10cSrcweir // async jobs of the same thread can come 106cdf0e10cSrcweir // over different bridges 107cdf0e10cSrcweir synchronized(_javaThreadPoolFactory) { 108cdf0e10cSrcweir JobQueue async_jobQueue = _javaThreadPoolFactory.getAsyncJobQueue(job.getThreadId()); 109cdf0e10cSrcweir 110cdf0e10cSrcweir // ensure there is jobQueue 111cdf0e10cSrcweir if(async_jobQueue == null) // so, there is really no async queue 112cdf0e10cSrcweir async_jobQueue = new JobQueue(_javaThreadPoolFactory, job.getThreadId()); 113cdf0e10cSrcweir 114cdf0e10cSrcweir // put job acquires the queue and registers it at the ThreadPoolFactory 115cdf0e10cSrcweir async_jobQueue.putJob(job, this); 116cdf0e10cSrcweir } 117cdf0e10cSrcweir } 118cdf0e10cSrcweir } 119cdf0e10cSrcweir dispose(Throwable throwable)120cdf0e10cSrcweir public void dispose(Throwable throwable) { 121cdf0e10cSrcweir if(DEBUG) System.err.println("##### " + getClass().getName() + ".dispose:" + throwable); 122cdf0e10cSrcweir 123cdf0e10cSrcweir _javaThreadPoolFactory.dispose(this, throwable); 124cdf0e10cSrcweir } 125cdf0e10cSrcweir destroy()126cdf0e10cSrcweir public void destroy() { 127cdf0e10cSrcweir } 128cdf0e10cSrcweir } 129