diff --git a/storaged/binder/android/os/IStoraged.aidl b/storaged/binder/android/os/IStoraged.aidl index f81e90403..0bcc70c36 100644 --- a/storaged/binder/android/os/IStoraged.aidl +++ b/storaged/binder/android/os/IStoraged.aidl @@ -20,4 +20,5 @@ package android.os; interface IStoraged { void onUserStarted(int userId); void onUserStopped(int userId); + int getRecentPerf(); } \ No newline at end of file diff --git a/storaged/include/storaged.h b/storaged/include/storaged.h index 6bf6c9c1a..2e31e2662 100644 --- a/storaged/include/storaged.h +++ b/storaged/include/storaged.h @@ -116,6 +116,8 @@ public: return storage_info->get_perf_history(); } + uint32_t get_recent_perf(void) { return storage_info->get_recent_perf(); } + map get_uid_records( double hours, uint64_t threshold, bool force_report) { return mUidm.dump(hours, threshold, force_report); diff --git a/storaged/include/storaged_info.h b/storaged/include/storaged_info.h index b1efac24f..85ce07409 100644 --- a/storaged/include/storaged_info.h +++ b/storaged/include/storaged_info.h @@ -75,6 +75,7 @@ public: void update_perf_history(uint32_t bw, const time_point& tp); vector get_perf_history(); + uint32_t get_recent_perf(); }; class emmc_info_t : public storage_info_t { diff --git a/storaged/include/storaged_service.h b/storaged/include/storaged_service.h index 05c3b9469..7ec686415 100644 --- a/storaged/include/storaged_service.h +++ b/storaged/include/storaged_service.h @@ -39,6 +39,7 @@ public: binder::Status onUserStarted(int32_t userId); binder::Status onUserStopped(int32_t userId); + binder::Status getRecentPerf(int32_t* _aidl_return); }; class StoragedPrivateService : public BinderService, public BnStoragedPrivate { diff --git a/storaged/storaged_info.cpp b/storaged/storaged_info.cpp index 036d7e1f9..b39804d87 100644 --- a/storaged/storaged_info.cpp +++ b/storaged/storaged_info.cpp @@ -213,6 +213,13 @@ vector storage_info_t::get_perf_history() return ret; } +uint32_t storage_info_t::get_recent_perf() { + Mutex::Autolock _l(si_mutex); + if (recent_perf.size() == 0) return 0; + return accumulate(recent_perf.begin(), recent_perf.end(), recent_perf.size() / 2) / + recent_perf.size(); +} + void emmc_info_t::report() { if (!report_sysfs() && !report_debugfs()) diff --git a/storaged/storaged_service.cpp b/storaged/storaged_service.cpp index 3c790e687..17ea25b82 100644 --- a/storaged/storaged_service.cpp +++ b/storaged/storaged_service.cpp @@ -174,6 +174,16 @@ binder::Status StoragedService::onUserStopped(int32_t userId) { return binder::Status::ok(); } +binder::Status StoragedService::getRecentPerf(int32_t* _aidl_return) { + uint32_t recent_perf = storaged_sp->get_recent_perf(); + if (recent_perf > INT32_MAX) { + *_aidl_return = INT32_MAX; + } else { + *_aidl_return = static_cast(recent_perf); + } + return binder::Status::ok(); +} + status_t StoragedPrivateService::start() { return BinderService::publish(); }