summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Martin Stjernholm <mast@google.com> 2024-11-28 15:22:05 +0000
committer Martin Stjernholm <mast@google.com> 2024-11-28 20:11:17 +0000
commita24e2c255173070c5e354f501bc28e4c7e8d77da (patch)
tree88c9d931a25ecc8a0cc924d18b393c44fecdc983
parentcca3341e67fd9f45362448428abd47da09cdb954 (diff)
Make NativeLoaderNamespace instances immutable.
To make it easier to reason about thread safety. Test: atest libnativeloader_e2e_tests libnativeloader_test \ art_libnativeloader_cts_test libnativeloader_lazy_test Bug: 326505705 Bug: 326610154 Change-Id: I2447ed8120625823d3298d392d22828af2c22402
-rw-r--r--libnativeloader/library_namespaces.cpp8
-rw-r--r--libnativeloader/native_loader_namespace.cpp12
-rw-r--r--libnativeloader/native_loader_namespace.h5
3 files changed, 14 insertions, 11 deletions
diff --git a/libnativeloader/library_namespaces.cpp b/libnativeloader/library_namespaces.cpp
index 7aa14080ce..b27b268d16 100644
--- a/libnativeloader/library_namespaces.cpp
+++ b/libnativeloader/library_namespaces.cpp
@@ -432,10 +432,10 @@ Result<NativeLoaderNamespace*> LibraryNamespaces::Create(JNIEnv* env,
const std::string product_libs =
filter_public_libraries(target_sdk_version, uses_libraries, product_public_libraries());
if (!product_libs.empty()) {
- Result<NativeLoaderNamespace> target_ns = system_ns;
- if (is_product_treblelized()) {
- target_ns = NativeLoaderNamespace::GetExportedNamespace(kProductNamespaceName, is_bridged);
- }
+ Result<NativeLoaderNamespace> target_ns =
+ is_product_treblelized()
+ ? NativeLoaderNamespace::GetExportedNamespace(kProductNamespaceName, is_bridged)
+ : system_ns;
if (target_ns.ok()) {
linked = app_ns->Link(&target_ns.value(), product_libs);
if (!linked.ok()) {
diff --git a/libnativeloader/native_loader_namespace.cpp b/libnativeloader/native_loader_namespace.cpp
index cfb84b7d9e..98236064d0 100644
--- a/libnativeloader/native_loader_namespace.cpp
+++ b/libnativeloader/native_loader_namespace.cpp
@@ -69,10 +69,14 @@ Result<NativeLoaderNamespace> NativeLoaderNamespace::GetExportedNamespace(const
// "system" for those in the Runtime APEX. Try "system" first since
// "default" always exists.
Result<NativeLoaderNamespace> NativeLoaderNamespace::GetSystemNamespace(bool is_bridged) {
- Result<NativeLoaderNamespace> ns = GetExportedNamespace(kSystemNamespaceName, is_bridged);
- if (ns.ok()) return ns;
- ns = GetExportedNamespace(kDefaultNamespaceName, is_bridged);
- if (ns.ok()) return ns;
+ if (Result<NativeLoaderNamespace> ns = GetExportedNamespace(kSystemNamespaceName, is_bridged);
+ ns.ok()) {
+ return ns;
+ }
+ if (Result<NativeLoaderNamespace> ns = GetExportedNamespace(kDefaultNamespaceName, is_bridged);
+ ns.ok()) {
+ return ns;
+ }
// If nothing is found, return NativeLoaderNamespace constructed from nullptr.
// nullptr also means default namespace to the linker.
diff --git a/libnativeloader/native_loader_namespace.h b/libnativeloader/native_loader_namespace.h
index 9a5aeac203..4d9ce36434 100644
--- a/libnativeloader/native_loader_namespace.h
+++ b/libnativeloader/native_loader_namespace.h
@@ -47,7 +47,6 @@ struct NativeLoaderNamespace {
NativeLoaderNamespace(NativeLoaderNamespace&&) = default;
NativeLoaderNamespace(const NativeLoaderNamespace&) = default;
- NativeLoaderNamespace& operator=(const NativeLoaderNamespace&) = default;
android_namespace_t* ToRawAndroidNamespace() const { return std::get<0>(raw_); }
native_bridge_namespace_t* ToRawNativeBridgeNamespace() const { return std::get<1>(raw_); }
@@ -72,8 +71,8 @@ struct NativeLoaderNamespace {
explicit NativeLoaderNamespace(const std::string& name, native_bridge_namespace_t* ns)
: name_(name), raw_(ns) {}
- std::string name_;
- std::variant<android_namespace_t*, native_bridge_namespace_t*> raw_;
+ const std::string name_;
+ const std::variant<android_namespace_t*, native_bridge_namespace_t*> raw_;
};
} // namespace android