/* * 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.jini.outrigger; import java.util.LinkedList; import java.util.logging.Level; import java.util.logging.Logger; import net.jini.id.Uuid; /** * Logs expiration of leases and asynchronously persists them to disk. */ class ExpirationOpQueue extends Thread { /** <code>true</code> if we should stop */ private boolean dead; /** The queue of expirations to log */ private final LinkedList queue = new LinkedList(); /** The server we are working for */ private final OutriggerServerImpl server; /** Logger for logging exceptions */ private static final Logger logger = Logger.getLogger(OutriggerServerImpl.leaseLoggerName); /** * Create a new <code>ExpirationOpQueue</code> that * will handle lease expiration logging for the * specified server. * @param server the <code>OutriggerServerImpl</code> to * log for. */ ExpirationOpQueue(OutriggerServerImpl server) { super("Expiration Op Queue"); this.server = server; } /** * Enqueue the logging of the expiration of the specified lease. * @param cookie The cookie of the lease that has expired. */ synchronized void enqueue(Uuid cookie) { queue.add(cookie); notifyAll(); } /** * Stop the queue */ synchronized void terminate() { dead = true; notifyAll(); } public void run() { while (!dead) { // ok not to lock since it starts false try { final Uuid cookie; synchronized (this) { while (!dead && queue.isEmpty()) { wait(); } if (dead) return; cookie = (Uuid)queue.removeFirst(); } server.cancelOp(cookie, true); } catch (Throwable t) { logger.log(Level.INFO, "ExpirationOpQueue.run encountered " + t.getClass().getName() + ", continuing", t); } } } }