KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > sleepycat > je > txn > LockUpgrade


1 /*-
2  * See the file LICENSE for redistribution information.
3  *
4  * Copyright (c) 2002,2006 Oracle. All rights reserved.
5  *
6  * $Id: LockUpgrade.java,v 1.5 2006/10/30 21:14:27 bostic Exp $
7  */

8
9 package com.sleepycat.je.txn;
10
11 /**
12  * LockUpgrade is a type safe enumeration of lock upgrade types. Methods on
13  * LockUpgrade objects are used to determine whether an upgrade is needed and,
14  * if so, how it should be handled.
15  */

16 class LockUpgrade {
17
18     static final LockUpgrade ILLEGAL = new LockUpgrade
19                    (null, false, true);
20     static final LockUpgrade EXISTING = new LockUpgrade
21                    (null, false, false);
22     static final LockUpgrade WRITE_PROMOTE = new LockUpgrade
23                    (LockType.WRITE, true, false);
24     static final LockUpgrade RANGE_READ_IMMED= new LockUpgrade
25                    (LockType.RANGE_READ, false, false);
26     static final LockUpgrade RANGE_WRITE_IMMED = new LockUpgrade
27                    (LockType.RANGE_WRITE, false, false);
28     static final LockUpgrade RANGE_WRITE_PROMOTE = new LockUpgrade
29                    (LockType.RANGE_WRITE, true, false);
30
31     private LockType upgrade;
32     private boolean promotion;
33     private boolean illegal;
34
35     /**
36      * No upgrade types can be defined outside this class.
37      */

38     private LockUpgrade(LockType upgrade, boolean promotion, boolean illegal) {
39         this.upgrade = upgrade;
40         this.promotion = promotion;
41         this.illegal = illegal;
42     }
43
44     /**
45      * This method is called to determine whether the upgrade is illegal.
46      * If true is returned, an internal error has occurred. This should never
47      * happen since RANGE_INSERT should never be requested along with other
48      * locks by the same locker; a separate locker is used for RANGE_INSERT
49      * locks.
50      */

51     boolean getIllegal() {
52         return illegal;
53     }
54
55     /**
56      * This method is called first to determine whether an upgrade to a new
57      * lock type is needed, and what the new lock type should be. If null is
58      * returned, the existing lock should be unchanged and no upgrade is
59      * needed. If non-null is returned, an upgrade to the returned type should
60      * be performed; in this case, call getPromotion to determine how to do the
61      * upgrade.
62      */

63     LockType getUpgrade() {
64         return upgrade;
65     }
66
67     /**
68      * This method is called when getUpgrade returns non-null to determine
69      * whether the upgrade is a true promotion or can be granted immediately.
70      * A true promotion is a change from read to write locking, and may require
71      * waiting if the write lock conflicts with a lock held by another locker.
72      * An upgrade that is not a promotion is just a type change, and never
73      * causes a lock conflict.
74      */

75     boolean getPromotion() {
76         return promotion;
77     }
78 }
79
Popular Tags