xref: /test/xts/acts/kernel_lite/utils/mt_utils.h (revision f6603c60)
1/*
2 * Copyright (c) 2021 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// utils for multi-thread and multi-process test
17
18#ifndef KERNEL_LITE_MT_UTILS
19#define KERNEL_LITE_MT_UTILS
20
21#include <stdint.h>
22
23// count all primes numbers below 'maxNumber', used for keep cpu busy
24int CountPrimes(uint32_t maxNumber);
25
26/**
27 * desc:   keep cpu run for 'ms' miliseconds, without any syscall or pend operation
28 * input:  miliseconds value, only some specific value is supported, as below:
29 *         -- 10, 20, 30, 60, 100, 150, 200, 300, 400, 600, 1000, 2000
30 * output: useless, only used for avoid the whole function is optimized by gcc
31 * note:   the actual elasped time is not so accurate
32 */
33int BusyRun(uint32_t ms);
34
35/**
36 * desc:   used for check if the code is runned as expected, in multi-thread or multi-process scenario
37 * input:  step -- from 1 to 15(0xf).
38 * output: the actual steps the this function is called.
39 Example:
40    LOG("step=%lx", CheckStep(1));  // may called in thread 1
41    LOG("step=%lx", CheckStep(2));  // may called in thread 2
42    LOG("step=%lx", CheckStep(3));  // may called in thread 3
43    LOG("step=%lx", CheckStep(4));  // may called in thread 2
44    uint64_t step = CheckStep(5);   // may called in thread 1
45    if (step == 0x12345) {
46        LOG("everything is ok");
47    } else {
48        LOG("code not run as expected!");
49    }
50 Output:
51    step=1
52    step=12
53    step=123
54    step=1234
55    everything is ok
56 */
57uint64_t CheckStep(int step);
58
59
60/**
61 * desc:  used for synchronize in multi-process scenario, not suitable for multi-thread.
62 * usage:
63 InitPipe();
64 fork();
65 if parent:
66    ...
67    BlockOnPipe();  // will block until UnBlockPipe is called in another process.
68    ...
69 if child:
70    ...
71    UnBlockPipe();
72    ...
73 */
74// return -1 if pipe-init failed, user should check return code
75int InitPipe();
76void BlockOnPipe();
77void UnBlockPipe();
78
79/**
80 * desc:    get and set a global variable, can be used in multi-process scenario
81 * usage:
82 *    InitGlobalVariable();
83 *    fork();
84 *    if child:
85 *        ...
86 *        SetGlobalVariable(x);
87 *        ...
88 *    if parent:
89 *        ...
90 *        SetGlobalVariable(y);
91 *        ...
92 *        int i = GetGlobalVariable();
93 *        // check if i is ok
94 *        ...
95 *    DeleteGlobalVariable(); // Call before exit
96 *    exit...
97 */
98// output:  return -1 if the operation fails, user should check return code
99int InitGlobalVariable();
100// return -1 if the operation fails
101int SetGlobalVariable(int value);
102// return -1 if the operation fails.
103int GetGlobalVariable();
104// return -1 if the operation fails
105int DeleteGlobalVariable();
106
107#endif
108