1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 package com.sun.star.lib.uno.environments.remote; 29 30 /** 31 * This class implements a java thread pool. 32 * <p> 33 * @version $Revision: 1.13 $ $ $Date: 2008-04-11 11:20:22 $ 34 * @author Kay Ramme 35 * @see com.sun.star.uno.UnoRuntime 36 * @see com.sun.star.lib.uno.environments.remote.ThreadPool 37 * @see com.sun.star.lib.uno.environments.remote.IThreadPool 38 * @see com.sun.star.lib.uno.environments.remote.Job 39 * @see com.sun.star.lib.uno.environments.remote.JobQueue 40 * @since UDK1.0 41 */ 42 public class JavaThreadPool implements IThreadPool { 43 /** 44 * When set to true, enables various debugging output. 45 */ 46 private static final boolean DEBUG = false; 47 48 JavaThreadPoolFactory _javaThreadPoolFactory; 49 50 JavaThreadPool(JavaThreadPoolFactory javaThreadPoolFactory) { 51 _javaThreadPoolFactory = javaThreadPoolFactory; 52 } 53 54 public ThreadId getThreadId() { 55 return JavaThreadPoolFactory.getThreadId(); 56 } 57 58 public Object attach( ThreadId threadId ) 59 { 60 if(DEBUG) System.err.println("##### " + getClass().getName() + ".attach - id:" + threadId); 61 JobQueue jobQueue = _javaThreadPoolFactory.getJobQueue(threadId); 62 if(jobQueue == null) 63 jobQueue = new JobQueue(_javaThreadPoolFactory, threadId, false); 64 65 // acquiring the jobQueue registers it at the ThreadPoolFactory 66 jobQueue.acquire(); 67 return jobQueue; 68 } 69 70 public void attach() { 71 attach( getThreadId() ); 72 } 73 74 public void detach( Object handle, ThreadId id ) 75 { 76 ((JobQueue)handle).release(); 77 } 78 79 public void detach() { 80 ThreadId threadId = getThreadId(); 81 detach(_javaThreadPoolFactory.getJobQueue(threadId), threadId ); 82 } 83 84 85 public Object enter( ) throws Throwable { 86 ThreadId threadId = getThreadId(); 87 return enter( _javaThreadPoolFactory.getJobQueue( threadId ), threadId ); 88 } 89 90 public Object enter( Object handle, ThreadId threadId ) throws Throwable { 91 return ((JobQueue)handle).enter(this); 92 } 93 94 public void putJob(Job job) { 95 if (!job.isRequest() || job.isSynchronous()) { 96 JobQueue jobQueue = _javaThreadPoolFactory.getJobQueue(job.getThreadId()); 97 98 // this has not be synchronized, cause 99 // sync jobs can only come over one bridge 100 // (cause the thread blocks on other side) 101 if(jobQueue == null) 102 jobQueue = new JobQueue(_javaThreadPoolFactory, job.getThreadId(), true); 103 104 // put job acquires the queue and registers it at the ThreadPoolFactory 105 jobQueue.putJob(job, this); 106 } 107 else { 108 // this has to be synchronized, cause 109 // async jobs of the same thread can come 110 // over different bridges 111 synchronized(_javaThreadPoolFactory) { 112 JobQueue async_jobQueue = _javaThreadPoolFactory.getAsyncJobQueue(job.getThreadId()); 113 114 // ensure there is jobQueue 115 if(async_jobQueue == null) // so, there is really no async queue 116 async_jobQueue = new JobQueue(_javaThreadPoolFactory, job.getThreadId()); 117 118 // put job acquires the queue and registers it at the ThreadPoolFactory 119 async_jobQueue.putJob(job, this); 120 } 121 } 122 } 123 124 public void dispose(Throwable throwable) { 125 if(DEBUG) System.err.println("##### " + getClass().getName() + ".dispose:" + throwable); 126 127 _javaThreadPoolFactory.dispose(this, throwable); 128 } 129 130 public void destroy() { 131 } 132 } 133