| 3249 | } |
| 3250 | |
| 3251 | inline void testThreading (choc::test::TestProgress& progress) |
| 3252 | { |
| 3253 | CHOC_CATEGORY (Threading); |
| 3254 | |
| 3255 | { |
| 3256 | CHOC_TEST (TaskThread) |
| 3257 | |
| 3258 | choc::threading::TaskThread tt1, tt2; |
| 3259 | std::atomic<int> numCallbacks1 { 0 }, numCallbacks2 { 0 }; |
| 3260 | |
| 3261 | tt1.start (std::chrono::milliseconds (100), [&] { ++numCallbacks1; }); |
| 3262 | tt2.start (0, [&] { ++numCallbacks2; }); |
| 3263 | |
| 3264 | std::this_thread::sleep_for (std::chrono::milliseconds (50)); |
| 3265 | CHOC_EXPECT_EQ (0, numCallbacks2.load()); |
| 3266 | tt2.trigger(); |
| 3267 | |
| 3268 | for (int i = 0;; ++i) |
| 3269 | { |
| 3270 | std::this_thread::sleep_for (std::chrono::milliseconds (5)); |
| 3271 | |
| 3272 | if (numCallbacks1 == 3 && numCallbacks2 == 1) |
| 3273 | break; |
| 3274 | |
| 3275 | if (i > 500) |
| 3276 | CHOC_FAIL ("Expected some callbacks"); |
| 3277 | } |
| 3278 | |
| 3279 | CHOC_EXPECT_EQ (1, numCallbacks2.load()); |
| 3280 | } |
| 3281 | |
| 3282 | { |
| 3283 | CHOC_TEST (ThreadSafeFunctor) |
| 3284 | |
| 3285 | { |
| 3286 | choc::threading::ThreadSafeFunctor<std::function<void(int)>> tsf; |
| 3287 | |
| 3288 | int result = 0; |
| 3289 | CHOC_EXPECT_FALSE (tsf); |
| 3290 | tsf = [&] (int x) { result = x; }; |
| 3291 | CHOC_EXPECT_TRUE (tsf); |
| 3292 | CHOC_EXPECT_TRUE (tsf (2)); |
| 3293 | tsf.reset(); |
| 3294 | CHOC_EXPECT_FALSE (tsf (3)); |
| 3295 | CHOC_EXPECT_EQ (result, 2); |
| 3296 | } |
| 3297 | |
| 3298 | { |
| 3299 | choc::threading::ThreadSafeFunctor<std::function<void(size_t, size_t&)>> factorial; |
| 3300 | |
| 3301 | factorial = [&] (size_t n, size_t& out) |
| 3302 | { |
| 3303 | if (n == 1) |
| 3304 | { |
| 3305 | out = 1; |
| 3306 | return; |
| 3307 | } |
| 3308 | |