mirror of
https://github.com/janet-lang/janet
synced 2024-09-27 22:58:13 +00:00
Add option to build janet without thread library.
This commit is contained in:
parent
ab27b789e4
commit
aea1f59f6e
@ -2,6 +2,7 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
## 1.17.0 - Unreleased
|
## 1.17.0 - Unreleased
|
||||||
|
- Add build option to disable the threading library without disabling all threads.
|
||||||
- Remove JPM from the main Janet distribution. Instead, JPM must be installed
|
- Remove JPM from the main Janet distribution. Instead, JPM must be installed
|
||||||
separately like any other package.
|
separately like any other package.
|
||||||
- Fix issue with `ev/go` when called with an initial value and supervisor.
|
- Fix issue with `ev/go` when called with an initial value and supervisor.
|
||||||
|
@ -73,6 +73,7 @@ conf.set('JANET_NO_REALPATH', not get_option('realpath'))
|
|||||||
conf.set('JANET_NO_PROCESSES', not get_option('processes'))
|
conf.set('JANET_NO_PROCESSES', not get_option('processes'))
|
||||||
conf.set('JANET_SIMPLE_GETLINE', get_option('simple_getline'))
|
conf.set('JANET_SIMPLE_GETLINE', get_option('simple_getline'))
|
||||||
conf.set('JANET_EV_EPOLL', get_option('epoll'))
|
conf.set('JANET_EV_EPOLL', get_option('epoll'))
|
||||||
|
conf.set('JANET_NO_THREADS', get_option('threads'))
|
||||||
if get_option('os_name') != ''
|
if get_option('os_name') != ''
|
||||||
conf.set('JANET_OS_NAME', get_option('os_name'))
|
conf.set('JANET_OS_NAME', get_option('os_name'))
|
||||||
endif
|
endif
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
option('git_hash', type : 'string', value : 'meson')
|
option('git_hash', type : 'string', value : 'meson')
|
||||||
|
|
||||||
option('single_threaded', type : 'boolean', value : false)
|
option('single_threaded', type : 'boolean', value : false)
|
||||||
|
option('threads', type : 'boolean', value : true)
|
||||||
option('nanbox', type : 'boolean', value : true)
|
option('nanbox', type : 'boolean', value : true)
|
||||||
option('dynamic_modules', type : 'boolean', value : true)
|
option('dynamic_modules', type : 'boolean', value : true)
|
||||||
option('docstrings', type : 'boolean', value : true)
|
option('docstrings', type : 'boolean', value : true)
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
/* #define JANET_NO_REALPATH */
|
/* #define JANET_NO_REALPATH */
|
||||||
/* #define JANET_NO_SYMLINKS */
|
/* #define JANET_NO_SYMLINKS */
|
||||||
/* #define JANET_NO_UMASK */
|
/* #define JANET_NO_UMASK */
|
||||||
|
/* #define JANET_NO_THREADS */
|
||||||
|
|
||||||
/* Other settings */
|
/* Other settings */
|
||||||
/* #define JANET_DEBUG */
|
/* #define JANET_DEBUG */
|
||||||
|
@ -55,8 +55,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Ring buffer for storing a list of fibers */
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
JanetFiber *fiber;
|
JanetFiber *fiber;
|
||||||
uint32_t sched_id;
|
uint32_t sched_id;
|
||||||
@ -688,7 +686,7 @@ static int janet_channel_push(JanetChannel *channel, Janet x, int mode) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Pop from a channel - returns 1 if item was obtain, 0 otherwise. The item
|
/* Pop from a channel - returns 1 if item was obtained, 0 otherwise. The item
|
||||||
* is returned by reference. If the pop would block, will add to the read_pending
|
* is returned by reference. If the pop would block, will add to the read_pending
|
||||||
* queue in the channel. */
|
* queue in the channel. */
|
||||||
static int janet_channel_pop(JanetChannel *channel, Janet *item, int is_choice) {
|
static int janet_channel_pop(JanetChannel *channel, Janet *item, int is_choice) {
|
||||||
@ -1386,6 +1384,9 @@ void janet_ev_threaded_call(JanetThreadedSubroutine fp, JanetEVGenericMessage ar
|
|||||||
|
|
||||||
/* Default callback for janet_ev_threaded_await. */
|
/* Default callback for janet_ev_threaded_await. */
|
||||||
void janet_ev_default_threaded_callback(JanetEVGenericMessage return_value) {
|
void janet_ev_default_threaded_callback(JanetEVGenericMessage return_value) {
|
||||||
|
if (return_value.fiber == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
switch (return_value.tag) {
|
switch (return_value.tag) {
|
||||||
default:
|
default:
|
||||||
case JANET_EV_TCTAG_NIL:
|
case JANET_EV_TCTAG_NIL:
|
||||||
@ -2052,7 +2053,11 @@ static JanetEVGenericMessage janet_go_thread_subr(JanetEVGenericMessage args) {
|
|||||||
static Janet cfun_ev_thread(int32_t argc, Janet *argv) {
|
static Janet cfun_ev_thread(int32_t argc, Janet *argv) {
|
||||||
janet_arity(argc, 1, 3);
|
janet_arity(argc, 1, 3);
|
||||||
janet_getfiber(argv, 0);
|
janet_getfiber(argv, 0);
|
||||||
Janet value = argc == 2 ? argv[1] : janet_wrap_nil();
|
Janet value = argc >= 2 ? argv[1] : janet_wrap_nil();
|
||||||
|
uint64_t flags = 0;
|
||||||
|
if (argc >= 3) {
|
||||||
|
flags = janet_getflags(argv, 2, "n");
|
||||||
|
}
|
||||||
/* Marshal arguments for the new thread. */
|
/* Marshal arguments for the new thread. */
|
||||||
JanetBuffer *buffer = janet_malloc(sizeof(JanetBuffer));
|
JanetBuffer *buffer = janet_malloc(sizeof(JanetBuffer));
|
||||||
if (NULL == buffer) {
|
if (NULL == buffer) {
|
||||||
@ -2063,7 +2068,18 @@ static Janet cfun_ev_thread(int32_t argc, Janet *argv) {
|
|||||||
janet_marshal(buffer, janet_wrap_table(janet_vm.registry), NULL, JANET_MARSHAL_UNSAFE);
|
janet_marshal(buffer, janet_wrap_table(janet_vm.registry), NULL, JANET_MARSHAL_UNSAFE);
|
||||||
janet_marshal(buffer, argv[0], NULL, JANET_MARSHAL_UNSAFE);
|
janet_marshal(buffer, argv[0], NULL, JANET_MARSHAL_UNSAFE);
|
||||||
janet_marshal(buffer, value, NULL, JANET_MARSHAL_UNSAFE);
|
janet_marshal(buffer, value, NULL, JANET_MARSHAL_UNSAFE);
|
||||||
janet_ev_threaded_await(janet_go_thread_subr, 0, argc, buffer);
|
if (flags & 0x1) {
|
||||||
|
/* Return immediately */
|
||||||
|
JanetEVGenericMessage arguments;
|
||||||
|
arguments.tag = 0;
|
||||||
|
arguments.argi = argc;
|
||||||
|
arguments.argp = buffer;
|
||||||
|
arguments.fiber = NULL;
|
||||||
|
janet_ev_threaded_call(janet_go_thread_subr, arguments, janet_ev_default_threaded_callback);
|
||||||
|
return janet_wrap_nil();
|
||||||
|
} else {
|
||||||
|
janet_ev_threaded_await(janet_go_thread_subr, 0, argc, buffer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static Janet cfun_ev_give_supervisor(int32_t argc, Janet *argv) {
|
static Janet cfun_ev_give_supervisor(int32_t argc, Janet *argv) {
|
||||||
@ -2185,7 +2201,8 @@ static const JanetReg ev_cfuns[] = {
|
|||||||
"Resume a (copy of a) `fiber` in a new operating system thread, optionally passing `value` "
|
"Resume a (copy of a) `fiber` in a new operating system thread, optionally passing `value` "
|
||||||
"to resume with. "
|
"to resume with. "
|
||||||
"Unlike `ev/go`, this function will suspend the current fiber until the thread is complete. "
|
"Unlike `ev/go`, this function will suspend the current fiber until the thread is complete. "
|
||||||
"The the final result.")
|
"If you want to run the thread without waiting for a result, pass the `:n` flag to return nil immediately. "
|
||||||
|
"Otherwise, returns (a copy of) the final result from the fiber on the new thread.")
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ev/give-supervisor", cfun_ev_give_supervisor,
|
"ev/give-supervisor", cfun_ev_give_supervisor,
|
||||||
|
@ -144,17 +144,23 @@ extern "C" {
|
|||||||
#define JANET_NO_UTC_MKTIME
|
#define JANET_NO_UTC_MKTIME
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Check thread library */
|
||||||
|
#ifndef JANET_NO_THREADS
|
||||||
|
#define JANET_THREADS
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Define how global janet state is declared */
|
/* Define how global janet state is declared */
|
||||||
|
/* Also enable the thread library only if not single-threaded */
|
||||||
#ifdef JANET_SINGLE_THREADED
|
#ifdef JANET_SINGLE_THREADED
|
||||||
#define JANET_THREAD_LOCAL
|
#define JANET_THREAD_LOCAL
|
||||||
|
#undef JANET_THREADS
|
||||||
#elif defined(__GNUC__)
|
#elif defined(__GNUC__)
|
||||||
#define JANET_THREAD_LOCAL __thread
|
#define JANET_THREAD_LOCAL __thread
|
||||||
#define JANET_THREADS
|
|
||||||
#elif defined(_MSC_BUILD)
|
#elif defined(_MSC_BUILD)
|
||||||
#define JANET_THREAD_LOCAL __declspec(thread)
|
#define JANET_THREAD_LOCAL __declspec(thread)
|
||||||
#define JANET_THREADS
|
|
||||||
#else
|
#else
|
||||||
#define JANET_THREAD_LOCAL
|
#define JANET_THREAD_LOCAL
|
||||||
|
#undef JANET_THREADS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Enable or disable dynamic module loading. Enabled by default. */
|
/* Enable or disable dynamic module loading. Enabled by default. */
|
||||||
|
Loading…
Reference in New Issue
Block a user