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

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

logd: liblog: Thread IDs missing from logcat -v thread

- stuff caller's thread id into the packet.

Bug: 13568206
Change-Id: I02d0cdf9b1d9e839ff8969f591db42dfe6e4cc95
parent 5ad986ab
Loading
Loading
Loading
Loading
+30 −7
Original line number Original line Diff line number Diff line
@@ -111,11 +111,34 @@ static int __write_to_log_kernel(log_id_t log_id, struct iovec *vec, size_t nr)
         */
         */
        return 0;
        return 0;
    }
    }
    struct iovec newVec[nr + 2];
    /*
     *  struct {
     *      // what we provide
     *      typeof_log_id_t  log_id;
     *      u16              tid;
     *      log_time         realtime;
     *      // caller provides
     *      union {
     *          struct {
     *              char     prio;
     *              char     payload[];
     *          } string;
     *          struct {
     *              uint32_t tag
     *              char     payload[];
     *          } binary;
     *      };
     *  };
     */
    static const unsigned header_length = 3;
    struct iovec newVec[nr + header_length];
    typeof_log_id_t log_id_buf = log_id;
    typeof_log_id_t log_id_buf = log_id;
    uint16_t tid = gettid();


    newVec[0].iov_base   = (unsigned char *) &log_id_buf;
    newVec[0].iov_base   = (unsigned char *) &log_id_buf;
    newVec[0].iov_len    = sizeof_log_id_t;
    newVec[0].iov_len    = sizeof_log_id_t;
    newVec[1].iov_base   = (unsigned char *) &tid;
    newVec[1].iov_len    = sizeof(tid);


    struct timespec ts;
    struct timespec ts;
    clock_gettime(CLOCK_REALTIME, &ts);
    clock_gettime(CLOCK_REALTIME, &ts);
@@ -123,17 +146,17 @@ static int __write_to_log_kernel(log_id_t log_id, struct iovec *vec, size_t nr)
    realtime_ts.tv_sec = ts.tv_sec;
    realtime_ts.tv_sec = ts.tv_sec;
    realtime_ts.tv_nsec = ts.tv_nsec;
    realtime_ts.tv_nsec = ts.tv_nsec;


    newVec[1].iov_base   = (unsigned char *) &realtime_ts;
    newVec[2].iov_base   = (unsigned char *) &realtime_ts;
    newVec[1].iov_len    = sizeof(log_time);
    newVec[2].iov_len    = sizeof(log_time);


    size_t i;
    size_t i;
    for (i = 2; i < nr + 2; i++) {
    for (i = header_length; i < nr + header_length; i++) {
        newVec[i].iov_base = vec[i-2].iov_base;
        newVec[i].iov_base = vec[i-header_length].iov_base;
        newVec[i].iov_len  = vec[i-2].iov_len;
        newVec[i].iov_len  = vec[i-header_length].iov_len;
    }
    }


    /* The write below could be lost, but will never block. */
    /* The write below could be lost, but will never block. */
    return writev(logd_fd, newVec, nr + 2);
    return writev(logd_fd, newVec, nr + header_length);
#endif
#endif
}
}


+3 −3
Original line number Original line Diff line number Diff line
@@ -45,13 +45,13 @@ LogBuffer::LogBuffer(LastLogTimes *times)
}
}


void LogBuffer::log(log_id_t log_id, log_time realtime,
void LogBuffer::log(log_id_t log_id, log_time realtime,
                    uid_t uid, pid_t pid, const char *msg,
                    uid_t uid, pid_t pid, pid_t tid,
                    unsigned short len) {
                    const char *msg, unsigned short len) {
    if ((log_id >= LOG_ID_MAX) || (log_id < 0)) {
    if ((log_id >= LOG_ID_MAX) || (log_id < 0)) {
        return;
        return;
    }
    }
    LogBufferElement *elem = new LogBufferElement(log_id, realtime,
    LogBufferElement *elem = new LogBufferElement(log_id, realtime,
                                                  uid, pid, msg, len);
                                                  uid, pid, tid, msg, len);


    pthread_mutex_lock(&mLogElementsLock);
    pthread_mutex_lock(&mLogElementsLock);


+2 −1
Original line number Original line Diff line number Diff line
@@ -48,7 +48,8 @@ public:
    LogBuffer(LastLogTimes *times);
    LogBuffer(LastLogTimes *times);


    void log(log_id_t log_id, log_time realtime,
    void log(log_id_t log_id, log_time realtime,
             uid_t uid, pid_t pid, const char *msg, unsigned short len);
             uid_t uid, pid_t pid, pid_t tid,
             const char *msg, unsigned short len);
    log_time flushTo(SocketClient *writer, const log_time start,
    log_time flushTo(SocketClient *writer, const log_time start,
                     bool privileged,
                     bool privileged,
                     bool (*filter)(const LogBufferElement *element, void *arg) = NULL,
                     bool (*filter)(const LogBufferElement *element, void *arg) = NULL,
+4 −2
Original line number Original line Diff line number Diff line
@@ -27,11 +27,12 @@
const log_time LogBufferElement::FLUSH_ERROR((uint32_t)0, (uint32_t)0);
const log_time LogBufferElement::FLUSH_ERROR((uint32_t)0, (uint32_t)0);


LogBufferElement::LogBufferElement(log_id_t log_id, log_time realtime,
LogBufferElement::LogBufferElement(log_id_t log_id, log_time realtime,
                                   uid_t uid, pid_t pid, const char *msg,
                                   uid_t uid, pid_t pid, pid_t tid,
                                   unsigned short len)
                                   const char *msg, unsigned short len)
        : mLogId(log_id)
        : mLogId(log_id)
        , mUid(uid)
        , mUid(uid)
        , mPid(pid)
        , mPid(pid)
        , mTid(tid)
        , mMsgLen(len)
        , mMsgLen(len)
        , mMonotonicTime(CLOCK_MONOTONIC)
        , mMonotonicTime(CLOCK_MONOTONIC)
        , mRealTime(realtime) {
        , mRealTime(realtime) {
@@ -50,6 +51,7 @@ log_time LogBufferElement::flushTo(SocketClient *reader) {
    entry.len = mMsgLen;
    entry.len = mMsgLen;
    entry.lid = mLogId;
    entry.lid = mLogId;
    entry.pid = mPid;
    entry.pid = mPid;
    entry.tid = mTid;
    entry.sec = mRealTime.tv_sec;
    entry.sec = mRealTime.tv_sec;
    entry.nsec = mRealTime.tv_nsec;
    entry.nsec = mRealTime.tv_nsec;


+4 −1
Original line number Original line Diff line number Diff line
@@ -26,6 +26,7 @@ class LogBufferElement {
    const log_id_t mLogId;
    const log_id_t mLogId;
    const uid_t mUid;
    const uid_t mUid;
    const pid_t mPid;
    const pid_t mPid;
    const pid_t mTid;
    char *mMsg;
    char *mMsg;
    const unsigned short mMsgLen;
    const unsigned short mMsgLen;
    const log_time mMonotonicTime;
    const log_time mMonotonicTime;
@@ -33,12 +34,14 @@ class LogBufferElement {


public:
public:
    LogBufferElement(log_id_t log_id, log_time realtime,
    LogBufferElement(log_id_t log_id, log_time realtime,
                     uid_t uid, pid_t pid, const char *msg, unsigned short len);
                     uid_t uid, pid_t pid, pid_t tid,
                     const char *msg, unsigned short len);
    virtual ~LogBufferElement();
    virtual ~LogBufferElement();


    log_id_t getLogId() const { return mLogId; }
    log_id_t getLogId() const { return mLogId; }
    uid_t getUid(void) const { return mUid; }
    uid_t getUid(void) const { return mUid; }
    pid_t getPid(void) const { return mPid; }
    pid_t getPid(void) const { return mPid; }
    pid_t getTid(void) const { return mTid; }
    unsigned short getMsgLen() const { return mMsgLen; }
    unsigned short getMsgLen() const { return mMsgLen; }
    log_time getMonotonicTime(void) const { return mMonotonicTime; }
    log_time getMonotonicTime(void) const { return mMonotonicTime; }
    log_time getRealTime(void) const { return mRealTime; }
    log_time getRealTime(void) const { return mRealTime; }
Loading