diff --git a/libprocessgroup/Android.bp b/libprocessgroup/Android.bp index 33e00bc5d..a60bfe973 100644 --- a/libprocessgroup/Android.bp +++ b/libprocessgroup/Android.bp @@ -79,12 +79,12 @@ cc_library { ], static_libs: [ "libjsoncpp", + "libprocessgroup_util", ], // for cutils/android_filesystem_config.h header_libs: [ "libcutils_headers", "libprocessgroup_headers", - "libprocessgroup_util", ], export_include_dirs: ["include"], export_header_lib_headers: [ diff --git a/libprocessgroup/setup/Android.bp b/libprocessgroup/setup/Android.bp index 76f0a11f1..1a4ad0118 100644 --- a/libprocessgroup/setup/Android.bp +++ b/libprocessgroup/setup/Android.bp @@ -34,10 +34,10 @@ cc_library_shared { ], static_libs: [ "libcgrouprc_format", + "libprocessgroup_util", ], header_libs: [ "libprocessgroup_headers", - "libprocessgroup_util", ], export_header_lib_headers: [ "libprocessgroup_headers", diff --git a/libprocessgroup/util/Android.bp b/libprocessgroup/util/Android.bp index 4a940b774..54ba69b4e 100644 --- a/libprocessgroup/util/Android.bp +++ b/libprocessgroup/util/Android.bp @@ -19,7 +19,7 @@ package { default_applicable_licenses: ["Android-Apache-2.0"], } -cc_library_headers { +cc_library_static { name: "libprocessgroup_util", vendor_available: true, product_available: true, @@ -36,12 +36,15 @@ cc_library_headers { export_include_dirs: [ "include", ], + srcs: [ + "util.cpp", + ], defaults: ["libprocessgroup_build_flags_cc"], } cc_test { name: "libprocessgroup_util_test", - header_libs: ["libprocessgroup_util"], + static_libs: ["libprocessgroup_util"], srcs: ["tests/util.cpp"], test_suites: ["general-tests"], } diff --git a/libprocessgroup/util/include/processgroup/util.h b/libprocessgroup/util/include/processgroup/util.h index 5240744c6..8d013af55 100644 --- a/libprocessgroup/util/include/processgroup/util.h +++ b/libprocessgroup/util/include/processgroup/util.h @@ -16,46 +16,10 @@ #pragma once -#include -#include #include namespace util { -namespace internal { - -const char SEP = '/'; - -std::string DeduplicateAndTrimSeparators(const std::string& path) { - bool lastWasSep = false; - std::string ret; - - std::copy_if(path.begin(), path.end(), std::back_inserter(ret), [&lastWasSep](char c) { - if (lastWasSep) { - if (c == SEP) return false; - lastWasSep = false; - } else if (c == SEP) { - lastWasSep = true; - } - return true; - }); - - if (ret.length() > 1 && ret.back() == SEP) ret.pop_back(); - - return ret; -} - -} // namespace internal - -unsigned int GetCgroupDepth(const std::string& controller_root, const std::string& cgroup_path) { - const std::string deduped_root = internal::DeduplicateAndTrimSeparators(controller_root); - const std::string deduped_path = internal::DeduplicateAndTrimSeparators(cgroup_path); - - if (deduped_root.empty() || deduped_path.empty() || !deduped_path.starts_with(deduped_root)) - return 0; - - return std::count(deduped_path.begin() + deduped_root.size(), deduped_path.end(), - internal::SEP); -} +unsigned int GetCgroupDepth(const std::string& controller_root, const std::string& cgroup_path); } // namespace util diff --git a/libprocessgroup/util/util.cpp b/libprocessgroup/util/util.cpp new file mode 100644 index 000000000..9b88a223a --- /dev/null +++ b/libprocessgroup/util/util.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2024 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. + */ + +#include + +#include +#include + +namespace { + +const char SEP = '/'; + +std::string DeduplicateAndTrimSeparators(const std::string& path) { + bool lastWasSep = false; + std::string ret; + + std::copy_if(path.begin(), path.end(), std::back_inserter(ret), [&lastWasSep](char c) { + if (lastWasSep) { + if (c == SEP) return false; + lastWasSep = false; + } else if (c == SEP) { + lastWasSep = true; + } + return true; + }); + + if (ret.length() > 1 && ret.back() == SEP) ret.pop_back(); + + return ret; +} + +} // anonymous namespace + +namespace util { + +unsigned int GetCgroupDepth(const std::string& controller_root, const std::string& cgroup_path) { + const std::string deduped_root = DeduplicateAndTrimSeparators(controller_root); + const std::string deduped_path = DeduplicateAndTrimSeparators(cgroup_path); + + if (deduped_root.empty() || deduped_path.empty() || !deduped_path.starts_with(deduped_root)) + return 0; + + return std::count(deduped_path.begin() + deduped_root.size(), deduped_path.end(), SEP); +} + +} // namespace util