1 /*
2 * Copyright (C) 2023 Huawei Device Co., Ltd.
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 use std::ffi::{CString, c_char, c_int, c_uint, c_longlong, c_ulonglong, c_void};
17
18 use crate::{EventType, WatchRule, QueryArg, QueryRule};
19
20 /// Length limit for event domain definition.
21 const MAX_LENGTH_OF_EVENT_DOMAIN: usize = 17;
22
23 /// Length limit for event name definition.
24 const MAX_LENGTH_OF_EVENT_NAME: usize = 33;
25
26 /// Length limit for event tag definition.
27 const MAX_LENGTH_OF_EVENT_TAG: usize = 85;
28
29 /// Length limit for timezone definition.
30 const MAX_LENGTH_OF_TIME_ZONE: usize = 6;
31
32 /// Length limit for event list.
33 const MAX_NUMBER_OF_EVENT_LIST: usize = 10;
34
35 /// Length limit for event list definition.
36 const MAX_EVENT_LIST_LEN: usize = 339;
37
38 /// This type represent to HiSysEventWatchRule defined in C.
39 #[repr(C)]
40 #[derive(Copy, Clone)]
41 struct HiSysEventWatchRule {
42 /// The domain of the event.
43 pub domain: [u8; MAX_LENGTH_OF_EVENT_DOMAIN],
44
45 /// The name of the event.
46 pub name: [u8; MAX_LENGTH_OF_EVENT_NAME],
47
48 /// The tag of the event.
49 pub tag: [u8; MAX_LENGTH_OF_EVENT_TAG],
50
51 /// The rule of match system event.
52 pub rule_type: c_int,
53
54 /// The type of match system event.
55 pub event_type: c_int,
56 }
57
58 /// This type represent to HiSysEventQueryArg defined in C.
59 #[repr(C)]
60 #[derive(Copy, Clone)]
61 struct HiSysEventQueryArg {
62 /// Begin time.
63 pub begin_time: c_longlong,
64
65 /// End time.
66 pub end_time: c_longlong,
67
68 /// Max number of receive system event.
69 pub max_events: c_int,
70 }
71
72 /// This type represent to HiSysEventQueryRuleWrapper defined in C.
73 #[repr(C)]
74 #[derive(Copy, Clone)]
75 struct HiSysEventQueryRuleWrapper {
76 // The domain of the event.
77 pub domain: [u8; MAX_LENGTH_OF_EVENT_DOMAIN],
78
79 /// List of event name.
80 pub event_list: [u8; MAX_EVENT_LIST_LEN],
81
82 /// Size of event name list.
83 pub event_list_size: c_uint,
84
85 /// extra condition for event query.
86 pub condition: *const c_char,
87 }
88
89 /// This type represent to HiSysEventRecord defined in C.
90 #[repr(C)]
91 #[derive(Copy, Clone)]
92 pub struct HiSysEventRecord {
93 /// Domain.
94 domain: [u8; MAX_LENGTH_OF_EVENT_DOMAIN],
95
96 /// Event name.
97 event_name: [u8; MAX_LENGTH_OF_EVENT_NAME],
98
99 /// Event type.
100 event_type: c_int,
101
102 /// Timestamp.
103 time: c_ulonglong,
104
105 /// Timezone.
106 tz: [u8; MAX_LENGTH_OF_TIME_ZONE],
107
108 /// Process id.
109 pid: c_longlong,
110
111 /// Thread id.
112 tid: c_longlong,
113
114 /// User id.
115 uid: c_longlong,
116
117 /// Trace id.
118 trace_id: c_ulonglong,
119
120 /// Span id.
121 spand_id: c_ulonglong,
122
123 /// Parent span id.
124 pspan_id: c_ulonglong,
125
126 /// Trace flag.
127 trace_flag: c_int,
128
129 /// Level.
130 level: *const c_char,
131
132 /// Tag.
133 tag: *const c_char,
134
135 /// Event content.
136 json_str: *const c_char,
137 }
138
139 impl HiSysEventRecord {
140
141 /// Get domain name
get_domain(&self) -> String142 pub fn get_domain(&self) -> String {
143 std::str::from_utf8(&self.domain).expect("need valid domain array")
144 .trim_end_matches(char::from(0)).to_string()
145 }
146
147 /// Get event name
get_event_name(&self) -> String148 pub fn get_event_name(&self) -> String {
149 std::str::from_utf8(&self.event_name).expect("need valid event name array")
150 .trim_end_matches(char::from(0)).to_string()
151 }
152
153 /// Get event name
get_event_type(&self) -> EventType154 pub fn get_event_type(&self) -> EventType {
155 match self.event_type {
156 1 => EventType::Fault,
157 2 => EventType::Statistic,
158 3 => EventType::Security,
159 4 => EventType::Behavior,
160 _ => EventType::Fault,
161 }
162 }
163
164 /// Get time
get_time(&self) -> u64165 pub fn get_time(&self) -> u64 {
166 self.time
167 }
168
169 /// Get time zone
get_time_zone(&self) -> String170 pub fn get_time_zone(&self) -> String {
171 std::str::from_utf8(&self.tz).expect("need valid time zone array")
172 .trim_end_matches(char::from(0)).to_string()
173 }
174
175 /// Get process id
get_pid(&self) -> i64176 pub fn get_pid(&self) -> i64 {
177 self.pid
178 }
179
180 /// Get thread id
get_tid(&self) -> i64181 pub fn get_tid(&self) -> i64 {
182 self.tid
183 }
184
185 /// Get user id
get_uid(&self) -> i64186 pub fn get_uid(&self) -> i64 {
187 self.uid
188 }
189
190 /// Get trace id
get_trace_id(&self) -> u64191 pub fn get_trace_id(&self) -> u64 {
192 self.trace_id
193 }
194
195 /// Get span id
get_span_id(&self) -> u64196 pub fn get_span_id(&self) -> u64 {
197 self.spand_id
198 }
199
200 /// Get parent span id
get_parent_span_id(&self) -> u64201 pub fn get_parent_span_id(&self) -> u64 {
202 self.pspan_id
203 }
204
205 /// Get trace flag
get_trace_flag(&self) -> i32206 pub fn get_trace_flag(&self) -> i32 {
207 self.trace_flag
208 }
209
210 /// Get level
get_level(&self) -> String211 pub fn get_level(&self) -> String {
212 let level_arr = unsafe {
213 std::ffi::CString::from_raw(self.level as *mut std::ffi::c_char)
214 };
215 std::str::from_utf8(level_arr.to_bytes()).expect("need valid level pointer")
216 .trim_end_matches(char::from(0)).to_owned()
217 }
218
219 /// Get tag
get_tag(&self) -> String220 pub fn get_tag(&self) -> String {
221 let tag_arr = unsafe {
222 std::ffi::CString::from_raw(self.tag as *mut std::ffi::c_char)
223 };
224 let tag = std::str::from_utf8(tag_arr.to_bytes()).expect("need valid tag pointer")
225 .trim_end_matches(char::from(0));
226 String::from(tag)
227 }
228
229 /// Get json string
get_json_str(&self) -> String230 pub fn get_json_str(&self) -> String {
231 let json_str_arr = unsafe {
232 std::ffi::CString::from_raw(self.json_str as *mut std::ffi::c_char)
233 };
234 let json_str = std::str::from_utf8(json_str_arr.to_bytes()).expect("need valid json str pointer")
235 .trim_end_matches(char::from(0));
236 String::from(json_str)
237 }
238 }
239
240 /// Callback for handling query result, the query result will be send in several times.
241 pub type OnQuery = unsafe extern "C" fn (
242 callback: *mut c_void,
243 records: *const HiSysEventRecord,
244 size: c_uint
245 );
246
247 /// Callback when event quering finish.
248 pub type OnComplete = unsafe extern "C" fn (
249 callback: *mut c_void,
250 reason: c_int,
251 total: c_int
252 );
253
254 /// This type represent a rust HiSysEventRustQuerierC which like C++ HiSysEventRustQuerierC.
255 #[repr(C)]
256 struct HiSysEventRustQuerierC {
257 pub on_query_cb: *mut c_void,
258 pub on_query_wrapper_cb: OnQuery,
259 pub on_complete_cb: *mut c_void,
260 pub on_complete_wrapper_cb: OnComplete,
261 }
262
263 /// This type represent a rust interfaces.
264 #[allow(dead_code)]
265 pub struct Querier {
266 /// Native event querier.
267 native: *mut HiSysEventRustQuerierC,
268
269 /// Customized rust callback on query.
270 on_query_callback: *mut c_void,
271
272 /// Customized rust callback on complete.
273 on_complete_callback: *mut c_void,
274 }
275
276 impl Querier {
277 /// Create a rust HiSysEventRustQuerierC object with callbacks in a querier.
new<F1, F2>(on_query_callback: F1, on_complete_callback: F2) -> Option<Self> where F1: Fn(&[HiSysEventRecord]) + Send + Sync + 'static, F2: Fn(i32, i32) + Send + Sync + 'static,278 pub fn new<F1, F2>(on_query_callback: F1, on_complete_callback: F2) -> Option<Self>
279 where
280 F1: Fn(&[HiSysEventRecord]) + Send + Sync + 'static,
281 F2: Fn(i32, i32) + Send + Sync + 'static,
282 {
283 let on_query_callback = Box::into_raw(Box::new(on_query_callback));
284 let on_complete_callback = Box::into_raw(Box::new(on_complete_callback));
285 let native = unsafe {
286 CreateRustEventQuerier(on_query_callback as *mut c_void, Self::on_query_callback::<F1>,
287 on_complete_callback as *mut c_void, Self::on_complete_callback::<F2>)
288 };
289 if native.is_null() {
290 None
291 } else {
292 Some(Self {
293 native,
294 on_query_callback: on_query_callback as *mut c_void,
295 on_complete_callback: on_complete_callback as *mut c_void,
296 })
297 }
298 }
299
300 /// Callback for handling query result, the query result will be send in several times.
301 ///
302 /// # Safety
303 ///
304 /// The callback parameter will be kept valid during native
305 /// HiSysEventRustQuerierC object lifetime.
306 ///
on_query_callback<F>(callback: *mut c_void, records: *const HiSysEventRecord, size: c_uint) where F: Fn(&[HiSysEventRecord]) + Send + Sync + 'static,307 unsafe extern "C" fn on_query_callback<F>(callback: *mut c_void, records: *const HiSysEventRecord,
308 size: c_uint)
309 where
310 F: Fn(&[HiSysEventRecord]) + Send + Sync + 'static,
311 {
312 let mut transalted_records: Vec<HiSysEventRecord> = vec![];
313 for i in 0..size {
314 let record_item = unsafe {
315 GetHiSysEventRecordByIndexWrapper(records, size, i as c_uint)
316 };
317 transalted_records.push(record_item);
318 }
319 let callback = (callback as *const F).as_ref().unwrap();
320 callback(transalted_records.as_slice());
321 }
322
323 /// Callback when event quering finish.
324 ///
325 /// # Safety
326 ///
327 /// The callback parameter will be kept valid during native
328 /// HiSysEventRustQuerierC object lifetime.
329 ///
on_complete_callback<F>(callback: *mut c_void, reason: c_int, total: c_int) where F: Fn(i32, i32) + Send + Sync + 'static,330 unsafe extern "C" fn on_complete_callback<F>(callback: *mut c_void, reason: c_int,
331 total: c_int)
332 where
333 F: Fn(i32, i32) + Send + Sync + 'static,
334 {
335 let callback = (callback as *const F).as_ref().unwrap();
336 callback(reason, total);
337 }
338
339 /// free memories allocated for Querier
try_to_recycle(&self)340 pub fn try_to_recycle(&self) {
341 unsafe {
342 RecycleRustEventQuerier(self.as_raw())
343 }
344 }
345 }
346
347 /// Implement trait AsRawPtr for Querier
348 ///
349 /// # Safety
350 ///
351 /// A `Querier` is always constructed with a valid raw pointer
352 /// to a `HiSysEventRustQuerierC`.
353 ///
354 unsafe impl AsRawPtr<HiSysEventRustQuerierC> for Querier {
as_raw(&self) -> *const HiSysEventRustQuerierC355 fn as_raw(&self) -> *const HiSysEventRustQuerierC {
356 self.native
357 }
358
as_mut_raw(&mut self) -> *mut HiSysEventRustQuerierC359 fn as_mut_raw(&mut self) -> *mut HiSysEventRustQuerierC {
360 self.native
361 }
362 }
363
364 /// Query system event.
query(query_arg: &QueryArg, query_rules: &[QueryRule], querier: &Querier) -> i32365 pub(crate) fn query(query_arg: &QueryArg, query_rules: &[QueryRule], querier: &Querier) -> i32 {
366 let query_arg_wrapper = HiSysEventQueryArg {
367 begin_time: query_arg.begin_time as c_longlong,
368 end_time: query_arg.end_time as c_longlong,
369 max_events: query_arg.max_events as c_int,
370 };
371 let mut query_rules_wrapper: Vec<HiSysEventQueryRuleWrapper> = vec![];
372 for i in 0..query_rules.len() {
373 let condition_wrapper = CString::new(query_rules[i].condition).expect("Need a condition for query.");
374 query_rules_wrapper.push(HiSysEventQueryRuleWrapper {
375 domain: [0; MAX_LENGTH_OF_EVENT_DOMAIN],
376 event_list: [0; MAX_EVENT_LIST_LEN],
377 event_list_size: MAX_NUMBER_OF_EVENT_LIST as c_uint,
378 condition: condition_wrapper.as_ptr() as *const c_char,
379 });
380 crate::utils::trans_slice_to_array(query_rules[i].domain, &mut query_rules_wrapper[i].domain);
381 let src_len = query_rules[i].event_list.len();
382 let dest_len = query_rules_wrapper[i].event_list.len();
383 let total_cnt = if src_len <= dest_len {
384 src_len
385 } else {
386 dest_len
387 };
388 query_rules_wrapper[i].event_list_size = total_cnt as c_uint;
389 let src_str = query_rules[i].event_list.join("|");
390 let src_str = &src_str[..];
391 crate::utils::trans_slice_to_array(src_str, &mut query_rules_wrapper[i].event_list);
392 }
393 // Safty: call C ffi border function, all risks are under control.
394 unsafe {
395 HiSysEventQueryWrapper(&query_arg_wrapper as *const HiSysEventQueryArg,
396 query_rules_wrapper.as_mut_ptr(),
397 query_rules.len() as c_uint,
398 querier.as_raw(),
399 )
400 }
401 }
402
403 /// Callback when receive system event.
404 pub type OnEvent = unsafe extern "C" fn (
405 callback: *mut c_void,
406 record: HiSysEventRecord
407 );
408
409 /// Callback when hisysevent service shutdown.
410 pub type OnServiceDied = unsafe extern "C" fn (
411 callback: *mut c_void,
412 );
413
414 /// This type represent a rust HiSysEventWatcher which like C++ HiSysEventWatcher.
415 #[repr(C)]
416 struct HiSysEventRustWatcherC {
417 pub on_event_cb: *mut c_void,
418 pub on_event_wrapper_cb: OnEvent,
419 pub on_service_died_cb: *mut c_void,
420 pub on_service_died_wrapper_cb: OnServiceDied,
421 }
422
423 /// This type represent a rust interfaces.
424 #[allow(dead_code)]
425 pub struct Watcher {
426 /// Native event listener instance
427 native: *mut HiSysEventRustWatcherC,
428
429 /// Customized rust callback on event
430 on_event_callback: *mut c_void,
431
432 /// Customized rust callback on service died
433 on_service_died_callback: *mut c_void,
434 }
435
436 impl Watcher {
437 /// Create a rust HiSysEventRustWatcherC object with callbacks in a watcher.
new<F1, F2>(on_event_callback: F1, on_service_died_callback: F2) -> Option<Self> where F1: Fn(HiSysEventRecord) + Send + Sync + 'static, F2: Fn() + Send + Sync + 'static,438 pub fn new<F1, F2>(on_event_callback: F1, on_service_died_callback: F2) -> Option<Self>
439 where
440 F1: Fn(HiSysEventRecord) + Send + Sync + 'static,
441 F2: Fn() + Send + Sync + 'static,
442 {
443 let on_event_callback = Box::into_raw(Box::new(on_event_callback));
444 let on_service_died_callback = Box::into_raw(Box::new(on_service_died_callback));
445 let native = unsafe {
446 CreateRustEventWatcher(on_event_callback as *mut c_void, Self::on_event::<F1>,
447 on_service_died_callback as *mut c_void, Self::on_service_died::<F2>)
448 };
449 if native.is_null() {
450 None
451 } else {
452 Some(Self {
453 native,
454 on_event_callback: on_event_callback as *mut c_void,
455 on_service_died_callback: on_service_died_callback as *mut c_void,
456 })
457 }
458 }
459
460 /// Callback when receive system event.
461 ///
462 /// # Safety
463 ///
464 /// The callback parameter will be kept valid during native
465 /// HiSysEventRustWatcherC object lifetime.
466 ///
on_event<F>(callback: *mut c_void, record: HiSysEventRecord) where F: Fn(HiSysEventRecord) + Send + Sync + 'static,467 unsafe extern "C" fn on_event<F>(callback: *mut c_void, record: HiSysEventRecord)
468 where
469 F: Fn(HiSysEventRecord) + Send + Sync + 'static,
470 {
471 let callback = (callback as *const F).as_ref().unwrap();
472 callback(record);
473 }
474
475 /// Callback when hisysevent service shutdown.
476 ///
477 /// # Safety
478 ///
479 /// The callback parameter will be kept valid during native
480 /// HiSysEventRustWatcherC object lifetime.
481 ///
on_service_died<F>(callback: *mut c_void) where F: Fn() + Send + Sync + 'static,482 unsafe extern "C" fn on_service_died<F>(callback: *mut c_void)
483 where
484 F: Fn() + Send + Sync + 'static,
485 {
486 let callback = (callback as *const F).as_ref().unwrap();
487 callback();
488 }
489
490 /// free memories allocated for Watcher
try_to_recycle(&self)491 pub fn try_to_recycle(&self) {
492 unsafe {
493 RecycleRustEventWatcher(self.as_raw())
494 }
495 }
496 }
497
498 /// Implement trait AsRawPtr for Watcher
499 ///
500 /// # Safety
501 ///
502 /// A `Watcher` is always constructed with a valid raw pointer
503 /// to a `HiSysEventRustWatcherC`.
504 ///
505 unsafe impl AsRawPtr<HiSysEventRustWatcherC> for Watcher {
as_raw(&self) -> *const HiSysEventRustWatcherC506 fn as_raw(&self) -> *const HiSysEventRustWatcherC {
507 self.native
508 }
509
as_mut_raw(&mut self) -> *mut HiSysEventRustWatcherC510 fn as_mut_raw(&mut self) -> *mut HiSysEventRustWatcherC {
511 self.native
512 }
513 }
514
515 /// Add watcher to watch system event.
add_watcher(watcher: &Watcher, watch_rules: &[WatchRule]) -> i32516 pub(crate) fn add_watcher(watcher: &Watcher, watch_rules: &[WatchRule]) -> i32 {
517 let mut watch_rules_wrapper: Vec<HiSysEventWatchRule> = vec![];
518 for i in 0..watch_rules.len() {
519 watch_rules_wrapper.push(HiSysEventWatchRule {
520 domain: [0; MAX_LENGTH_OF_EVENT_DOMAIN],
521 name: [0; MAX_LENGTH_OF_EVENT_NAME],
522 tag: [0; MAX_LENGTH_OF_EVENT_TAG],
523 rule_type: 0,
524 event_type: 0,
525 });
526 crate::utils::trans_slice_to_array(watch_rules[i].domain, &mut watch_rules_wrapper[i].domain);
527 crate::utils::trans_slice_to_array(watch_rules[i].name, &mut watch_rules_wrapper[i].name);
528 crate::utils::trans_slice_to_array(watch_rules[i].tag, &mut watch_rules_wrapper[i].tag);
529 watch_rules_wrapper[i].rule_type = watch_rules[i].rule_type as i32 as c_int;
530 watch_rules_wrapper[i].event_type = watch_rules[i].event_type as i32 as c_int;
531 }
532 // Safty: call C ffi border function, all risks are under control.
533 unsafe {
534 HiSysEventAddWatcherWrapper(watcher.as_raw(),
535 watch_rules_wrapper.as_mut_ptr(),
536 watch_rules.len() as c_uint)
537 }
538 }
539
540 /// Remove watcher.
remove_watcher(watcher: &Watcher) -> i32541 pub(crate) fn remove_watcher(watcher: &Watcher) -> i32 {
542 // Safty: call C ffi border function, all risks are under control.
543 unsafe {
544 HiSysEventRemoveWatcherWrapper(watcher.as_raw())
545 }
546 }
547
548 /// Trait for transparent Rust wrappers around native raw pointer types.
549 ///
550 /// # Safety
551 ///
552 /// The pointer return by this trait's methods should be immediately passed to
553 /// native and not stored by Rust. The pointer is valid only as long as the
554 /// underlying native object is alive, so users must be careful to take this into
555 /// account, as Rust cannot enforce this.
556 ///
557 /// For this trait to be a correct implementation, `T` must be a valid native
558 /// type. Since we cannot constrain this via the type system, this trait is
559 /// marked as unsafe.
560 ///
561 unsafe trait AsRawPtr<T> {
562 /// Return a pointer to the native version of `self`
as_raw(&self) -> *const T563 fn as_raw(&self) -> *const T;
564
565 /// Return a mutable pointer to the native version of `self`
as_mut_raw(&mut self) -> *mut T566 fn as_mut_raw(&mut self) -> *mut T;
567 }
568
569 extern "C" {
570 /// ffi border function.
HiSysEventAddWatcherWrapper(watcher: *const HiSysEventRustWatcherC, rules: *const HiSysEventWatchRule, rule_size: c_uint) -> c_int571 fn HiSysEventAddWatcherWrapper(watcher: *const HiSysEventRustWatcherC, rules: *const HiSysEventWatchRule,
572 rule_size: c_uint) -> c_int;
573
574 /// ffi border function.
HiSysEventRemoveWatcherWrapper(watcher: *const HiSysEventRustWatcherC) -> c_int575 fn HiSysEventRemoveWatcherWrapper(watcher: *const HiSysEventRustWatcherC) -> c_int;
576
577 /// ffi border function.
HiSysEventQueryWrapper(query_arg: *const HiSysEventQueryArg, rules: *const HiSysEventQueryRuleWrapper, rule_size: c_uint, querier: *const HiSysEventRustQuerierC) -> c_int578 fn HiSysEventQueryWrapper(query_arg: *const HiSysEventQueryArg, rules: *const HiSysEventQueryRuleWrapper,
579 rule_size: c_uint, querier: *const HiSysEventRustQuerierC) -> c_int;
580
581 /// ffi border function.
GetHiSysEventRecordByIndexWrapper(records: *const HiSysEventRecord, total: c_uint, index: c_uint) -> HiSysEventRecord582 fn GetHiSysEventRecordByIndexWrapper(records: *const HiSysEventRecord, total: c_uint,
583 index: c_uint) -> HiSysEventRecord;
584
585 /// ffi border function.
CreateRustEventWatcher(on_event_callback: *const c_void, on_event_wrapper_callback: OnEvent, on_service_died_callback: *const c_void, on_service_died_wrapper_callback: OnServiceDied) -> *mut HiSysEventRustWatcherC586 fn CreateRustEventWatcher(on_event_callback: *const c_void,
587 on_event_wrapper_callback: OnEvent,
588 on_service_died_callback: *const c_void,
589 on_service_died_wrapper_callback: OnServiceDied) -> *mut HiSysEventRustWatcherC;
590
591 /// ffi border function.
RecycleRustEventWatcher(watcher: *const HiSysEventRustWatcherC)592 fn RecycleRustEventWatcher(watcher: *const HiSysEventRustWatcherC);
593
594 /// ffi border function.
CreateRustEventQuerier(on_query_callback: *const c_void, on_query_wrapper_callback: OnQuery, on_complete_callback: *const c_void, on_complete_wrapper_callback: OnComplete) -> *mut HiSysEventRustQuerierC595 fn CreateRustEventQuerier(on_query_callback: *const c_void,
596 on_query_wrapper_callback: OnQuery,
597 on_complete_callback: *const c_void,
598 on_complete_wrapper_callback: OnComplete) -> *mut HiSysEventRustQuerierC;
599
600 /// ffi border function.
RecycleRustEventQuerier(querier: *const HiSysEventRustQuerierC)601 fn RecycleRustEventQuerier(querier: *const HiSysEventRustQuerierC);
602 }
603