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

Commit 1ab0cf4d authored by Mark Salyzyn's avatar Mark Salyzyn Committed by Gerrit Code Review
Browse files

Merge "logd: Statistics improvements"

parents 72db489c c8a576c6
Loading
Loading
Loading
Loading
+8 −11
Original line number 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()) {
            LidStatistics &l = stats.id(id);
            UidStatisticsCollection::iterator iu;
            for (iu = l.begin(); iu != l.end(); ++iu) {
                UidStatistics *u = (*iu);
                size_t sizes = u->sizes();
                if (worst_sizes < sizes) {
                    second_worst_sizes = worst_sizes;
                    worst_sizes = sizes;
            l.sort();
            UidStatisticsCollection::iterator iu = l.begin();
            if (iu != l.end()) {
                UidStatistics *u = *iu;
                worst = u->getUid();
                }
                if ((second_worst_sizes < sizes) && (sizes < worst_sizes)) {
                    second_worst_sizes = sizes;
                worst_sizes = u->sizes();
                if (++iu != l.end()) {
                    second_worst_sizes = (*iu)->sizes();
                }
            }
        }
+87 −25
Original line number Diff line number Diff line
@@ -96,7 +96,9 @@ char *PidStatistics::pidToName(pid_t pid) {
}

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

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

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

    PidStatistics *p;
    PidStatisticsCollection::iterator last;
    PidStatisticsCollection::iterator it;
@@ -116,18 +121,11 @@ void UidStatistics::add(unsigned short size, pid_t pid) {
        p = *it;
        if (pid == p->getPid()) {
            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;
        }
    }
    // poor-man sort, insert if bigger than last or last is the gone entry.
    bool insert = (last != it)
        && ((p->getPid() == p->gone)
            || ((*last)->sizesTotal() < (size_t) size));
    // insert if the gone entry.
    bool insert = (last != it) && (p->getPid() == p->gone);
    p = new PidStatistics(pid, pidToName(pid));
    if (insert) {
        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) {
    mSizes -= size;
    --mElements;

    PidStatisticsCollection::iterator it;
    for (it = begin(); it != end(); ++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 sizes = 0;
    if (pid == pid_all) {
        return sizes();
    }

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

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

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

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 sizes = 0;
    UidStatisticsCollection::iterator it;
@@ -455,13 +508,22 @@ void LogStatistics::format(char **buf,
    short spaces = 2;

    log_id_for_each(i) {
        if (logMask & (1 << i)) {
        if (!logMask & (1 << i)) {
            continue;
        }
        oldLength = string.length();
        if (spaces < 0) {
            spaces = 0;
        }
        string.appendFormat("%*s%s", spaces, "", android_log_id_to_name(i));
        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 Diff line number Diff line
@@ -70,6 +70,9 @@ class UidStatistics {

    PidStatisticsCollection Pids;

    size_t mSizes;
    size_t mElements;

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

    void add(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;

    size_t sizes(pid_t pid = pid_all);
    size_t elements(pid_t pid = pid_all);
    // fast track current value
    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 elementsTotal(pid_t pid = pid_all);
@@ -108,6 +117,7 @@ public:

    void add(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 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 subtract(unsigned short size, log_id_t log_id, uid_t uid, pid_t pid);
    void sort();

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