1570af302Sopenharmony_ci/*
2570af302Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd.
3570af302Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4570af302Sopenharmony_ci * you may not use this file except in compliance with the License.
5570af302Sopenharmony_ci * You may obtain a copy of the License at
6570af302Sopenharmony_ci *
7570af302Sopenharmony_ci *    http://www.apache.org/licenses/LICENSE-2.0
8570af302Sopenharmony_ci *
9570af302Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10570af302Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11570af302Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12570af302Sopenharmony_ci * See the License for the specific language governing permissions and
13570af302Sopenharmony_ci * limitations under the License.
14570af302Sopenharmony_ci */
15570af302Sopenharmony_ci
16570af302Sopenharmony_ci#include <stdio.h>
17570af302Sopenharmony_ci#include <malloc.h>
18570af302Sopenharmony_ci#include <stdlib.h>
19570af302Sopenharmony_ci#include <pthread.h>
20570af302Sopenharmony_ci#include <stdint.h>
21570af302Sopenharmony_ci#include <memory.h>
22570af302Sopenharmony_ci#include <unistd.h>
23570af302Sopenharmony_ci
24570af302Sopenharmony_ci#include "test-malloc-api-common.h"
25570af302Sopenharmony_ci
26570af302Sopenharmony_ci#define BARRIER_HEIGHT 2
27570af302Sopenharmony_ci
28570af302Sopenharmony_cipthread_barrier_t routine_disabled;
29570af302Sopenharmony_cipthread_barrier_t routine_allocated;
30570af302Sopenharmony_ci
31570af302Sopenharmony_ciconst size_t SLEEP_TIME_SECONDS = 2;
32570af302Sopenharmony_ci
33570af302Sopenharmony_civoid *disable_routine(void *vargp)
34570af302Sopenharmony_ci{
35570af302Sopenharmony_ci	malloc_disable();
36570af302Sopenharmony_ci	pthread_barrier_wait(&routine_disabled);
37570af302Sopenharmony_ci	sleep(SLEEP_TIME_SECONDS);
38570af302Sopenharmony_ci	malloc_enable();
39570af302Sopenharmony_ci	pthread_barrier_wait(&routine_allocated);
40570af302Sopenharmony_ci	return NULL;
41570af302Sopenharmony_ci}
42570af302Sopenharmony_ci
43570af302Sopenharmony_ciint test_malloc_while_disabled(void)
44570af302Sopenharmony_ci{
45570af302Sopenharmony_ci	int ret = 0;
46570af302Sopenharmony_ci	pthread_barrier_init(&routine_disabled, NULL, BARRIER_HEIGHT);
47570af302Sopenharmony_ci	pthread_barrier_init(&routine_allocated, NULL, BARRIER_HEIGHT);
48570af302Sopenharmony_ci	pthread_t thread_id;
49570af302Sopenharmony_ci	pthread_create(&thread_id, NULL, disable_routine, NULL);
50570af302Sopenharmony_ci	pthread_barrier_wait(&routine_disabled);
51570af302Sopenharmony_ci	time_t start = time(0);
52570af302Sopenharmony_ci	int *x = malloc(sizeof(int));
53570af302Sopenharmony_ci	time_t end = time(0);
54570af302Sopenharmony_ci	pthread_barrier_wait(&routine_allocated);
55570af302Sopenharmony_ci	size_t seconds = end - start;
56570af302Sopenharmony_ci	if (seconds < SLEEP_TIME_SECONDS) {
57570af302Sopenharmony_ci		ret = -1;
58570af302Sopenharmony_ci	}
59570af302Sopenharmony_ci	free(x);
60570af302Sopenharmony_ci	pthread_join(thread_id, NULL);
61570af302Sopenharmony_ci
62570af302Sopenharmony_ci	return ret;
63570af302Sopenharmony_ci}
64570af302Sopenharmony_ci
65570af302Sopenharmony_ciint main()
66570af302Sopenharmony_ci{
67570af302Sopenharmony_ci	int ret = 0;
68570af302Sopenharmony_ci
69570af302Sopenharmony_ci	ret = check_and_report("Testing malloc while disabled", test_malloc_while_disabled);
70570af302Sopenharmony_ci
71570af302Sopenharmony_ci	return ret;
72570af302Sopenharmony_ci}
73