about summary refs log tree commit diff
path: root/src/thread/cancellation.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/thread/cancellation.c')
-rw-r--r--src/thread/cancellation.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/thread/cancellation.c b/src/thread/cancellation.c
new file mode 100644
index 00000000..e35ba824
--- /dev/null
+++ b/src/thread/cancellation.c
@@ -0,0 +1,22 @@
+#include "pthread_impl.h"
+
+void __pthread_register_cancel(struct __ptcb *cb)
+{
+	struct pthread *self = pthread_self();
+	cb->__next = self->cancelbuf;
+	self->cancelbuf = cb;
+}
+
+#define pthread_self __pthread_self
+
+void __pthread_unregister_cancel(struct __ptcb *cb)
+{
+	struct pthread *self = pthread_self();
+	self->cancelbuf = self->cancelbuf->__next;
+}
+
+void __pthread_unwind_next(struct __ptcb *cb)
+{
+	if (cb->__next) longjmp((void *)cb->__next->__jb, 1);
+	pthread_exit(PTHREAD_CANCELLED);
+}