From fafea32468e0d59c1ce2eb845dd07a0b4e746cf0 Mon Sep 17 00:00:00 2001 From: Chenjie Luo Date: Thu, 27 Apr 2017 16:49:09 -0700 Subject: [PATCH] Modularize logd. Separates logd body into a static library liblogd and virtualize LogBuffer::log to be in a new interface class LogBufferInterface. User could have different implementation. Bug: 37756450 Test: liblog-unit-tests, logd-unit-tests and logcat-unit-tests with (b/37791296). Change-Id: I1504ff0e992744001b5a2e9abd45692d1318a152 --- logd/Android.mk | 39 ++++++++++++++++++++++++++---------- logd/LogBuffer.h | 7 ++++--- logd/LogBufferInterface.cpp | 22 ++++++++++++++++++++ logd/LogBufferInterface.h | 40 +++++++++++++++++++++++++++++++++++++ logd/LogListener.cpp | 15 ++++++++------ logd/LogListener.h | 4 ++-- 6 files changed, 106 insertions(+), 21 deletions(-) create mode 100644 logd/LogBufferInterface.cpp create mode 100644 logd/LogBufferInterface.h diff --git a/logd/Android.mk b/logd/Android.mk index 9211037bb..fb51992ef 100644 --- a/logd/Android.mk +++ b/logd/Android.mk @@ -2,12 +2,9 @@ LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) -LOCAL_MODULE:= logd - -LOCAL_INIT_RC := logd.rc +LOCAL_MODULE:= liblogd LOCAL_SRC_FILES := \ - main.cpp \ LogCommand.cpp \ CommandListener.cpp \ LogListener.cpp \ @@ -15,6 +12,7 @@ LOCAL_SRC_FILES := \ FlushCommand.cpp \ LogBuffer.cpp \ LogBufferElement.cpp \ + LogBufferInterface.cpp \ LogTimes.cpp \ LogStatistics.cpp \ LogWhiteBlackList.cpp \ @@ -25,12 +23,9 @@ LOCAL_SRC_FILES := \ event.logtags LOCAL_SHARED_LIBRARIES := \ - libsysutils \ - liblog \ - libcutils \ - libbase \ - libpackagelistparser \ - libcap + libbase + +LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH) # This is what we want to do: # event_logtags = $(shell \ @@ -46,6 +41,30 @@ event_flag += -DLIBLOG_LOG_TAG=1006 LOCAL_CFLAGS := -Werror $(event_flag) +include $(BUILD_STATIC_LIBRARY) + +include $(CLEAR_VARS) + +LOCAL_MODULE:= logd + +LOCAL_INIT_RC := logd.rc + +LOCAL_SRC_FILES := \ + main.cpp + +LOCAL_STATIC_LIBRARIES := \ + liblogd + +LOCAL_SHARED_LIBRARIES := \ + libsysutils \ + liblog \ + libcutils \ + libbase \ + libpackagelistparser \ + libcap + +LOCAL_CFLAGS := -Werror + include $(BUILD_EXECUTABLE) include $(CLEAR_VARS) diff --git a/logd/LogBuffer.h b/logd/LogBuffer.h index 51edd8628..e59775488 100644 --- a/logd/LogBuffer.h +++ b/logd/LogBuffer.h @@ -27,6 +27,7 @@ #include #include "LogBufferElement.h" +#include "LogBufferInterface.h" #include "LogStatistics.h" #include "LogTags.h" #include "LogTimes.h" @@ -74,7 +75,7 @@ static bool isMonotonic(const log_time& mono) { typedef std::list LogBufferElementCollection; -class LogBuffer { +class LogBuffer : public LogBufferInterface { LogBufferElementCollection mLogElements; pthread_rwlock_t mLogElementsLock; @@ -107,14 +108,14 @@ class LogBuffer { LastLogTimes& mTimes; explicit LogBuffer(LastLogTimes* times); - ~LogBuffer(); + ~LogBuffer() override; void init(); bool isMonotonic() { return monotonic; } int log(log_id_t log_id, log_time realtime, uid_t uid, pid_t pid, pid_t tid, - const char* msg, unsigned short len); + const char* msg, unsigned short len) override; // lastTid is an optional context to help detect if the last previous // valid message was from the same source so we can differentiate chatty // filter types (identical or expired) diff --git a/logd/LogBufferInterface.cpp b/logd/LogBufferInterface.cpp new file mode 100644 index 000000000..3cb2b898f --- /dev/null +++ b/logd/LogBufferInterface.cpp @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "LogBufferInterface.h" + +LogBufferInterface::LogBufferInterface() { +} +LogBufferInterface::~LogBufferInterface() { +} \ No newline at end of file diff --git a/logd/LogBufferInterface.h b/logd/LogBufferInterface.h new file mode 100644 index 000000000..7d82b91f3 --- /dev/null +++ b/logd/LogBufferInterface.h @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2012-2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _LOGD_LOG_BUFFER_INTERFACE_H__ +#define _LOGD_LOG_BUFFER_INTERFACE_H__ + +#include + +#include +#include +#include + +// Abstract interface that handles log when log available. +class LogBufferInterface { + public: + LogBufferInterface(); + virtual ~LogBufferInterface(); + // Handles a log entry when available in LogListener. + // Returns the size of the handled log message. + virtual int log(log_id_t log_id, log_time realtime, uid_t uid, pid_t pid, + pid_t tid, const char* msg, unsigned short len) = 0; + + private: + DISALLOW_COPY_AND_ASSIGN(LogBufferInterface); +}; + +#endif // _LOGD_LOG_BUFFER_INTERFACE_H__ diff --git a/logd/LogListener.cpp b/logd/LogListener.cpp index dadc75f4c..709646e37 100644 --- a/logd/LogListener.cpp +++ b/logd/LogListener.cpp @@ -30,7 +30,7 @@ #include "LogListener.h" #include "LogUtils.h" -LogListener::LogListener(LogBuffer* buf, LogReader* reader) +LogListener::LogListener(LogBufferInterface* buf, LogReader* reader) : SocketListener(getLogSocket(), false), logbuf(buf), reader(reader) { } @@ -102,11 +102,14 @@ bool LogListener::onDataAvailable(SocketClient* cli) { // NB: hdr.msg_flags & MSG_TRUNC is not tested, silently passing a // truncated message to the logs. - if (logbuf->log((log_id_t)header->id, header->realtime, cred->uid, - cred->pid, header->tid, msg, - ((size_t)n <= USHRT_MAX) ? (unsigned short)n : USHRT_MAX) >= - 0) { - reader->notifyNewLog(); + if (logbuf != nullptr) { + int res = logbuf->log( + (log_id_t)header->id, header->realtime, cred->uid, cred->pid, + header->tid, msg, + ((size_t)n <= USHRT_MAX) ? (unsigned short)n : USHRT_MAX); + if (res > 0 && reader != nullptr) { + reader->notifyNewLog(); + } } return true; diff --git a/logd/LogListener.h b/logd/LogListener.h index 2973b8bd3..e16c5fb62 100644 --- a/logd/LogListener.h +++ b/logd/LogListener.h @@ -21,11 +21,11 @@ #include "LogReader.h" class LogListener : public SocketListener { - LogBuffer* logbuf; + LogBufferInterface* logbuf; LogReader* reader; public: - LogListener(LogBuffer* buf, LogReader* reader); + LogListener(LogBufferInterface* buf, LogReader* reader /* nullable */); protected: virtual bool onDataAvailable(SocketClient* cli);