green-threads: add continuation and thread constructors
authorDaniel Kochmański <daniel@turtleware.eu>
Mon, 24 Aug 2015 13:55:30 +0000 (15:55 +0200)
committerDaniel Kochmański <daniel@turtleware.eu>
Mon, 24 Aug 2015 14:03:04 +0000 (16:03 +0200)
Signed-off-by: Daniel Kochmański <daniel@turtleware.eu>
src/c/lwp.d
src/c/symbols_list.h
src/c/symbols_list2.h
src/h/external.h

index e69de29..4643ee1 100644 (file)
@@ -0,0 +1,43 @@
+/* -*- mode: c; c-basic-offset: 8 -*- */
+/*
+    lwp.d -- Light weight processes.
+*/
+/*
+    Copyright (c) 1990, Giuseppe Attardi.
+    Copyright (c) 2001, Juan Jose Garcia Ripoll.
+    Copyright (c) 2015, Daniel Kochmański.
+
+    ECL is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    See file '../Copyright' for full details.
+*/
+
+#include <ecl/ecl.h>
+
+cl_object
+si_make_thread (cl_object fun) {
+        cl_object x;
+
+        x = ecl_alloc_object(t_thread);
+        x->thread.cont = ECL_NIL;
+        return x;
+}
+
+cl_object
+si_make_continuation (cl_object thread) {
+        cl_object x;
+
+        if (type_of(thread) != t_thread)
+                FEwrong_type_argument(@'ext::thread', thread);
+
+        x = ecl_alloc_object(t_cont);
+        x->cont.thread = thread;
+        x->cont.resumed = FALSE;
+        x->cont.timed_out = FALSE;
+
+        thread->thread.cont = x;
+        return x;
+}
index df34863..aba592c 100755 (executable)
@@ -1534,14 +1534,15 @@ cl_symbols[] = {
 {EXT_ "CONT", EXT_ORDINARY, NULL, -1, OBJNULL},
 {EXT_ "THREAD", EXT_ORDINARY, NULL, -1, OBJNULL},
 
-{EXT_ "MAKE-THREAD", EXT_ORDINARY, NULL, -1, OBJNULL},
+{EXT_ "MAKE-THREAD", EXT_ORDINARY, si_make_thread, 1, OBJNULL},
 {EXT_ "DEACTIVATE", EXT_ORDINARY, NULL, -1, OBJNULL},
 {EXT_ "REACTIVATE", EXT_ORDINARY, NULL, -1, OBJNULL},
 {EXT_ "KILL-THREAD", EXT_ORDINARY, NULL, -1, OBJNULL},
 {EXT_ "CURRENT-THREAD", EXT_ORDINARY, NULL, -1, OBJNULL},
 {EXT_ "THREAD-STATUS", EXT_ORDINARY, NULL, -1, OBJNULL},
 {EXT_ "THREAD-LIST", EXT_ORDINARY, NULL, -1, OBJNULL},
-{EXT_ "MAKE-CONTINUATION", EXT_ORDINARY, NULL, -1, OBJNULL},
+
+{EXT_ "MAKE-CONTINUATION", EXT_ORDINARY, si_make_continuation, 1, OBJNULL},
 {EXT_ "THREAD-OF", EXT_ORDINARY, NULL, -1, OBJNULL},
 {EXT_ "CONTINUATION-OF", EXT_ORDINARY, NULL, -1, OBJNULL},
 {EXT_ "RESUME", EXT_ORDINARY, NULL, -1, OBJNULL},
index 7429634..da2927c 100644 (file)
@@ -1534,14 +1534,15 @@ cl_symbols[] = {
 {EXT_ "CONT",NULL},
 {EXT_ "THREAD",NULL},
 
-{EXT_ "MAKE-THREAD",NULL},
+{EXT_ "MAKE-THREAD","si_make_thread"},
 {EXT_ "DEACTIVATE",NULL},
 {EXT_ "REACTIVATE",NULL},
 {EXT_ "KILL-THREAD",NULL},
 {EXT_ "CURRENT-THREAD",NULL},
 {EXT_ "THREAD-STATUS",NULL},
 {EXT_ "THREAD-LIST",NULL},
-{EXT_ "MAKE-CONTINUATION",NULL},
+
+{EXT_ "MAKE-CONTINUATION","si_make_continuation"},
 {EXT_ "THREAD-OF",NULL},
 {EXT_ "CONTINUATION-OF",NULL},
 {EXT_ "RESUME",NULL},
index 2e05ede..d86172b 100755 (executable)
@@ -920,6 +920,13 @@ extern ECL_API cl_object si_load_source(cl_object file, cl_object verbose, cl_ob
 extern ECL_API cl_object si_load_binary(cl_object file, cl_object verbose, cl_object print, cl_object format);
 extern ECL_API cl_object cl_load _ECL_ARGS((cl_narg narg, cl_object pathname, ...));
 
+
+/* lwp.c */
+
+extern ECL_API cl_object si_make_thread(cl_object fun);
+extern ECL_API cl_object si_make_continuation(cl_object thread);
+
+
 /* macros.c */
 
 extern ECL_API cl_object cl_macroexpand _ECL_ARGS((cl_narg narg, cl_object form, ...));