diff --git a/libprocessgroup/cgroup_map.cpp b/libprocessgroup/cgroup_map.cpp index 20ae2be77..2fc920b54 100644 --- a/libprocessgroup/cgroup_map.cpp +++ b/libprocessgroup/cgroup_map.cpp @@ -71,7 +71,12 @@ bool CgroupController::IsUsable() { if (!HasValue()) return false; if (state_ == UNKNOWN) { - state_ = access(GetProcsFilePath("", 0, 0).c_str(), F_OK) == 0 ? USABLE : MISSING; + if (ACgroupController_getFlags != nullptr) { + uint32_t flags = ACgroupController_getFlags(controller_); + state_ = (flags & CGROUPRC_CONTROLLER_FLAG_MOUNTED) != 0 ? USABLE : MISSING; + } else { + state_ = access(GetProcsFilePath("", 0, 0).c_str(), F_OK) == 0 ? USABLE : MISSING; + } } return state_ == USABLE; @@ -161,9 +166,16 @@ void CgroupMap::Print() const { auto controller_count = ACgroupFile_getControllerCount(); for (uint32_t i = 0; i < controller_count; ++i) { const ACgroupController* controller = ACgroupFile_getController(i); - LOG(INFO) << "\t" << ACgroupController_getName(controller) << " ver " - << ACgroupController_getVersion(controller) << " path " - << ACgroupController_getPath(controller); + if (ACgroupController_getFlags != nullptr) { + LOG(INFO) << "\t" << ACgroupController_getName(controller) << " ver " + << ACgroupController_getVersion(controller) << " path " + << ACgroupController_getPath(controller) << " flags " + << ACgroupController_getFlags(controller); + } else { + LOG(INFO) << "\t" << ACgroupController_getName(controller) << " ver " + << ACgroupController_getVersion(controller) << " path " + << ACgroupController_getPath(controller); + } } } diff --git a/libprocessgroup/cgrouprc/cgroup_controller.cpp b/libprocessgroup/cgrouprc/cgroup_controller.cpp index d064d312e..5a326e55d 100644 --- a/libprocessgroup/cgrouprc/cgroup_controller.cpp +++ b/libprocessgroup/cgrouprc/cgroup_controller.cpp @@ -27,6 +27,11 @@ uint32_t ACgroupController_getVersion(const ACgroupController* controller) { return controller->version(); } +uint32_t ACgroupController_getFlags(const ACgroupController* controller) { + CHECK(controller != nullptr); + return controller->flags(); +} + const char* ACgroupController_getName(const ACgroupController* controller) { CHECK(controller != nullptr); return controller->name(); diff --git a/libprocessgroup/cgrouprc/include/android/cgrouprc.h b/libprocessgroup/cgrouprc/include/android/cgrouprc.h index 0f6a9cd5d..0ce51237a 100644 --- a/libprocessgroup/cgrouprc/include/android/cgrouprc.h +++ b/libprocessgroup/cgrouprc/include/android/cgrouprc.h @@ -66,10 +66,21 @@ __attribute__((warn_unused_result)) uint32_t ACgroupController_getVersion(const __INTRODUCED_IN(29); /** - * Flag bitmask to be used when ACgroupController_getFlags can be exported + * Flag bitmask used in ACgroupController_getFlags */ #define CGROUPRC_CONTROLLER_FLAG_MOUNTED 0x1 +#if __ANDROID_API__ >= __ANDROID_API_R__ + +/** + * Returns the flags bitmask of the given controller. + * If the given controller is null, return 0. + */ +__attribute__((warn_unused_result, weak)) uint32_t ACgroupController_getFlags( + const ACgroupController*) __INTRODUCED_IN(30); + +#endif + /** * Returns the name of the given controller. * If the given controller is null, return nullptr. diff --git a/libprocessgroup/cgrouprc/libcgrouprc.llndk.txt b/libprocessgroup/cgrouprc/libcgrouprc.llndk.txt index 91df3929d..ce5c419a3 100644 --- a/libprocessgroup/cgrouprc/libcgrouprc.llndk.txt +++ b/libprocessgroup/cgrouprc/libcgrouprc.llndk.txt @@ -9,3 +9,10 @@ LIBCGROUPRC { # introduced=29 local: *; }; + +LIBCGROUPRC_30 { # introduced=30 + global: + ACgroupController_getFlags; + local: + *; +};