1 // The MIT License (MIT) 2 // 3 // Copyright (c) 2015 Sergey Makeev, Vadim Slyusarev 4 // 5 // Permission is hereby granted, free of charge, to any person obtaining a copy 6 // of this software and associated documentation files (the "Software"), to deal 7 // in the Software without restriction, including without limitation the rights 8 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 // copies of the Software, and to permit persons to whom the Software is 10 // furnished to do so, subject to the following conditions: 11 // 12 // The above copyright notice and this permission notice shall be included in 13 // all copies or substantial portions of the Software. 14 // 15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 // THE SOFTWARE. 22 23 #include "Tests.h" 24 #include <UnitTest++.h> 25 #include <MTScheduler.h> 26 27 #ifdef MT_THREAD_SANITIZER 28 #define SMALLEST_STACK_SIZE (566656) 29 #else 30 #define SMALLEST_STACK_SIZE (32768) 31 #endif 32 33 int64 startTime = 0; 34 int64 endTime = 0; 35 36 37 SUITE(FiberTests) 38 { 39 MT::Atomic32<int32> counter(0); 40 MT::Fiber* fiberMain = nullptr; 41 42 void FiberFunc( void* userData ) 43 { 44 CHECK_EQUAL(0, counter.Load()); 45 counter.IncFetch(); 46 47 MT::Fiber* currentFiber = (MT::Fiber*)userData; 48 MT::Fiber::SwitchTo(*currentFiber, *fiberMain); 49 50 CHECK_EQUAL(2, counter.Load()); 51 counter.IncFetch(); 52 53 MT::Fiber::SwitchTo(*currentFiber, *fiberMain); 54 } 55 56 void FiberMain(void* userData) 57 { 58 endTime = MT::GetTimeMicroSeconds(); 59 uint32 microsecondsFromThreadToFiber = (uint32)(endTime - startTime); 60 printf("%d us to convert from thread to fiber\n", microsecondsFromThreadToFiber); 61 62 MT_UNUSED(userData); 63 64 MT::Fiber fiber1; 65 66 fiber1.Create(SMALLEST_STACK_SIZE, FiberFunc, &fiber1); 67 68 MT::Fiber::SwitchTo(*fiberMain, fiber1); 69 70 CHECK_EQUAL(1, counter.Load()); 71 counter.IncFetch(); 72 73 MT::Fiber::SwitchTo(*fiberMain, fiber1); 74 75 CHECK_EQUAL(3, counter.Load()); 76 77 fiberMain = nullptr; 78 } 79 80 81 82 TEST(FiberSimpleTest) 83 { 84 // Two fibers from same thread 85 MT::Fiber fiber1; 86 fiberMain = &fiber1; 87 counter.Store(0); 88 startTime = MT::GetTimeMicroSeconds(); 89 fiberMain->CreateFromCurrentThreadAndRun(FiberMain, nullptr); 90 91 // CreateFromCurrentThreadAndRun from same fiber called twice for same fiber 92 fiberMain = &fiber1; 93 counter.Store(0); 94 startTime = MT::GetTimeMicroSeconds(); 95 fiberMain->CreateFromCurrentThreadAndRun(FiberMain, nullptr); 96 97 98 MT::Fiber fiber2; 99 fiberMain = &fiber2; 100 counter.Store(0); 101 startTime = MT::GetTimeMicroSeconds(); 102 fiberMain->CreateFromCurrentThreadAndRun(FiberMain, nullptr); 103 } 104 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 105 } 106