+/* -*- 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;
+}
{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},
{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},
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, ...));