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

This commit is contained in:
Mark Salyzyn 2014-03-21 20:09:29 +00:00 committed by Gerrit Code Review
commit ee212d0053
6 changed files with 51 additions and 17 deletions

View file

@ -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
} }

View file

@ -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);

View file

@ -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,

View file

@ -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;

View file

@ -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; }

View file

@ -50,7 +50,7 @@ bool LogListener::onDataAvailable(SocketClient *cli) {
int socket = cli->getSocket(); int socket = cli->getSocket();
ssize_t n = recvmsg(socket, &hdr, 0); ssize_t n = recvmsg(socket, &hdr, 0);
if (n <= (ssize_t) sizeof_log_id_t) { if (n <= (sizeof_log_id_t + sizeof(uint16_t) + sizeof(log_time))) {
return false; return false;
} }
@ -82,17 +82,22 @@ bool LogListener::onDataAvailable(SocketClient *cli) {
if (log_id < 0 || log_id >= LOG_ID_MAX) { if (log_id < 0 || log_id >= LOG_ID_MAX) {
return false; return false;
} }
char *msg = ((char *)buffer) + sizeof_log_id_t; char *msg = ((char *)buffer) + sizeof_log_id_t;
n -= sizeof_log_id_t; n -= sizeof_log_id_t;
// second element is the thread id of the caller
pid_t tid = (pid_t) *((uint16_t *) msg);
msg += sizeof(uint16_t);
n -= sizeof(uint16_t);
// third element is the realtime at point of caller
log_time realtime(msg); log_time realtime(msg);
msg += sizeof(log_time); msg += sizeof(log_time);
n -= sizeof(log_time); n -= sizeof(log_time);
unsigned short len = n; unsigned short len = n;
if (len == n) { if (len == n) {
logbuf->log(log_id, realtime, cred->uid, cred->pid, msg, len); logbuf->log(log_id, realtime, cred->uid, cred->pid, tid, msg, len);
reader->notifyNewLog(); reader->notifyNewLog();
} }