135 lines
3.9 KiB
Java
135 lines
3.9 KiB
Java
/*
|
|
* Copyright (C) 2012 The Android Open Source Project
|
|
*
|
|
* Licensed 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 com.android.internal.os;
|
|
|
|
import android.compat.annotation.UnsupportedAppUsage;
|
|
import android.os.Build;
|
|
|
|
/**
|
|
* Helper class for passing more arguments though a message
|
|
* and avoiding allocation of a custom class for wrapping the
|
|
* arguments. This class maintains a pool of instances and
|
|
* it is responsibility of the client to recycle and instance
|
|
* once it is no longer used.
|
|
*/
|
|
@android.ravenwood.annotation.RavenwoodKeepWholeClass
|
|
public final class SomeArgs {
|
|
|
|
private static final int MAX_POOL_SIZE = 10;
|
|
|
|
private static SomeArgs sPool;
|
|
private static int sPoolSize;
|
|
private static Object sPoolLock = new Object();
|
|
|
|
private SomeArgs mNext;
|
|
|
|
private boolean mInPool;
|
|
|
|
static final int WAIT_NONE = 0;
|
|
static final int WAIT_WAITING = 1;
|
|
static final int WAIT_FINISHED = 2;
|
|
int mWaitState = WAIT_NONE;
|
|
|
|
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
|
|
public Object arg1;
|
|
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
|
|
public Object arg2;
|
|
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
|
|
public Object arg3;
|
|
public Object arg4;
|
|
public Object arg5;
|
|
public Object arg6;
|
|
public Object arg7;
|
|
public int argi1;
|
|
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
|
|
public int argi2;
|
|
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
|
|
public int argi3;
|
|
public int argi4;
|
|
public int argi5;
|
|
public int argi6;
|
|
public long argl1;
|
|
public long argl2;
|
|
|
|
private SomeArgs() {
|
|
/* do nothing - reduce visibility */
|
|
}
|
|
|
|
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
|
|
public static SomeArgs obtain() {
|
|
synchronized (sPoolLock) {
|
|
if (sPoolSize > 0) {
|
|
SomeArgs args = sPool;
|
|
sPool = sPool.mNext;
|
|
args.mNext = null;
|
|
args.mInPool = false;
|
|
sPoolSize--;
|
|
return args;
|
|
} else {
|
|
return new SomeArgs();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void complete() {
|
|
synchronized (this) {
|
|
if (mWaitState != WAIT_WAITING) {
|
|
throw new IllegalStateException("Not waiting");
|
|
}
|
|
mWaitState = WAIT_FINISHED;
|
|
notifyAll();
|
|
}
|
|
}
|
|
|
|
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
|
|
public void recycle() {
|
|
if (mInPool) {
|
|
throw new IllegalStateException("Already recycled.");
|
|
}
|
|
if (mWaitState != WAIT_NONE) {
|
|
return;
|
|
}
|
|
synchronized (sPoolLock) {
|
|
clear();
|
|
if (sPoolSize < MAX_POOL_SIZE) {
|
|
mNext = sPool;
|
|
mInPool = true;
|
|
sPool = this;
|
|
sPoolSize++;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void clear() {
|
|
arg1 = null;
|
|
arg2 = null;
|
|
arg3 = null;
|
|
arg4 = null;
|
|
arg5 = null;
|
|
arg6 = null;
|
|
arg7 = null;
|
|
argi1 = 0;
|
|
argi2 = 0;
|
|
argi3 = 0;
|
|
argi4 = 0;
|
|
argi5 = 0;
|
|
argi6 = 0;
|
|
argl1 = 0;
|
|
argl2 = 0;
|
|
}
|
|
}
|