Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4882eaba authored by Jin Qian's avatar Jin Qian
Browse files

storaged: use sp<> to keep refcount for storaged_t object

BatteryListener takes sp<> as parameter. Passing raw storaged_t ptr
to BatteryListener will cause the ptr to be freed when BatteryListener
releases the sp<>. Keep a refcount in storaged to prevent this from
happening.

Test: kill healthd while storaged is running
Bug: 36652060
Change-Id: I96bc45a3bedb39eb7158b8f6c86334b5b31c9346
parent 71de1368
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -42,11 +42,11 @@
#include <storaged_service.h>
#include <storaged_utils.h>

storaged_t storaged;
sp<storaged_t> storaged;

// Function of storaged's main thread
void* storaged_main(void* s) {
    storaged_t* storaged = (storaged_t*)s;
void* storaged_main(void* /* unused */) {
    storaged = new storaged_t();

    storaged->init_battery_service();

@@ -116,7 +116,7 @@ int main(int argc, char** argv) {
        report_storage_health();
        // Start the main thread of storaged
        pthread_t storaged_main_thread;
        errno = pthread_create(&storaged_main_thread, NULL, storaged_main, &storaged);
        errno = pthread_create(&storaged_main_thread, NULL, storaged_main, NULL);
        if (errno != 0) {
            PLOG_TO(SYSTEM, ERROR) << "Failed to create main thread";
            return -1;
+4 −4
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@

using namespace android::base;

extern storaged_t storaged;
extern sp<storaged_t> storaged;

std::vector<struct uid_info> BpStoraged::dump_uids(const char* /*option*/) {
    Parcel data, reply;
@@ -74,7 +74,7 @@ status_t BnStoraged::onTransact(uint32_t code, const Parcel& data, Parcel* reply

std::vector<struct uid_info> Storaged::dump_uids(const char* /* option */) {
    std::vector<struct uid_info> uids_v;
    std::unordered_map<uint32_t, struct uid_info> uids_m = storaged.get_uids();
    std::unordered_map<uint32_t, struct uid_info> uids_m = storaged->get_uids();

    for (const auto& it : uids_m) {
        uids_v.push_back(it.second);
@@ -127,7 +127,7 @@ status_t Storaged::dump(int fd, const Vector<String16>& args) {

    uint64_t last_ts = 0;
    const std::map<uint64_t, struct uid_records>& records =
                storaged.get_uid_records(hours, threshold, force_report);
                storaged->get_uid_records(hours, threshold, force_report);
    for (const auto& it : records) {
        if (last_ts != it.second.start_ts) {
            dprintf(fd, "%llu", (unsigned long long)it.second.start_ts);
@@ -150,7 +150,7 @@ status_t Storaged::dump(int fd, const Vector<String16>& args) {
    }

    if (time_window) {
        storaged.update_uid_io_interval(time_window);
        storaged->update_uid_io_interval(time_window);
    }

    return NO_ERROR;