xref: /AOO41X/main/jurt/com/sun/star/lib/uno/environments/remote/JavaThreadPool.java (revision 2be432768a66cc90838f6a32e76ec156f587e741)
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