1800b99b8Sopenharmony_ci/* 2800b99b8Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3800b99b8Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4800b99b8Sopenharmony_ci * you may not use this file except in compliance with the License. 5800b99b8Sopenharmony_ci * You may obtain a copy of the License at 6800b99b8Sopenharmony_ci * 7800b99b8Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8800b99b8Sopenharmony_ci * 9800b99b8Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10800b99b8Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11800b99b8Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12800b99b8Sopenharmony_ci * See the License for the specific language governing permissions and 13800b99b8Sopenharmony_ci * limitations under the License. 14800b99b8Sopenharmony_ci */ 15800b99b8Sopenharmony_ci 16800b99b8Sopenharmony_ci#include "multithread_constructor.h" 17800b99b8Sopenharmony_ci 18800b99b8Sopenharmony_ci#include <pthread.h> 19800b99b8Sopenharmony_ci#include <signal.h> 20800b99b8Sopenharmony_ci#include <stdio.h> 21800b99b8Sopenharmony_ci#include <unistd.h> 22800b99b8Sopenharmony_ci#include "stdio.h" 23800b99b8Sopenharmony_ci#include "stdlib.h" 24800b99b8Sopenharmony_ci 25800b99b8Sopenharmony_ciconst static unsigned int SLEEP_TIMEOUT = 360000; 26800b99b8Sopenharmony_ci 27800b99b8Sopenharmony_cistatic void CreateThread(int *argv) 28800b99b8Sopenharmony_ci{ 29800b99b8Sopenharmony_ci int threadID = *argv; 30800b99b8Sopenharmony_ci printf("create MultiThread %d\n", threadID); 31800b99b8Sopenharmony_ci TestFunc1(); 32800b99b8Sopenharmony_ci return; 33800b99b8Sopenharmony_ci} 34800b99b8Sopenharmony_ci 35800b99b8Sopenharmony_cistatic void CreateThreadForCrash(const int *argv) 36800b99b8Sopenharmony_ci{ 37800b99b8Sopenharmony_ci int threadID = *argv; 38800b99b8Sopenharmony_ci printf("create ThreadForCrash %d\n", threadID); 39800b99b8Sopenharmony_ci int ret = raise(SIGSEGV); 40800b99b8Sopenharmony_ci if (ret != 0) { 41800b99b8Sopenharmony_ci printf("remove failed!"); 42800b99b8Sopenharmony_ci } 43800b99b8Sopenharmony_ci return; 44800b99b8Sopenharmony_ci} 45800b99b8Sopenharmony_ci 46800b99b8Sopenharmony_ciNOINLINE int MultiThreadConstructor(const int threadNum) 47800b99b8Sopenharmony_ci{ 48800b99b8Sopenharmony_ci pthread_t t[threadNum]; 49800b99b8Sopenharmony_ci int threadID[threadNum]; 50800b99b8Sopenharmony_ci 51800b99b8Sopenharmony_ci for (int i = 0; i < threadNum; ++i) { 52800b99b8Sopenharmony_ci threadID[i] = i; 53800b99b8Sopenharmony_ci pthread_create(&t[i], NULL, (void *(*)(void *))CreateThread, &threadID[i]); 54800b99b8Sopenharmony_ci pthread_detach(t[i]); 55800b99b8Sopenharmony_ci } 56800b99b8Sopenharmony_ci 57800b99b8Sopenharmony_ci while (1) { 58800b99b8Sopenharmony_ci continue; 59800b99b8Sopenharmony_ci } 60800b99b8Sopenharmony_ci 61800b99b8Sopenharmony_ci return 0; 62800b99b8Sopenharmony_ci} 63800b99b8Sopenharmony_ci 64800b99b8Sopenharmony_ciNOINLINE int MultiThreadConstructorForThreadCrash(const int threadNum) 65800b99b8Sopenharmony_ci{ 66800b99b8Sopenharmony_ci pthread_t t[threadNum]; 67800b99b8Sopenharmony_ci int threadID[threadNum]; 68800b99b8Sopenharmony_ci pthread_t threadCrash; 69800b99b8Sopenharmony_ci int threadIDCrash = threadNum; 70800b99b8Sopenharmony_ci 71800b99b8Sopenharmony_ci for (int i = 0; i < threadNum; ++i) { 72800b99b8Sopenharmony_ci threadID[i] = i; 73800b99b8Sopenharmony_ci pthread_create(&t[i], NULL, (void *(*)(void *))CreateThread, &threadID[i]); 74800b99b8Sopenharmony_ci pthread_detach(t[i]); 75800b99b8Sopenharmony_ci } 76800b99b8Sopenharmony_ci pthread_create(&threadCrash, NULL, (void *(*)(void *))CreateThreadForCrash, &threadIDCrash); 77800b99b8Sopenharmony_ci pthread_detach(threadCrash); 78800b99b8Sopenharmony_ci 79800b99b8Sopenharmony_ci sleep(5); // 5 : wait 5s, then exit process 80800b99b8Sopenharmony_ci 81800b99b8Sopenharmony_ci return 0; 82800b99b8Sopenharmony_ci} 83800b99b8Sopenharmony_ci 84800b99b8Sopenharmony_ciNOINLINE int TestFunc70(void) 85800b99b8Sopenharmony_ci{ 86800b99b8Sopenharmony_ci sleep(SLEEP_TIMEOUT); 87800b99b8Sopenharmony_ci return 0; 88800b99b8Sopenharmony_ci} 89800b99b8Sopenharmony_ci 90800b99b8Sopenharmony_ci#ifndef UNITTEST 91800b99b8Sopenharmony_ciint main(int argc, char* argv[]) 92800b99b8Sopenharmony_ci{ 93800b99b8Sopenharmony_ci const int argumentLimit = 2; 94800b99b8Sopenharmony_ci if (argc != argumentLimit) { 95800b99b8Sopenharmony_ci printf("invalid input argument.\n"); 96800b99b8Sopenharmony_ci return 0; 97800b99b8Sopenharmony_ci } 98800b99b8Sopenharmony_ci MultiThreadConstructor(atoi(argv[1])); 99800b99b8Sopenharmony_ci return 0; 100800b99b8Sopenharmony_ci} 101800b99b8Sopenharmony_ci#endif 102800b99b8Sopenharmony_ci 103800b99b8Sopenharmony_ci// auto gen function 104800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(0, 1) 105800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(1, 2) 106800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(2, 3) 107800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(3, 4) 108800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(4, 5) 109800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(5, 6) 110800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(6, 7) 111800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(7, 8) 112800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(8, 9) 113800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(9, 10) 114800b99b8Sopenharmony_ci 115800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(10, 11) 116800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(11, 12) 117800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(12, 13) 118800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(13, 14) 119800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(14, 15) 120800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(15, 16) 121800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(16, 17) 122800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(17, 18) 123800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(18, 19) 124800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(19, 20) 125800b99b8Sopenharmony_ci 126800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(20, 21) 127800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(21, 22) 128800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(22, 23) 129800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(23, 24) 130800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(24, 25) 131800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(25, 26) 132800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(26, 27) 133800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(27, 28) 134800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(28, 29) 135800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(29, 30) 136800b99b8Sopenharmony_ci 137800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(30, 31) 138800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(31, 32) 139800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(32, 33) 140800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(33, 34) 141800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(34, 35) 142800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(35, 36) 143800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(36, 37) 144800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(37, 38) 145800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(38, 39) 146800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(39, 40) 147800b99b8Sopenharmony_ci 148800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(40, 41) 149800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(41, 42) 150800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(42, 43) 151800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(43, 44) 152800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(44, 45) 153800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(45, 46) 154800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(46, 47) 155800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(47, 48) 156800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(48, 49) 157800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(49, 50) 158800b99b8Sopenharmony_ci 159800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(50, 51) 160800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(51, 52) 161800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(52, 53) 162800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(53, 54) 163800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(54, 55) 164800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(55, 56) 165800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(56, 57) 166800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(57, 58) 167800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(58, 59) 168800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(59, 60) 169800b99b8Sopenharmony_ci 170800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(60, 61) 171800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(61, 62) 172800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(62, 63) 173800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(63, 64) 174800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(64, 65) 175800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(65, 66) 176800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(66, 67) 177800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(67, 68) 178800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(68, 69) 179800b99b8Sopenharmony_ciGEN_TEST_FUNCTION(69, 70) 180