LogStatistics.h revision 97c1c2beee2cbd8c67c1cd507367e5b084d853c8
134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn/*
234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * Copyright (C) 2014 The Android Open Source Project
334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn *
434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License");
534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * you may not use this file except in compliance with the License.
634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * You may obtain a copy of the License at
734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn *
834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn *      http://www.apache.org/licenses/LICENSE-2.0
934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn *
1034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * Unless required by applicable law or agreed to in writing, software
1134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS,
1234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * See the License for the specific language governing permissions and
1434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn * limitations under the License.
1534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn */
1634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
1734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#ifndef _LOGD_LOG_STATISTICS_H__
1834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#define _LOGD_LOG_STATISTICS_H__
1934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
2034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include <sys/types.h>
2134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
2234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#include <log/log.h>
2397c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn#include <utils/BasicHashtable.h>
2497c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn
2597c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn#include "LogBufferElement.h"
2634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
2734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#define log_id_for_each(i) \
2834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    for (log_id_t i = LOG_ID_MIN; i < LOG_ID_MAX; i = (log_id_t) (i + 1))
2934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
3097c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzynstruct UidEntry {
3134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    const uid_t uid;
3297c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    size_t size;
3334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
3497c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    UidEntry(uid_t uid):uid(uid),size(0) { }
3534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
3697c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    inline const uid_t&getKey() const { return uid; }
3797c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    size_t getSizes() const { return size; }
3897c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    inline void add(size_t s) { size += s; }
3997c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    inline bool subtract(size_t s) { size -= s; return !size; }
4034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn};
4134facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
4234facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn// Log Statistics
4334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynclass LogStatistics {
4434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t mSizes[LOG_ID_MAX];
4534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t mElements[LOG_ID_MAX];
4697c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    size_t mSizesTotal[LOG_ID_MAX];
4797c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    size_t mElementsTotal[LOG_ID_MAX];
4834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
4997c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    // uid to size list
5097c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    typedef android::BasicHashtable<uid_t, UidEntry> uidTable_t;
5197c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    uidTable_t uidTable[LOG_ID_MAX];
52e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn
5334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzynpublic:
5434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    LogStatistics();
5534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
5697c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    void enableStatistics() { }
5734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
5897c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    void add(LogBufferElement *entry);
5997c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    void subtract(LogBufferElement *entry);
60e457b74ce6ee6d799812dc2ec5e4b8b18bcd3e91Mark Salyzyn
6197c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    // Caller must delete array
6297c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    const UidEntry **sort(size_t n, log_id i);
6334facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
6434facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    // fast track current value by id only
6534facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t sizes(log_id_t id) const { return mSizes[id]; }
6634facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    size_t elements(log_id_t id) const { return mElements[id]; }
6797c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    size_t sizesTotal(log_id_t id) const { return mSizesTotal[id]; }
6897c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    size_t elementsTotal(log_id_t id) const { return mElementsTotal[id]; }
6934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
7034facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn    // *strp = malloc, balance with free
7197c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    void format(char **strp, uid_t uid, unsigned int logMask);
729a03863e88da99ba010342c874252089dd771f7fMark Salyzyn
739a03863e88da99ba010342c874252089dd771f7fMark Salyzyn    // helper
7497c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    char *pidToName(pid_t pid);
754ba0387af5acc52e43e4004ccb4c46b8bc700349Mark Salyzyn    uid_t pidToUid(pid_t pid);
7697c1c2beee2cbd8c67c1cd507367e5b084d853c8Mark Salyzyn    char *uidToName(uid_t uid);
7734facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn};
7834facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn
7934facab86b0fe7ec613de92b46b637f864fb0682Mark Salyzyn#endif // _LOGD_LOG_STATISTICS_H__
80