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

Commit fafea324 authored by Chenjie Luo's avatar Chenjie Luo
Browse files

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
parent 483d2f9a
Loading
Loading
Loading
Loading
+29 −10
Original line number Diff line number Diff line
@@ -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)
+4 −3
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
#include <sysutils/SocketClient.h>

#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<LogBufferElement*> 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)
+22 −0
Original line number Diff line number Diff line
/*
 * 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
+40 −0
Original line number Diff line number Diff line
/*
 * 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 <sys/types.h>

#include <android-base/macros.h>
#include <log/log_id.h>
#include <log/log_time.h>

// 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__
+9 −6
Original line number Diff line number Diff line
@@ -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,12 +102,15 @@ 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) {
    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;
}
Loading