From d1a9c84a6b375cb25a8b7475957130e364b41753 Mon Sep 17 00:00:00 2001 From: Garrett D'Amore Date: Mon, 2 Jul 2018 22:36:08 -0700 Subject: fixes #572 Several locking errors found fixes #573 atomic flags could help This introduces a new atomic flag, and reduces some of the global locking. The lock refactoring work is not yet complete, but this is a positive step forward, and should help with certain things. While here we also fixed a compile warning due to incorrect types. --- src/platform/windows/win_impl.h | 4 ++++ src/platform/windows/win_thread.c | 12 ++++++++++++ 2 files changed, 16 insertions(+) (limited to 'src/platform/windows') diff --git a/src/platform/windows/win_impl.h b/src/platform/windows/win_impl.h index 0bd12b24..73dc3660 100644 --- a/src/platform/windows/win_impl.h +++ b/src/platform/windows/win_impl.h @@ -48,6 +48,10 @@ struct nni_plat_cv { PSRWLOCK srl; }; +struct nni_atomic_flag { + unsigned f; +}; + // nni_win_event is used with io completion ports. This allows us to get // to a specific completion callback without requiring the poller (in the // completion port) to know anything about the event itself. We also use diff --git a/src/platform/windows/win_thread.c b/src/platform/windows/win_thread.c index a3d932aa..243811a0 100644 --- a/src/platform/windows/win_thread.c +++ b/src/platform/windows/win_thread.c @@ -103,6 +103,18 @@ nni_plat_cv_fini(nni_plat_cv *cv) NNI_ARG_UNUSED(cv); } +bool +nni_atomic_flag_test_and_set(nni_atomic_flag *f) +{ + return (InterlockedExchange(&f->f, 1) != 0); +} + +void +nni_atomic_flag_reset(nni_atomic_flag *f) +{ + InterlockedExchange(&f->f, 0); +} + static unsigned int __stdcall nni_plat_thr_main(void *arg) { nni_plat_thr *thr = arg; -- cgit v1.2.3-70-g09d2