diff --git a/services/hilogd/include/log_kmsg.h b/services/hilogd/include/log_kmsg.h index ae699b8daba62e82f23346a84eca1b300fc4eb0d..01744710c7ad074c77d5a8f97f5609f515781256 100644 --- a/services/hilogd/include/log_kmsg.h +++ b/services/hilogd/include/log_kmsg.h @@ -23,13 +23,18 @@ namespace OHOS { namespace HiviewDFX { class LogKmsg { public: - explicit LogKmsg(HilogBuffer& hilogBuffer) : hilogBuffer(hilogBuffer) {} - ~LogKmsg(); + static LogKmsg* GetInstance(HilogBuffer& hilogBuffer); ssize_t LinuxReadOneKmsg(KmsgParser& parser); int LinuxReadAllKmsg(); - void ReadAllKmsg(); - void Start(); + void Start(const std::string &tname); + void Stop(const std::string &tname); + void ReadAllKmsg(const std::string &tname, int num); + virtual ~LogKmsg(); private: + explicit LogKmsg(HilogBuffer& hilogBuffer) : hilogBuffer(hilogBuffer) {} + static LogKmsg *logKmsg; + typedef std::unordered_map ThreadMap; + ThreadMap tm; int kmsgCtl = -1; HilogBuffer& hilogBuffer; }; diff --git a/services/hilogd/include/service_controller.h b/services/hilogd/include/service_controller.h index 41e14f0887ad25605af75ccb77d0ad18774c2505..05a437bb328f78c2bf2573d9115600d20c45c223 100644 --- a/services/hilogd/include/service_controller.h +++ b/services/hilogd/include/service_controller.h @@ -31,6 +31,7 @@ #include "log_persister.h" #include "log_stats.h" #include "log_buffer.h" +#include "log_kmsg.h" namespace OHOS { namespace HiviewDFX { @@ -89,7 +90,6 @@ private: std::unique_ptr m_communicationSocket; HilogBuffer& m_hilogBuffer; HilogBuffer::ReaderId m_bufReader; - std::condition_variable m_notifyNewDataCv; std::mutex m_notifyNewDataMtx; }; diff --git a/services/hilogd/kmsg_parser.cpp b/services/hilogd/kmsg_parser.cpp index 1022ec6fbd5bdb404e70d9a992ab500c97105757..eefe7c5fa0fb9bda654889bc631b9c2baba3f92a 100644 --- a/services/hilogd/kmsg_parser.cpp +++ b/services/hilogd/kmsg_parser.cpp @@ -170,7 +170,7 @@ std::optional KmsgParser::ParseKmsg(const std::vector& km msg.len = msgLen; msg.tag_len = tagLen + 1; msg.type = LOG_KMSG; - msg.domain = 0xdfffffff; + msg.domain = 0xD002600; msg.level = KmsgLevelMap(mLevel); time_point logtime = BootTime() + microseconds{timestamp}; struct timespec logts = TimepointToTimespec(logtime); diff --git a/services/hilogd/log_kmsg.cpp b/services/hilogd/log_kmsg.cpp index 32fed478fcbf8d03cc4e980b28f0418bedfb2093..7781789c022cf0fa4d55fa8c2ad34cb486ec5f8a 100644 --- a/services/hilogd/log_kmsg.cpp +++ b/services/hilogd/log_kmsg.cpp @@ -25,7 +25,8 @@ #include #include #include - +#include +#include #include #include #include @@ -34,6 +35,15 @@ namespace OHOS { namespace HiviewDFX { using namespace std; +LogKmsg* LogKmsg::logKmsg=NULL; +LogKmsg* LogKmsg::GetInstance(HilogBuffer& hilogBuffer) +{ + if (logKmsg == NULL) { + logKmsg = new LogKmsg(hilogBuffer); + } + return logKmsg; +} + ssize_t LogKmsg::LinuxReadOneKmsg(KmsgParser& parser) { std::vector kmsgBuffer(BUFSIZ, '\0'); @@ -83,25 +93,38 @@ int LogKmsg::LinuxReadAllKmsg() return 1; } -void LogKmsg::ReadAllKmsg() +void LogKmsg::ReadAllKmsg(const std::string &tName, int time) { -#ifdef __linux__ - std::cout << "Platform: Linux" << std::endl; - LinuxReadAllKmsg(); -#endif + prctl(PR_SET_NAME, tName.c_str(), 0, 0, 0); + #ifdef __linux__ + std::cout << "Platform: Linux" << std::endl; + LinuxReadAllKmsg(); + #endif + sleep(time); } -void LogKmsg::Start() +void LogKmsg::Start(const std::string &tName) { - std::thread KmsgThread([this]() { - ReadAllKmsg(); - }); - KmsgThread.join(); + std::thread thrd = std::thread(&LogKmsg::ReadAllKmsg, this, tName, 1000); + tm[tName] = thrd.native_handle(); + thrd.detach(); + std::cout << "Thread " << tName << " created:" << std::endl; +} + +void LogKmsg::Stop(const std::string &tName) +{ + ThreadMap::const_iterator it = tm.find(tName); + if (it != tm.end()) { + pthread_cancel(it->second); + tm.erase(tName); + std::cout << "Thread " << tName << " killed:" << std::endl; + } } LogKmsg::~LogKmsg() { close(kmsgCtl); + delete logKmsg; } } // namespace HiviewDFX } // namespace OHOS diff --git a/services/hilogd/main.cpp b/services/hilogd/main.cpp index f9f8886122d06ca0bd4f056b8e7b057d0b83a13e..eabcde91f27fcb9e6976693188a2d4212c7fdd8b 100644 --- a/services/hilogd/main.cpp +++ b/services/hilogd/main.cpp @@ -203,10 +203,14 @@ int HilogdEntry() RestorePersistJobs(hilogBuffer); } }); + auto kmsgTask = std::async(std::launch::async, [&hilogBuffer]() { - prctl(PR_SET_NAME, "hilogd.rd_kmsg"); - LogKmsg logKmsg(hilogBuffer); - logKmsg.ReadAllKmsg(); + + LogKmsg* logKmsg = LogKmsg::GetInstance(hilogBuffer); + bool kmsgEnable = IsKmsgSwitchOn(); + if (kmsgEnable) { + logKmsg->Start("hilogd.rd_kmsg"); + } }); auto cgroupWriteTask = std::async(std::launch::async, [&hilogBuffer]() { diff --git a/services/hilogd/service_controller.cpp b/services/hilogd/service_controller.cpp index c8866cde92400a0afa9d131a18cfb10dc54a6086..f7a2fc1c5917e67f555a262a0bd6f4fc8f2a645f 100644 --- a/services/hilogd/service_controller.cpp +++ b/services/hilogd/service_controller.cpp @@ -38,6 +38,7 @@ #include "log_data.h" #include "log_buffer.h" #include "log_utils.h" +#include "log_kmsg.h" #include "service_controller.h" @@ -76,7 +77,7 @@ static const uid_t ROOT_UID = 0; ServiceController::ServiceController(std::unique_ptr communicationSocket, HilogBuffer& buffer) : m_communicationSocket(std::move(communicationSocket)) , m_hilogBuffer(buffer) -{ +{ m_bufReader = m_hilogBuffer.CreateBufReader([this]() { NotifyForNewData(); }); } @@ -746,6 +747,13 @@ void ServiceController::HandleLogRemoveRqst(const LogRemoveRqst& rqst) void ServiceController::HandleLogKmsgEnableRqst(const KmsgEnableRqst& rqst) { SetKmsgSwitchOn(rqst.on); + + LogKmsg* logKmsg = LogKmsg::GetInstance(m_hilogBuffer); + if (rqst.on) { + logKmsg->Start("hilogd.rd_kmsg"); + } else { + logKmsg->Stop("hilogd.rd_kmsg"); + } // set domain flow control later KmsgEnableRsp rsp = { 0 }; WriteRspHeader(IoctlCmd::KMSG_ENABLE_RSP, sizeof(rsp));