aboutsummaryrefslogtreecommitdiff
path: root/src/platform/windows
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform/windows')
-rw-r--r--src/platform/windows/win_impl.h4
-rw-r--r--src/platform/windows/win_thread.c38
2 files changed, 42 insertions, 0 deletions
diff --git a/src/platform/windows/win_impl.h b/src/platform/windows/win_impl.h
index 2cdff1c0..462e1707 100644
--- a/src/platform/windows/win_impl.h
+++ b/src/platform/windows/win_impl.h
@@ -52,6 +52,10 @@ struct nni_atomic_flag {
unsigned f;
};
+struct nni_atomic_u64 {
+ LONGLONG v;
+};
+
// nni_win_io 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.
diff --git a/src/platform/windows/win_thread.c b/src/platform/windows/win_thread.c
index b9743c5e..f80c8e3f 100644
--- a/src/platform/windows/win_thread.c
+++ b/src/platform/windows/win_thread.c
@@ -121,6 +121,44 @@ nni_atomic_flag_reset(nni_atomic_flag *f)
InterlockedExchange(&f->f, 0);
}
+void
+nni_atomic_inc64(nni_atomic_u64 *v, uint64_t bump)
+{
+ InterlockedAddNoFence64(&v->v, (LONGLONG) bump);
+}
+
+void
+nni_atomic_dec64(nni_atomic_u64 *v, uint64_t bump)
+{
+ // Windows lacks a sub, so we add the negative.
+ InterlockedAddNoFence64(&v->v, (0ll - (LONGLONG) bump));
+}
+
+uint64_t
+nni_atomic_get64(nni_atomic_u64 *v)
+{
+
+ return ((uint64_t)(InterlockedExchangeAdd64(&v->v, 0)));
+}
+
+void
+nni_atomic_set64(nni_atomic_u64 *v, uint64_t u)
+{
+ return (InterlockedExchange64(&v->v, (LONGLONG) u));
+}
+
+uint64_t
+nni_atomic_swap64(nni_atomic_u64 *v, uint64_t u)
+{
+ return ((uint64_t)(InterlockedExchange64(&v->v, (LONGLONG) u)));
+}
+
+void
+nni_atomic_init64(nni_atomic_u64 *v)
+{
+ InterlockedExchange64(&v->v, 0);
+}
+
static unsigned int __stdcall nni_plat_thr_main(void *arg)
{
nni_plat_thr *thr = arg;