19fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck/*
29fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck * Copyright (C) 2014 The Android Open Source Project
39fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck *
49fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck * Licensed under the Apache License, Version 2.0 (the "License");
59fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck * you may not use this file except in compliance with the License.
69fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck * You may obtain a copy of the License at
79fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck *
89fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck *      http://www.apache.org/licenses/LICENSE-2.0
99fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck *
109fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck * Unless required by applicable law or agreed to in writing, software
119fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck * distributed under the License is distributed on an "AS IS" BASIS,
129fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck * See the License for the specific language governing permissions and
149fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck * limitations under the License.
159fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck */
169fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck
179fa4071c4768c63902c6a74a4b480b51a8b95d43John Reckpackage com.android.internal.util;
189fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck
199fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck/**
209fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck * Helper class that contains a strong reference to a VirtualRefBase native
219fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck * object. This will incStrong in the ctor, and decStrong in the finalizer
229fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck */
239fa4071c4768c63902c6a74a4b480b51a8b95d43John Reckpublic final class VirtualRefBasePtr {
249fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck    private long mNativePtr;
259fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck
269fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck    public VirtualRefBasePtr(long ptr) {
279fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck        mNativePtr = ptr;
289fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck        nIncStrong(mNativePtr);
299fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck    }
309fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck
319fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck    public long get() {
329fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck        return mNativePtr;
339fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck    }
349fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck
35d72e0a339b54af0c4e731513bbad120dff694723John Reck    public void release() {
36d72e0a339b54af0c4e731513bbad120dff694723John Reck        if (mNativePtr != 0) {
37d72e0a339b54af0c4e731513bbad120dff694723John Reck            nDecStrong(mNativePtr);
38d72e0a339b54af0c4e731513bbad120dff694723John Reck            mNativePtr = 0;
39d72e0a339b54af0c4e731513bbad120dff694723John Reck        }
40d72e0a339b54af0c4e731513bbad120dff694723John Reck    }
41d72e0a339b54af0c4e731513bbad120dff694723John Reck
429fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck    @Override
439fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck    protected void finalize() throws Throwable {
449fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck        try {
45d72e0a339b54af0c4e731513bbad120dff694723John Reck            release();
469fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck        } finally {
479fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck            super.finalize();
489fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck        }
499fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck    }
509fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck
519fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck    private static native void nIncStrong(long ptr);
529fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck    private static native void nDecStrong(long ptr);
539fa4071c4768c63902c6a74a4b480b51a8b95d43John Reck}
54