1 /*
2 * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "syscall_filter.h"
17
18 #include "config_filter.h"
19 #include "process_filter.h"
20
21 namespace SysTuning {
22 namespace TraceStreamer {
SyscallFilter(TraceDataCache * dataCache,const TraceStreamerFilters * filter)23 SyscallFilter::SyscallFilter(TraceDataCache *dataCache, const TraceStreamerFilters *filter)
24 : FilterBase(dataCache, filter)
25 {
26 }
~SyscallFilter()27 SyscallFilter::~SyscallFilter() {}
28
UpdataSyscallEnterExitMap(const SyscallInfoRow & syscallInfoRow)29 void SyscallFilter::UpdataSyscallEnterExitMap(const SyscallInfoRow &syscallInfoRow)
30 {
31 TS_LOGD("SysEnterEvent: SysEnter ID %u", syscallInfoRow.number);
32 const auto &syscallNrSet = streamFilters_->configFilter_->GetSwitchConfig().SyscallsTsSet();
33 if (syscallNrSet.find(syscallInfoRow.number) == syscallNrSet.end()) {
34 return;
35 }
36 syscallEnterExitMap_[syscallInfoRow.itid] = syscallInfoRow;
37 }
38
AppendSysCallInfo(uint32_t pid,uint32_t syscallNr,uint64_t ts,int64_t ret)39 void SyscallFilter::AppendSysCallInfo(uint32_t pid, uint32_t syscallNr, uint64_t ts, int64_t ret)
40 {
41 TS_LOGD("SysExitEvent: SysEnter ID %u", syscallNr);
42 auto syscallEnterExitItor = syscallEnterExitMap_.find(pid);
43 if (syscallEnterExitItor != syscallEnterExitMap_.end()) {
44 auto &syscallInfoRow = syscallEnterExitItor->second;
45 if (syscallInfoRow.number == syscallNr && syscallInfoRow.ts <= ts) {
46 syscallInfoRow.dur = ts - syscallInfoRow.ts;
47 syscallInfoRow.ret = ret;
48 syscallInfoRow.itid = streamFilters_->processFilter_->UpdateOrCreateThread(ts, pid);
49 traceDataCache_->GetSysCallData()->AppendSysCallData(syscallInfoRow);
50 }
51 syscallEnterExitMap_.erase(pid);
52 } else {
53 TS_LOGW("SysExitEvent: No matching sysExit event found for syscallID = %u.", syscallNr);
54 }
55 }
56
Clear()57 void SyscallFilter::Clear()
58 {
59 syscallEnterExitMap_.clear();
60 }
61 } // namespace TraceStreamer
62 } // namespace SysTuning
63