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

Commit 0ef26c63 authored by Christopher Ferris's avatar Christopher Ferris Committed by Android (Google) Code Review
Browse files

Merge "Decrease size of LogBufferElements to 32 bytes." into oc-mr1-dev

parents 46691ee8 2cf55995
Loading
Loading
Loading
Loading
+36 −12
Original line number Original line Diff line number Diff line
@@ -41,22 +41,20 @@ LogBufferElement::LogBufferElement(log_id_t log_id, log_time realtime,
      mTid(tid),
      mTid(tid),
      mRealTime(realtime),
      mRealTime(realtime),
      mMsgLen(len),
      mMsgLen(len),
      mLogId(log_id) {
      mLogId(log_id),
      mDropped(false) {
    mMsg = new char[len];
    mMsg = new char[len];
    memcpy(mMsg, msg, len);
    memcpy(mMsg, msg, len);
    mTag = (isBinary() && (mMsgLen >= sizeof(uint32_t)))
               ? le32toh(reinterpret_cast<android_event_header_t*>(mMsg)->tag)
               : 0;
}
}


LogBufferElement::LogBufferElement(const LogBufferElement& elem)
LogBufferElement::LogBufferElement(const LogBufferElement& elem)
    : mTag(elem.mTag),
    : mUid(elem.mUid),
      mUid(elem.mUid),
      mPid(elem.mPid),
      mPid(elem.mPid),
      mTid(elem.mTid),
      mTid(elem.mTid),
      mRealTime(elem.mRealTime),
      mRealTime(elem.mRealTime),
      mMsgLen(elem.mMsgLen),
      mMsgLen(elem.mMsgLen),
      mLogId(elem.mLogId) {
      mLogId(elem.mLogId),
      mDropped(elem.mDropped) {
    mMsg = new char[mMsgLen];
    mMsg = new char[mMsgLen];
    memcpy(mMsg, elem.mMsg, mMsgLen);
    memcpy(mMsg, elem.mMsg, mMsgLen);
}
}
@@ -65,6 +63,32 @@ LogBufferElement::~LogBufferElement() {
    delete[] mMsg;
    delete[] mMsg;
}
}


uint32_t LogBufferElement::getTag() const {
    return (isBinary() &&
            ((mDropped && mMsg != nullptr) ||
             (!mDropped && mMsgLen >= sizeof(android_event_header_t))))
               ? reinterpret_cast<const android_event_header_t*>(mMsg)->tag
               : 0;
}

unsigned short LogBufferElement::setDropped(unsigned short value) {
    // The tag information is saved in mMsg data, if the tag is non-zero
    // save only the information needed to get the tag.
    if (getTag() != 0) {
        if (mMsgLen > sizeof(android_event_header_t)) {
            char* truncated_msg = new char[sizeof(android_event_header_t)];
            memcpy(truncated_msg, mMsg, sizeof(android_event_header_t));
            delete[] mMsg;
            mMsg = truncated_msg;
        }  // mMsgLen == sizeof(android_event_header_t), already at minimum.
    } else {
        delete[] mMsg;
        mMsg = nullptr;
    }
    mDropped = true;
    return mDroppedCount = value;
}

// caller must own and free character string
// caller must own and free character string
char* android::tidToName(pid_t tid) {
char* android::tidToName(pid_t tid) {
    char* retval = NULL;
    char* retval = NULL;
@@ -164,8 +188,8 @@ size_t LogBufferElement::populateDroppedMessage(char*& buffer, LogBuffer* parent
    // identical to below to calculate the buffer size required
    // identical to below to calculate the buffer size required
    const char* type = lastSame ? "identical" : "expire";
    const char* type = lastSame ? "identical" : "expire";
    size_t len = snprintf(NULL, 0, format_uid, mUid, name ? name : "",
    size_t len = snprintf(NULL, 0, format_uid, mUid, name ? name : "",
                          commName ? commName : "", type, mDropped,
                          commName ? commName : "", type, getDropped(),
                          (mDropped > 1) ? "s" : "");
                          (getDropped() > 1) ? "s" : "");


    size_t hdrLen;
    size_t hdrLen;
    if (isBinary()) {
    if (isBinary()) {
@@ -196,8 +220,8 @@ size_t LogBufferElement::populateDroppedMessage(char*& buffer, LogBuffer* parent
    }
    }


    snprintf(buffer + hdrLen, len + 1, format_uid, mUid, name ? name : "",
    snprintf(buffer + hdrLen, len + 1, format_uid, mUid, name ? name : "",
             commName ? commName : "", type, mDropped,
             commName ? commName : "", type, getDropped(),
             (mDropped > 1) ? "s" : "");
             (getDropped() > 1) ? "s" : "");
    free(const_cast<char*>(name));
    free(const_cast<char*>(name));
    free(const_cast<char*>(commName));
    free(const_cast<char*>(commName));


@@ -225,7 +249,7 @@ log_time LogBufferElement::flushTo(SocketClient* reader, LogBuffer* parent,


    char* buffer = NULL;
    char* buffer = NULL;


    if (!mMsg) {
    if (mDropped) {
        entry.len = populateDroppedMessage(buffer, parent, lastSame);
        entry.len = populateDroppedMessage(buffer, parent, lastSame);
        if (!entry.len) return mRealTime;
        if (!entry.len) return mRealTime;
        iovec[1].iov_base = buffer;
        iovec[1].iov_base = buffer;
+11 −19
Original line number Original line Diff line number Diff line
@@ -32,25 +32,25 @@ class LogBuffer;
                                  // chatty for the temporal expire messages
                                  // chatty for the temporal expire messages
#define EXPIRE_RATELIMIT 10  // maximum rate in seconds to report expiration
#define EXPIRE_RATELIMIT 10  // maximum rate in seconds to report expiration


class LogBufferElement {
class __attribute__((packed)) LogBufferElement {
    friend LogBuffer;
    friend LogBuffer;


    // sized to match reality of incoming log packets
    // sized to match reality of incoming log packets
    uint32_t mTag;  // only valid for isBinary()
    const uint32_t mUid;
    const uint32_t mUid;
    const uint32_t mPid;
    const uint32_t mPid;
    const uint32_t mTid;
    const uint32_t mTid;
    log_time mRealTime;
    log_time mRealTime;
    char* mMsg;
    char* mMsg;
    union {
    union {
        const uint16_t mMsgLen;  // mMSg != NULL
        const uint16_t mMsgLen;  // mDropped == false
        uint16_t mDropped;       // mMsg == NULL
        uint16_t mDroppedCount;  // mDropped == true
    };
    };
    const uint8_t mLogId;
    const uint8_t mLogId;
    bool mDropped;


    static atomic_int_fast64_t sequence;
    static atomic_int_fast64_t sequence;


    // assumption: mMsg == NULL
    // assumption: mDropped == true
    size_t populateDroppedMessage(char*& buffer, LogBuffer* parent,
    size_t populateDroppedMessage(char*& buffer, LogBuffer* parent,
                                  bool lastSame);
                                  bool lastSame);


@@ -58,7 +58,7 @@ class LogBufferElement {
    LogBufferElement(log_id_t log_id, log_time realtime, uid_t uid, pid_t pid,
    LogBufferElement(log_id_t log_id, log_time realtime, uid_t uid, pid_t pid,
                     pid_t tid, const char* msg, unsigned short len);
                     pid_t tid, const char* msg, unsigned short len);
    LogBufferElement(const LogBufferElement& elem);
    LogBufferElement(const LogBufferElement& elem);
    virtual ~LogBufferElement();
    ~LogBufferElement();


    bool isBinary(void) const {
    bool isBinary(void) const {
        return (mLogId == LOG_ID_EVENTS) || (mLogId == LOG_ID_SECURITY);
        return (mLogId == LOG_ID_EVENTS) || (mLogId == LOG_ID_SECURITY);
@@ -76,24 +76,16 @@ class LogBufferElement {
    pid_t getTid(void) const {
    pid_t getTid(void) const {
        return mTid;
        return mTid;
    }
    }
    uint32_t getTag() const {
    uint32_t getTag() const;
        return mTag;
    }
    unsigned short getDropped(void) const {
    unsigned short getDropped(void) const {
        return mMsg ? 0 : mDropped;
        return mDropped ? mDroppedCount : 0;
    }
    unsigned short setDropped(unsigned short value) {
        if (mMsg) {
            delete[] mMsg;
            mMsg = NULL;
        }
        return mDropped = value;
    }
    }
    unsigned short setDropped(unsigned short value);
    unsigned short getMsgLen() const {
    unsigned short getMsgLen() const {
        return mMsg ? mMsgLen : 0;
        return mDropped ? 0 : mMsgLen;
    }
    }
    const char* getMsg() const {
    const char* getMsg() const {
        return mMsg;
        return mDropped ? nullptr : mMsg;
    }
    }
    log_time getRealTime(void) const {
    log_time getRealTime(void) const {
        return mRealTime;
        return mRealTime;