• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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