001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017:
018: package org.apache.harmony.misc.accessors;
019:
020: /**
021: * Wraps the locked primitive type array. Holds a reference to Array object
022: * and its memory location. Objects of this type require a manual disposal
023: * through the {@link #release()}method. Please note that the array address
024: * is no longer valid after the {@link #release()}call is made.
025: * <p>
026: * Locked arrays can only be obtained with help of {@link ArrayAccessor} class.
027: * @see ArrayAccessor
028: */
029: public class LockedArray {
030:
031: private static final int NO_LOCK = 0;
032:
033: private static final int SHORT_LOCK = 1;
034:
035: private static final int LONG_LOCK = 2;
036:
037: LockedArray(Object array, long addr, boolean isLong) {
038: this .array = array;
039: this .addr = addr;
040: this .lockType = isLong ? LONG_LOCK : SHORT_LOCK;
041: }
042:
043: private Object array;
044:
045: private long addr;
046:
047: private int lockType;
048:
049: /**
050: * Returns the memory address for this locked array.
051: */
052: public long getAddress() {
053: return addr;
054: }
055:
056: /**
057: * Returns the primitive type array object associated with this locked
058: * array.
059: *
060: * @return primitive type array object
061: */
062: public Object getArray() {
063: return array;
064: }
065:
066: /**
067: * Returns true if the array was locked for a long period of time.
068: */
069: public boolean isLongLock() {
070: return lockType > SHORT_LOCK;
071: }
072:
073: /**
074: * Returns true if the array is currently locked, false otherwise.
075: */
076: public boolean isLocked() {
077: return lockType > NO_LOCK;
078: }
079:
080: /**
081: * Unlocks the array. This method gives a hint to virtual
082: * machine that this array no longer needs to be locked in memory. The
083: * array address becomes invalid after this call and should no longer be
084: * used. This method does nothing if the array was already released
085: * once.
086: * <p>
087: * Default implementation of this method delegates to Release
088: * <>ArrayElements or ReleasePrimitiveArrayCritical JNI calls in case of
089: * long and short locks respectively.
090: */
091: public void release() {
092: if (lockType > NO_LOCK) {
093: ArrayAccessor.releaseArray(array, addr,
094: lockType == LONG_LOCK);
095: }
096: lockType = NO_LOCK;
097: }
098:
099: /**
100: * Unlocks the array. This method gives a hint to virtual
101: * machine that this array no longer needs to be locked in memory and virtual
102: * machine should not copy values back to Java array.
103: * The array address becomes invalid after this call and should no longer be
104: * used. This method does nothing if the array was already released
105: * once.
106: * <p>
107: * Default implementation of this method delegates to Release
108: * <>ArrayElements or ReleasePrimitiveArrayCritical JNI calls in case of
109: * long and short locks respectively with JNI_ABORT mode.
110: */
111: public void releaseNoCopy() {
112: if (lockType > NO_LOCK) {
113: ArrayAccessor.releaseArrayNoCopy(array, addr,
114: lockType == LONG_LOCK);
115: }
116: lockType = NO_LOCK;
117: }
118:
119: }
|