/* * 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.jackrabbit.core.state; import org.apache.jackrabbit.core.id.ItemId; /** * <code>ISMLocking</code> defines an interface for a locking strategy of an * {@link ItemStateManager}. * <p> * An implementation of <code>ISMLocking</code> must meet the following * requirements: * <ul> * <li>While a read lock is held for a given item with id <code>I</code> an * implementation must ensure that no write lock is issued for a change log * that contains a reference to an item with id <code>I</code>.</li> * <li>While a write lock is held for a given change log <code>C</code> an * implementation must ensure that no read lock is issued for an item that is * contained in <code>C</code>, unless the current thread is the owner of the * write lock!</li> * <li>While a write lock is held for a given change log <code>C</code> an * implementation must ensure that no write lock is issued for a change log * <code>C'</code> that intersects with <code>C</code>. That is both change * logs contain a reference to the same item. Please note that an implementation * is free to block requests entirely for additional write lock while a write * lock is active. It is not a requirement to support concurrent write locks. * </li> * <li>While a write lock is held for a change log <code>C</code>, the holder * of the write lock (and any related threads) needs to be able to acquire * a read lock even if other writers are waiting for the lock. This behaviour * must continue also when the write lock has been downgraded. Note that it * is not necessary for a holder of a read lock to be able to upgrade to a * write lock.</li> * </ul> */ public interface ISMLocking { /** * Acquire a read lock for the given item <code>id</code>. * @param id an item id. */ ReadLock acquireReadLock(ItemId id) throws InterruptedException; /** * Acquires a write lock for the given <code>changeLog</code>. * * @param changeLog the change log * @return the write lock for the given <code>changeLog</code>. * @throws InterruptedException if the thread is interrupted while creating * the write lock. */ WriteLock acquireWriteLock(ChangeLog changeLog) throws InterruptedException; public interface ReadLock { /** * Releases this lock. */ void release(); } public interface WriteLock { /** * Releases this lock. */ void release(); /** * Downgrades this lock into a read lock. When this method returns this * write lock is effectively released and the returned read lock must be * used to further release the read lock. * * @return the read lock downgraded from this write lock. */ ReadLock downgrade(); } }