198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/*
298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Copyright (C) 2012 The Android Open Source Project
398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * you may not use this file except in compliance with the License.
698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * You may obtain a copy of the License at
798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
1098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Unless required by applicable law or agreed to in writing, software
1198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * See the License for the specific language governing permissions and
1498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * limitations under the License.
1598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */
1698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
1798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspackage android.support.v8.renderscript;
1898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
1998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.util.Log;
2098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
2198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/**
2298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * BaseObj is the base class for interfacing with native renderscript objects.
2398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * It primarly contains code for tracking the native object ID and forcably
2498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * disconecting the object from the native allocation for early cleanup.
2598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
2698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams **/
2798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspublic class BaseObj {
2898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    BaseObj(int id, RenderScript rs) {
2998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rs.validate();
3098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS = rs;
3198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mID = id;
3298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mDestroyed = false;
3398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
3498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
3598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    void setID(int id) {
3698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (mID != 0) {
3798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSRuntimeException("Internal Error, reset of object ID.");
3898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
3998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mID = id;
4098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
4198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
4298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
4398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Lookup the native object ID for this object.  Primarily used by the
4498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * generated reflected code.
4598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
4698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param rs Context to verify against internal context for
4798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *           match.
4898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
4998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return int
5098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
5198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int getID(RenderScript rs) {
5298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.validate();
5398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (mDestroyed) {
5498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSInvalidStateException("using a destroyed object.");
5598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
5698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (mID == 0) {
5798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSRuntimeException("Internal error: Object id 0.");
5898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
5998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if ((rs != null) && (rs != mRS)) {
6098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSInvalidStateException("using object with mismatched context.");
6198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
6298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mID;
6398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
6498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
6598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    void checkValid() {
6698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (mID == 0) {
6798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException("Invalid object.");
6898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
6998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
7098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
7198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    private int mID;
7298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    private boolean mDestroyed;
7398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    RenderScript mRS;
7498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
7598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    protected void finalize() throws Throwable {
7698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (!mDestroyed) {
7798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            if(mID != 0 && mRS.isAlive()) {
7898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                mRS.nObjDestroy(mID);
7998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
8098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mRS = null;
8198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mID = 0;
8298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mDestroyed = true;
8398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            //Log.v(RenderScript.LOG_TAG, getClass() +
8498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            // " auto finalizing object without having released the RS reference.");
8598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
8698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        super.finalize();
8798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
8898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
8998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
9098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * destroy disconnects the object from the native object effectively
9198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * rendering this java object dead.  The primary use is to force immediate
9298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * cleanup of resources when it is believed the GC will not respond quickly
9398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * enough.
9498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
9598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized public void destroy() {
9698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(mDestroyed) {
9798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSInvalidStateException("Object already destroyed.");
9898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
9998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mDestroyed = true;
10098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mRS.nObjDestroy(mID);
10198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
10298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
10398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
10498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Calculates the hash code value for a BaseObj.
10598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
10698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return int
10798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
10898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    @Override
10998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public int hashCode() {
11098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mID;
11198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
11298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
11398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
11498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Compare the current BaseObj with another BaseObj for equality.
11598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
11698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param obj The object to check equality with.
11798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
11898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return boolean
11998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
12098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    @Override
12198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public boolean equals(Object obj) {
12298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        // Early-out check to see if both BaseObjs are actually the same
12398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (this == obj)
12498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return true;
12598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
12698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (getClass() != obj.getClass()) {
12798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return false;
12898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
12998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
13098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        BaseObj b = (BaseObj) obj;
13198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mID == b.mID;
13298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
13398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams}
13498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
135