blob: fd5e8799c2ab53826df395cb2854215498c3a639 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.base.process_launcher;
import android.content.Intent;
import android.util.SparseArray;
import org.chromium.base.library_loader.LibraryProcessType;
import javax.annotation.concurrent.GuardedBy;
/**
* Allows specifying the package name for looking up child services
* configuration and classes into (if it differs from the application package
* name, like in the case of Android WebView). Also allows specifying additional
* child service binging flags.
*/
public class ChildProcessCreationParams {
private static final String EXTRA_LIBRARY_PROCESS_TYPE =
"org.chromium.content.common.child_service_params.library_process_type";
/** ID used for the default params. */
public static final int DEFAULT_ID = 0;
private static final Object sLock = new Object();
@GuardedBy("sLock")
private static final SparseArray<ChildProcessCreationParams> sParamMap = new SparseArray<>();
@GuardedBy("sLock")
private static int sNextId = 1; // 0 is reserved for DEFAULT_ID.
/** Registers default params. This should be called once on start up. */
public static void registerDefault(ChildProcessCreationParams params) {
synchronized (sLock) {
// TODO(boliu): Assert not overwriting existing entry once WebApk is fixed.
sParamMap.append(DEFAULT_ID, params);
}
}
public static ChildProcessCreationParams getDefault() {
return get(DEFAULT_ID);
}
/** Registers new params. Returns the allocated ID corresponding this params. */
public static int register(ChildProcessCreationParams params) {
assert params != null;
int id = -1;
synchronized (sLock) {
id = sNextId++;
sParamMap.append(id, params);
}
assert id > 0;
return id;
}
/** Releases param corresponding to this ID. Any future use of this ID will crash. */
public static void unregister(int id) {
assert id > DEFAULT_ID; // Not allowed to unregister default.
synchronized (sLock) {
sParamMap.delete(id);
}
}
public static ChildProcessCreationParams get(int id) {
assert id >= 0;
synchronized (sLock) {
return sParamMap.get(id);
}
}
// Members should all be immutable to avoid worrying about thread safety.
private final String mPackageName;
private final boolean mIsExternalService;
private final int mLibraryProcessType;
public ChildProcessCreationParams(
String packageName, boolean isExternalService, int libraryProcessType) {
mPackageName = packageName;
mIsExternalService = isExternalService;
mLibraryProcessType = libraryProcessType;
}
public String getPackageName() {
return mPackageName;
}
public boolean getIsExternalService() {
return mIsExternalService;
}
public int getLibraryProcessType() {
return mLibraryProcessType;
}
public void addIntentExtras(Intent intent) {
intent.putExtra(EXTRA_LIBRARY_PROCESS_TYPE, mLibraryProcessType);
}
public static int getLibraryProcessType(Intent intent) {
return intent.getIntExtra(EXTRA_LIBRARY_PROCESS_TYPE, LibraryProcessType.PROCESS_CHILD);
}
}