1*51c0b2f7Stbbdev /*
2*51c0b2f7Stbbdev     Copyright (c) 2018-2020 Intel Corporation
3*51c0b2f7Stbbdev 
4*51c0b2f7Stbbdev     Licensed under the Apache License, Version 2.0 (the "License");
5*51c0b2f7Stbbdev     you may not use this file except in compliance with the License.
6*51c0b2f7Stbbdev     You may obtain a copy of the License at
7*51c0b2f7Stbbdev 
8*51c0b2f7Stbbdev         http://www.apache.org/licenses/LICENSE-2.0
9*51c0b2f7Stbbdev 
10*51c0b2f7Stbbdev     Unless required by applicable law or agreed to in writing, software
11*51c0b2f7Stbbdev     distributed under the License is distributed on an "AS IS" BASIS,
12*51c0b2f7Stbbdev     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*51c0b2f7Stbbdev     See the License for the specific language governing permissions and
14*51c0b2f7Stbbdev     limitations under the License.
15*51c0b2f7Stbbdev */
16*51c0b2f7Stbbdev 
17*51c0b2f7Stbbdev #define __TBB_NO_IMPLICIT_LINKAGE 1
18*51c0b2f7Stbbdev 
19*51c0b2f7Stbbdev #include "common/test.h"
20*51c0b2f7Stbbdev 
21*51c0b2f7Stbbdev #include "common/allocator_overload.h"
22*51c0b2f7Stbbdev #include "common/utils_report.h"
23*51c0b2f7Stbbdev #include "common/utils_env.h"
24*51c0b2f7Stbbdev 
25*51c0b2f7Stbbdev // Disabling malloc proxy via env variable is available only on Windows for now
26*51c0b2f7Stbbdev #if MALLOC_WINDOWS_OVERLOAD_ENABLED
27*51c0b2f7Stbbdev 
28*51c0b2f7Stbbdev #define TEST_SYSTEM_COMMAND "test_malloc_overload_disable.exe"
29*51c0b2f7Stbbdev 
30*51c0b2f7Stbbdev #include "tbb/tbbmalloc_proxy.h"
31*51c0b2f7Stbbdev 
32*51c0b2f7Stbbdev #include "../src/tbb/environment.h"
33*51c0b2f7Stbbdev 
34*51c0b2f7Stbbdev const size_t SmallObjectSize = 16;
35*51c0b2f7Stbbdev const size_t LargeObjectSize = 2*8*1024;
36*51c0b2f7Stbbdev const size_t HugeObjectSize = 2*1024*1024;
37*51c0b2f7Stbbdev 
38*51c0b2f7Stbbdev void CheckWindowsProxyDisablingViaMemSize( size_t ObjectSize ) {
39*51c0b2f7Stbbdev     void* ptr = malloc(ObjectSize);
40*51c0b2f7Stbbdev     /*
41*51c0b2f7Stbbdev      * If msize returns 0 - tbbmalloc doesn't contain this object in it`s memory
42*51c0b2f7Stbbdev      * Also msize check that proxy lib is linked
43*51c0b2f7Stbbdev      */
44*51c0b2f7Stbbdev     REQUIRE_MESSAGE(!__TBB_malloc_safer_msize(ptr,NULL), "Malloc replacement is not deactivated");
45*51c0b2f7Stbbdev     free(ptr);
46*51c0b2f7Stbbdev }
47*51c0b2f7Stbbdev 
48*51c0b2f7Stbbdev TEST_CASE("Disabling malloc overload") {
49*51c0b2f7Stbbdev     if (!tbb::detail::r1::GetBoolEnvironmentVariable("TBB_MALLOC_DISABLE_REPLACEMENT"))
50*51c0b2f7Stbbdev     {
51*51c0b2f7Stbbdev         utils::SetEnv("TBB_MALLOC_DISABLE_REPLACEMENT","1");
52*51c0b2f7Stbbdev         if ((system(TEST_SYSTEM_COMMAND)) != 0) {
53*51c0b2f7Stbbdev             REPORT("Test error: unable to run the command: %s", TEST_SYSTEM_COMMAND);
54*51c0b2f7Stbbdev             exit(-1);
55*51c0b2f7Stbbdev         }
56*51c0b2f7Stbbdev         // We must execute exit(0) to avoid duplicate "Done" printing.
57*51c0b2f7Stbbdev         exit(0);
58*51c0b2f7Stbbdev     }
59*51c0b2f7Stbbdev     else
60*51c0b2f7Stbbdev     {
61*51c0b2f7Stbbdev         // Check SMALL objects replacement disable
62*51c0b2f7Stbbdev         CheckWindowsProxyDisablingViaMemSize(SmallObjectSize);
63*51c0b2f7Stbbdev         // Check LARGE objects replacement disable
64*51c0b2f7Stbbdev         CheckWindowsProxyDisablingViaMemSize(LargeObjectSize);
65*51c0b2f7Stbbdev         // Check HUGE objects replacement disable
66*51c0b2f7Stbbdev         CheckWindowsProxyDisablingViaMemSize(HugeObjectSize);
67*51c0b2f7Stbbdev     }
68*51c0b2f7Stbbdev }
69*51c0b2f7Stbbdev #endif // MALLOC_WINDOWS_OVERLOAD_ENABLED
70