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

Commit c8a576c6 authored by Mark Salyzyn's avatar Mark Salyzyn
Browse files

logd: Statistics improvements

- Drop in-place sorting.
- Add fast-track for uid sizes and elements.
- Add sort() for per-uid and per-pid statistics.

Change-Id: Ib8655d4cc0b3bd4e87534522987bcc7fc7a5251a
parent 72031ab8
Loading
Loading
Loading
Loading
+8 −11
Original line number Original line Diff line number Diff line
@@ -167,17 +167,14 @@ void LogBuffer::prune(log_id_t id, unsigned long pruneRows) {


        if ((id != LOG_ID_CRASH) && mPrune.worstUidEnabled()) {
        if ((id != LOG_ID_CRASH) && mPrune.worstUidEnabled()) {
            LidStatistics &l = stats.id(id);
            LidStatistics &l = stats.id(id);
            UidStatisticsCollection::iterator iu;
            l.sort();
            for (iu = l.begin(); iu != l.end(); ++iu) {
            UidStatisticsCollection::iterator iu = l.begin();
                UidStatistics *u = (*iu);
            if (iu != l.end()) {
                size_t sizes = u->sizes();
                UidStatistics *u = *iu;
                if (worst_sizes < sizes) {
                    second_worst_sizes = worst_sizes;
                    worst_sizes = sizes;
                worst = u->getUid();
                worst = u->getUid();
                }
                worst_sizes = u->sizes();
                if ((second_worst_sizes < sizes) && (sizes < worst_sizes)) {
                if (++iu != l.end()) {
                    second_worst_sizes = sizes;
                    second_worst_sizes = (*iu)->sizes();
                }
                }
            }
            }
        }
        }
+87 −25
Original line number Original line Diff line number Diff line
@@ -96,7 +96,9 @@ char *PidStatistics::pidToName(pid_t pid) {
}
}


UidStatistics::UidStatistics(uid_t uid)
UidStatistics::UidStatistics(uid_t uid)
        : uid(uid) {
        : uid(uid)
        , mSizes(0)
        , mElements(0) {
    Pids.clear();
    Pids.clear();
}
}


@@ -109,6 +111,9 @@ UidStatistics::~UidStatistics() {
}
}


void UidStatistics::add(unsigned short size, pid_t pid) {
void UidStatistics::add(unsigned short size, pid_t pid) {
    mSizes += size;
    ++mElements;

    PidStatistics *p;
    PidStatistics *p;
    PidStatisticsCollection::iterator last;
    PidStatisticsCollection::iterator last;
    PidStatisticsCollection::iterator it;
    PidStatisticsCollection::iterator it;
@@ -116,18 +121,11 @@ void UidStatistics::add(unsigned short size, pid_t pid) {
        p = *it;
        p = *it;
        if (pid == p->getPid()) {
        if (pid == p->getPid()) {
            p->add(size);
            p->add(size);
            // poor-man sort, bubble upwards if bigger than last
            if ((last != it) && ((*last)->sizesTotal() < p->sizesTotal())) {
                Pids.erase(it);
                Pids.insert(last, p);
            }
            return;
            return;
        }
        }
    }
    }
    // poor-man sort, insert if bigger than last or last is the gone entry.
    // insert if the gone entry.
    bool insert = (last != it)
    bool insert = (last != it) && (p->getPid() == p->gone);
        && ((p->getPid() == p->gone)
            || ((*last)->sizesTotal() < (size_t) size));
    p = new PidStatistics(pid, pidToName(pid));
    p = new PidStatistics(pid, pidToName(pid));
    if (insert) {
    if (insert) {
        Pids.insert(last, p);
        Pids.insert(last, p);
@@ -138,6 +136,9 @@ void UidStatistics::add(unsigned short size, pid_t pid) {
}
}


void UidStatistics::subtract(unsigned short size, pid_t pid) {
void UidStatistics::subtract(unsigned short size, pid_t pid) {
    mSizes -= size;
    --mElements;

    PidStatisticsCollection::iterator it;
    PidStatisticsCollection::iterator it;
    for (it = begin(); it != end(); ++it) {
    for (it = begin(); it != end(); ++it) {
        PidStatistics *p = *it;
        PidStatistics *p = *it;
@@ -166,28 +167,57 @@ void UidStatistics::subtract(unsigned short size, pid_t pid) {
    }
    }
}
}


void UidStatistics::sort() {
    for (bool pass = true; pass;) {
        pass = false;
        PidStatisticsCollection::iterator it = begin();
        if (it != end()) {
            PidStatisticsCollection::iterator lt = it;
            PidStatistics *l = (*lt);
            while (++it != end()) {
                PidStatistics *n = (*it);
                if ((n->getPid() != n->gone) && (n->sizes() > l->sizes())) {
                    pass = true;
                    Pids.erase(it);
                    Pids.insert(lt, n);
                    it = lt;
                    n = l;
                }
                lt = it;
                l = n;
            }
        }
    }
}

size_t UidStatistics::sizes(pid_t pid) {
size_t UidStatistics::sizes(pid_t pid) {
    size_t sizes = 0;
    if (pid == pid_all) {
        return sizes();
    }

    PidStatisticsCollection::iterator it;
    PidStatisticsCollection::iterator it;
    for (it = begin(); it != end(); ++it) {
    for (it = begin(); it != end(); ++it) {
        PidStatistics *p = *it;
        PidStatistics *p = *it;
        if ((pid == pid_all) || (pid == p->getPid())) {
        if (pid == p->getPid()) {
            sizes += p->sizes();
            return p->sizes();
        }
        }
    }
    }
    return sizes;
    return 0;
}
}


size_t UidStatistics::elements(pid_t pid) {
size_t UidStatistics::elements(pid_t pid) {
    size_t elements = 0;
    if (pid == pid_all) {
        return elements();
    }

    PidStatisticsCollection::iterator it;
    PidStatisticsCollection::iterator it;
    for (it = begin(); it != end(); ++it) {
    for (it = begin(); it != end(); ++it) {
        PidStatistics *p = *it;
        PidStatistics *p = *it;
        if ((pid == pid_all) || (pid == p->getPid())) {
        if (pid == p->getPid()) {
            elements += p->elements();
            return p->elements();
        }
        }
    }
    }
    return elements;
    return 0;
}
}


size_t UidStatistics::sizesTotal(pid_t pid) {
size_t UidStatistics::sizesTotal(pid_t pid) {
@@ -266,6 +296,29 @@ void LidStatistics::subtract(unsigned short size, uid_t uid, pid_t pid) {
    }
    }
}
}


void LidStatistics::sort() {
    for (bool pass = true; pass;) {
        pass = false;
        UidStatisticsCollection::iterator it = begin();
        if (it != end()) {
            UidStatisticsCollection::iterator lt = it;
            UidStatistics *l = (*lt);
            while (++it != end()) {
                UidStatistics *n = (*it);
                if (n->sizes() > l->sizes()) {
                    pass = true;
                    Uids.erase(it);
                    Uids.insert(lt, n);
                    it = lt;
                    n = l;
                }
                lt = it;
                l = n;
            }
        }
    }
}

size_t LidStatistics::sizes(uid_t uid, pid_t pid) {
size_t LidStatistics::sizes(uid_t uid, pid_t pid) {
    size_t sizes = 0;
    size_t sizes = 0;
    UidStatisticsCollection::iterator it;
    UidStatisticsCollection::iterator it;
@@ -455,13 +508,22 @@ void LogStatistics::format(char **buf,
    short spaces = 2;
    short spaces = 2;


    log_id_for_each(i) {
    log_id_for_each(i) {
        if (logMask & (1 << i)) {
        if (!logMask & (1 << i)) {
            continue;
        }
        oldLength = string.length();
        oldLength = string.length();
        if (spaces < 0) {
        if (spaces < 0) {
            spaces = 0;
            spaces = 0;
        }
        }
        string.appendFormat("%*s%s", spaces, "", android_log_id_to_name(i));
        string.appendFormat("%*s%s", spaces, "", android_log_id_to_name(i));
        spaces += spaces_total + oldLength - string.length();
        spaces += spaces_total + oldLength - string.length();

        LidStatistics &l = id(i);
        l.sort();

        UidStatisticsCollection::iterator iu;
        for (iu = l.begin(); iu != l.end(); ++iu) {
            (*iu)->sort();
        }
        }
    }
    }


+13 −2
Original line number Original line Diff line number Diff line
@@ -70,6 +70,9 @@ class UidStatistics {


    PidStatisticsCollection Pids;
    PidStatisticsCollection Pids;


    size_t mSizes;
    size_t mElements;

public:
public:
    UidStatistics(uid_t uid);
    UidStatistics(uid_t uid);
    ~UidStatistics();
    ~UidStatistics();
@@ -81,11 +84,17 @@ public:


    void add(unsigned short size, pid_t pid);
    void add(unsigned short size, pid_t pid);
    void subtract(unsigned short size, pid_t pid);
    void subtract(unsigned short size, pid_t pid);
    void sort();


    static const pid_t pid_all = (pid_t) -1;
    static const pid_t pid_all = (pid_t) -1;


    size_t sizes(pid_t pid = pid_all);
    // fast track current value
    size_t elements(pid_t pid = pid_all);
    size_t sizes() const { return mSizes; };
    size_t elements() const { return mElements; };

    // statistical track
    size_t sizes(pid_t pid);
    size_t elements(pid_t pid);


    size_t sizesTotal(pid_t pid = pid_all);
    size_t sizesTotal(pid_t pid = pid_all);
    size_t elementsTotal(pid_t pid = pid_all);
    size_t elementsTotal(pid_t pid = pid_all);
@@ -108,6 +117,7 @@ public:


    void add(unsigned short size, uid_t uid, pid_t pid);
    void add(unsigned short size, uid_t uid, pid_t pid);
    void subtract(unsigned short size, uid_t uid, pid_t pid);
    void subtract(unsigned short size, uid_t uid, pid_t pid);
    void sort();


    static const pid_t pid_all = (pid_t) -1;
    static const pid_t pid_all = (pid_t) -1;
    static const uid_t uid_all = (uid_t) -1;
    static const uid_t uid_all = (uid_t) -1;
@@ -145,6 +155,7 @@ public:


    void add(unsigned short size, log_id_t log_id, uid_t uid, pid_t pid);
    void add(unsigned short size, log_id_t log_id, uid_t uid, pid_t pid);
    void subtract(unsigned short size, log_id_t log_id, uid_t uid, pid_t pid);
    void subtract(unsigned short size, log_id_t log_id, uid_t uid, pid_t pid);
    void sort();


    // fast track current value by id only
    // fast track current value by id only
    size_t sizes(log_id_t id) const { return mSizes[id]; }
    size_t sizes(log_id_t id) const { return mSizes[id]; }