blob: a2cf28a2d6ea2bfcebf9af4de12fc256c4ad5562 [file] [log] [blame]
/*
* 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 org.apache.uima.ruta.textruler.core;
import java.util.ArrayList;
import java.util.List;
import org.apache.uima.analysis_engine.AnalysisEngine;
import org.apache.uima.cas.CAS;
import org.apache.uima.ruta.textruler.TextRulerPlugin;
/**
*
* This class tries to be a workaround for a potential UIMA CAS Memory Leak. We have to keep the
* total count of CAS objects constant, even if we call the whole TextRulerController machinery
* multiple times in a batch-like row!
*
* The idea is: Everybody that needs a CAS does not create one itself but asks this static class
* here. If it is done with the CAS, it releases it here again, but it is held in memory and reused
* when somebody else needs a reset CAS again.
*
* Clients are for example CasCache, TextRulerBasicLearner, ...
*
*/
public class GlobalCASSource {
public static int CAS = 0;
private static List<CAS> free = new ArrayList<CAS>();
private static List<CAS> inUsage = new ArrayList<CAS>();
public static synchronized CAS allocCAS(AnalysisEngine ae) {
if (free.size() > 0) {
CAS result = free.get(free.size() - 1);
free.remove(free.size() - 1);
inUsage.add(result);
return result;
} else {
try {
CAS newCas = ae.newCAS();
CAS++;
System.out.println("####### CAS: " + CAS);
inUsage.add(newCas);
return newCas;
} catch (Exception e) {
TextRulerPlugin.error(e);
return null;
}
}
}
public static synchronized void releaseCAS(CAS cas) {
if (inUsage.contains(cas)) {
cas.reset();
inUsage.remove(cas);
free.add(cas);
// TextRulerToolkit.log("[GlobalCASSource] RELEASED CAS, total CAS count = "+count);
} else {
if (free.contains(cas)) {
cas.reset();
} else {
cas.release();
TextRulerToolkit
.log("[GlobalCASSource.release] Error, tried to release an unknown CAS object!");
}
}
}
public static void clear() {
for (CAS each : free) {
each.release();
each = null;
}
free.clear();
for (CAS each : inUsage) {
each.release();
each = null;
}
inUsage.clear();
CAS = 0;
}
}