summaryrefslogtreecommitdiffhomepage
path: root/src/chunklets/fastspin.h
diff options
context:
space:
mode:
authorMichael Smith <mikesmiffy128@gmail.com>2023-07-29 14:32:06 +0100
committerMichael Smith <mikesmiffy128@gmail.com>2023-08-02 21:02:31 +0100
commit9a0d8730fa977f666b5c12e4c5901e7d0391e245 (patch)
tree87eebcdcef04ae1e7348ef80e972c08aa4783649 /src/chunklets/fastspin.h
parentd337b09936ecd90bad07b28b48b7103395d97ce5 (diff)
Make various preparations for upcoming features
A lot of this is random WIP from a while back, at least a month ago, and is being committed now to get it out of the way so that other patches can be brought in and integrated against it without causing headaches. Also rolled into this commit is a way to distinguish plugin_unload from exiting the game. This is required for another soon-to-be-integrated feature to avoid crashing on exit, and could in theory also be used to speed up unloading on exit in future. While we're at it, this also avoids the need to linearly scan through the plugin list to do the old branch unloading fix, because we can. Rough summary of the other smaller stuff I can remember doing: - Rework bitbuf a bit - Add some cryptographic nonsense in ac.c (not final at all) - Introduce the first couple of "chunklets" libraries as a sort-of subproject of this one - Tidy up random small bits and bobs - Add source for a small keypair generation tool - Rework democustom to be very marginally more useful
Diffstat (limited to 'src/chunklets/fastspin.h')
-rw-r--r--src/chunklets/fastspin.h65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/chunklets/fastspin.h b/src/chunklets/fastspin.h
new file mode 100644
index 0000000..6c0c5f7
--- /dev/null
+++ b/src/chunklets/fastspin.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright © 2023 Michael Smith <mikesmiffy128@gmail.com>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+ * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef INC_CHUNKLETS_FASTSPIN_H
+#define INC_CHUNKLETS_FASTSPIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Raises an event through p to 0 or more callers of fastspin_wait().
+ * val must be positive, and can be used to signal a specific condition.
+ */
+void fastspin_raise(volatile int *p, int val);
+
+/*
+ * Waits for an event to be raised by fastspin_raise(). Allows this and possibly
+ * some other threads to wait for one other thread to signal its status.
+ *
+ * Returns the positive value that was passed to fastspin_raise().
+ */
+int fastspin_wait(volatile int *p);
+
+/*
+ * Takes a mutual exclusion, i.e. a lock. *p must be initialised to 0 before
+ * anything starts using it as a lock.
+ */
+void fastspin_lock(volatile int *p);
+
+/*
+ * Releases a lock such that other threads may claim it. Immediately as a lock
+ * is released, its value will be 0, as though it had just been initialised.
+ */
+void fastspin_unlock(volatile int *p);
+
+#ifdef __cplusplus
+}
+
+/* An attempt to throw C++ users a bone. Should be self-explanatory. */
+struct fastspin_lock_guard {
+ fastspin_lock_guard(volatile int &i): _p(&i) { fastspin_lock(_p); }
+ fastspin_lock_guard() = delete;
+ ~fastspin_lock_guard() { fastspin_unlock(_p); }
+ volatile int *_p;
+};
+
+#endif
+
+#endif
+
+// vi: sw=4 ts=4 noet tw=80 cc=80