| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| package com.sun.star.lib.uno.environments.remote; |
| |
| /** |
| * This class implements a java thread pool. |
| * <p> |
| * @version $Revision: 1.13 $ $ $Date: 2008-04-11 11:20:22 $ |
| * @author Kay Ramme |
| * @see com.sun.star.uno.UnoRuntime |
| * @see com.sun.star.lib.uno.environments.remote.ThreadPool |
| * @see com.sun.star.lib.uno.environments.remote.IThreadPool |
| * @see com.sun.star.lib.uno.environments.remote.Job |
| * @see com.sun.star.lib.uno.environments.remote.JobQueue |
| * @since UDK1.0 |
| */ |
| public class JavaThreadPool implements IThreadPool { |
| /** |
| * When set to true, enables various debugging output. |
| */ |
| private static final boolean DEBUG = false; |
| |
| JavaThreadPoolFactory _javaThreadPoolFactory; |
| |
| JavaThreadPool(JavaThreadPoolFactory javaThreadPoolFactory) { |
| _javaThreadPoolFactory = javaThreadPoolFactory; |
| } |
| |
| public ThreadId getThreadId() { |
| return JavaThreadPoolFactory.getThreadId(); |
| } |
| |
| public Object attach( ThreadId threadId ) |
| { |
| if(DEBUG) System.err.println("##### " + getClass().getName() + ".attach - id:" + threadId); |
| JobQueue jobQueue = _javaThreadPoolFactory.getJobQueue(threadId); |
| if(jobQueue == null) |
| jobQueue = new JobQueue(_javaThreadPoolFactory, threadId, false); |
| |
| // acquiring the jobQueue registers it at the ThreadPoolFactory |
| jobQueue.acquire(); |
| return jobQueue; |
| } |
| |
| public void attach() { |
| attach( getThreadId() ); |
| } |
| |
| public void detach( Object handle, ThreadId id ) |
| { |
| ((JobQueue)handle).release(); |
| } |
| |
| public void detach() { |
| ThreadId threadId = getThreadId(); |
| detach(_javaThreadPoolFactory.getJobQueue(threadId), threadId ); |
| } |
| |
| |
| public Object enter( ) throws Throwable { |
| ThreadId threadId = getThreadId(); |
| return enter( _javaThreadPoolFactory.getJobQueue( threadId ), threadId ); |
| } |
| |
| public Object enter( Object handle, ThreadId threadId ) throws Throwable { |
| return ((JobQueue)handle).enter(this); |
| } |
| |
| public void putJob(Job job) { |
| if (!job.isRequest() || job.isSynchronous()) { |
| JobQueue jobQueue = _javaThreadPoolFactory.getJobQueue(job.getThreadId()); |
| |
| // this has not be synchronized, cause |
| // sync jobs can only come over one bridge |
| // (cause the thread blocks on other side) |
| if(jobQueue == null) |
| jobQueue = new JobQueue(_javaThreadPoolFactory, job.getThreadId(), true); |
| |
| // put job acquires the queue and registers it at the ThreadPoolFactory |
| jobQueue.putJob(job, this); |
| } |
| else { |
| // this has to be synchronized, cause |
| // async jobs of the same thread can come |
| // over different bridges |
| synchronized(_javaThreadPoolFactory) { |
| JobQueue async_jobQueue = _javaThreadPoolFactory.getAsyncJobQueue(job.getThreadId()); |
| |
| // ensure there is jobQueue |
| if(async_jobQueue == null) // so, there is really no async queue |
| async_jobQueue = new JobQueue(_javaThreadPoolFactory, job.getThreadId()); |
| |
| // put job acquires the queue and registers it at the ThreadPoolFactory |
| async_jobQueue.putJob(job, this); |
| } |
| } |
| } |
| |
| public void dispose(Throwable throwable) { |
| if(DEBUG) System.err.println("##### " + getClass().getName() + ".dispose:" + throwable); |
| |
| _javaThreadPoolFactory.dispose(this, throwable); |
| } |
| |
| public void destroy() { |
| } |
| } |