/*
* Copyright 2004-2012 the Seasar Foundation and the Others.
*
* Licensed 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 org.seasar.mayaa.impl.engine.specification.serialize;
import org.seasar.mayaa.impl.engine.specification.SpecificationImpl;
/**
* @author Taro Kato (Gluegent, Inc.)
*/
public class SerializeThreadManager {
static SerializeThread[] _serializeThreads = new SerializeThread[10];
private static volatile boolean _terminated;
private SerializeThreadManager() {
throw new UnsupportedOperationException();
}
public static boolean serializeReserve(
SpecificationImpl spec, Object servletContext) {
int fewIndex = -1;
int min = Integer.MAX_VALUE;
synchronized(_serializeThreads) {
if (_terminated) {
return false;
}
for (int i = 0; i < _serializeThreads.length; i++) {
if (_serializeThreads[i] == null) {
_serializeThreads[i] = new SerializeThread(i, servletContext);
if (_serializeThreads[i].add(spec)) {
_serializeThreads[i].start();
return true;
}
}
int waitCount = _serializeThreads[i].waitCount();
if (waitCount < min) {
min = waitCount;
fewIndex = i;
}
}
return _serializeThreads[fewIndex].add(spec);
}
}
public static void destroy() {
_terminated = true;
synchronized (_serializeThreads) {
for (int i = 0; i < _serializeThreads.length; i++) {
if (_serializeThreads[i] != null) {
_serializeThreads[i].terminate();
}
}
}
while (!isReleasedAll()) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
break;
}
}
}
static void threadDestroy(int index) {
synchronized (_serializeThreads) {
_serializeThreads[index] = null;
}
}
static boolean isReleasedAll() {
synchronized (_serializeThreads) {
for (int i = 0; i < _serializeThreads.length; i++) {
if (_serializeThreads[i] != null) {
return false;
}
}
return true;
}
}
}