Skip to content
/ janet Public
forked from janet-lang/janet

Commit

Permalink
Don't use CLOCK_MONOTONIC for pthread stuff.
Browse files Browse the repository at this point in the history
Also fix marshalling functions without full
sourcemapping information, as well as thread/receive
ignoring bad messages. Instead, thread/receive will error
on bad messages.
  • Loading branch information
bakpakin committed Jul 4, 2020
1 parent 617ec7f commit 3bb8f1a
Show file tree
Hide file tree
Showing 7 changed files with 43 additions and 17 deletions.
3 changes: 3 additions & 0 deletions src/core/asm.c
Original file line number Diff line number Diff line change
Expand Up @@ -720,6 +720,9 @@ static JanetAssembleResult janet_asm1(JanetAssembler *parent, Janet source, int
janet_asm_error(&a, "invalid assembly");
}

/* Add final flags */
janet_def_addflags(def);

/* Finish everything and return funcdef */
janet_asm_deinit(&a);
result.error = NULL;
Expand Down
27 changes: 26 additions & 1 deletion src/core/compile.c
Original file line number Diff line number Diff line change
Expand Up @@ -698,6 +698,29 @@ JanetSlot janetc_value(JanetFopts opts, Janet x) {
return ret;
}

/* Add function flags to janet functions */
void janet_def_addflags(JanetFuncDef *def) {
int32_t set_flags = 0;
int32_t unset_flags = 0;
/* pos checks */
if (def->name) set_flags |= JANET_FUNCDEF_FLAG_HASNAME;
if (def->source) set_flags |= JANET_FUNCDEF_FLAG_HASSOURCE;
if (def->defs) set_flags |= JANET_FUNCDEF_FLAG_HASDEFS;
if (def->environments) set_flags |= JANET_FUNCDEF_FLAG_HASENVS;
if (def->sourcemap) set_flags |= JANET_FUNCDEF_FLAG_HASSOURCEMAP;
if (def->closure_bitset) set_flags |= JANET_FUNCDEF_FLAG_HASCLOBITSET;
/* negative checks */
if (!def->name) unset_flags |= JANET_FUNCDEF_FLAG_HASNAME;
if (!def->source) unset_flags |= JANET_FUNCDEF_FLAG_HASSOURCE;
if (!def->defs) unset_flags |= JANET_FUNCDEF_FLAG_HASDEFS;
if (!def->environments) unset_flags |= JANET_FUNCDEF_FLAG_HASENVS;
if (!def->sourcemap) unset_flags |= JANET_FUNCDEF_FLAG_HASSOURCEMAP;
if (!def->closure_bitset) unset_flags |= JANET_FUNCDEF_FLAG_HASCLOBITSET;
/* Update flags */
def->flags |= set_flags;
def->flags &= ~unset_flags;
}

/* Compile a funcdef */
JanetFuncDef *janetc_pop_funcdef(JanetCompiler *c) {
JanetScope *scope = c->scope;
Expand Down Expand Up @@ -761,12 +784,14 @@ JanetFuncDef *janetc_pop_funcdef(JanetCompiler *c) {
/* Register allocator preallocates some registers [240-255, high 16 bits of chunk index 7], we can ignore those. */
if (scope->ua.count > 7) chunks[7] &= 0xFFFFU;
def->closure_bitset = chunks;
def->flags |= JANET_FUNCDEF_FLAG_HASCLOBITSET;
}

/* Pop the scope */
janetc_popscope(c);

/* Finalize some flags */
janet_def_addflags(def);

return def;
}

Expand Down
1 change: 1 addition & 0 deletions src/core/corelib.c
Original file line number Diff line number Diff line change
Expand Up @@ -741,6 +741,7 @@ static void janet_quick_asm(
JANET_OUT_OF_MEMORY;
}
memcpy(def->bytecode, bytecode, bytecode_size);
janet_def_addflags(def);
janet_def(env, name, janet_wrap_function(janet_thunk(def)), doc);
}

Expand Down
17 changes: 4 additions & 13 deletions src/core/marsh.c
Original file line number Diff line number Diff line change
Expand Up @@ -214,15 +214,6 @@ static void marshal_one_env(MarshalState *st, JanetFuncEnv *env, int flags) {
}
}

/* Add function flags to janet functions */
static void janet_func_addflags(JanetFuncDef *def) {
if (def->name) def->flags |= JANET_FUNCDEF_FLAG_HASNAME;
if (def->source) def->flags |= JANET_FUNCDEF_FLAG_HASSOURCE;
if (def->defs) def->flags |= JANET_FUNCDEF_FLAG_HASDEFS;
if (def->environments) def->flags |= JANET_FUNCDEF_FLAG_HASENVS;
if (def->sourcemap) def->flags |= JANET_FUNCDEF_FLAG_HASSOURCEMAP;
}

/* Marshal a sequence of u32s */
static void janet_marshal_u32s(MarshalState *st, const uint32_t *u32s, int32_t n) {
for (int32_t i = 0; i < n; i++) {
Expand All @@ -243,7 +234,6 @@ static void marshal_one_def(MarshalState *st, JanetFuncDef *def, int flags) {
return;
}
}
janet_func_addflags(def);
/* Add to lookup */
janet_v_push(st->seen_defs, def);
pushint(st, def->flags);
Expand Down Expand Up @@ -900,19 +890,20 @@ static const uint8_t *unmarshal_one_def(
for (int32_t i = 0; i < bytecode_length; i++) {
current += readint(st, &data);
def->sourcemap[i].line = current;
def->sourcemap[i].column = readnat(st, &data);
def->sourcemap[i].column = readint(st, &data);
}
} else {
def->sourcemap = NULL;
}

/* Unmarshal closure bitset if needed */
if (def->flags & JANET_FUNCDEF_FLAG_HASCLOBITSET) {
def->closure_bitset = malloc(sizeof(uint32_t) * def->slotcount);
size_t n = (size_t)(def->slotcount + 31) >> 5;
def->closure_bitset = malloc(sizeof(uint32_t) * n);
if (NULL == def->closure_bitset) {
JANET_OUT_OF_MEMORY;
}
data = janet_unmarshal_u32s(st, data, def->closure_bitset, (def->slotcount + 31) >> 5);
data = janet_unmarshal_u32s(st, data, def->closure_bitset, n);
}

/* Validate */
Expand Down
9 changes: 7 additions & 2 deletions src/core/thread.c
Original file line number Diff line number Diff line change
Expand Up @@ -375,8 +375,12 @@ int janet_thread_receive(Janet *msg_out, double timeout) {

/* Handle errors */
if (setjmp(buf)) {
/* Cleanup jmp_buf, keep lock */
/* Cleanup jmp_buf, return error.
* Do not ignore bad messages as before. */
janet_vm_jmp_buf = old_buf;
*msg_out = *janet_vm_return_reg;
janet_mailbox_unlock(mailbox);
return 2;
} else {
JanetBuffer *msgbuf = mailbox->messages + mailbox->messageFirst;
mailbox->messageCount--;
Expand Down Expand Up @@ -411,7 +415,6 @@ int janet_thread_receive(Janet *msg_out, double timeout) {
return 1;
}
}

}

static int janet_thread_getter(void *p, Janet key, Janet *out);
Expand Down Expand Up @@ -664,6 +667,8 @@ static Janet cfun_thread_receive(int32_t argc, Janet *argv) {
break;
case 1:
janet_panicf("timeout after %f seconds", wait);
case 2:
janet_panicf("failed to receive message: %v", out);
}
return out;
}
Expand Down
2 changes: 1 addition & 1 deletion src/core/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -621,7 +621,7 @@ int janet_gettime(struct timespec *spec) {
}
#else
int janet_gettime(struct timespec *spec) {
return clock_gettime(CLOCK_MONOTONIC, spec);
return clock_gettime(CLOCK_REALTIME, spec);
}
#endif
#endif
1 change: 1 addition & 0 deletions src/core/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ Janet janet_dict_get(const JanetKV *buckets, int32_t cap, Janet key);
void janet_memempty(JanetKV *mem, int32_t count);
void *janet_memalloc_empty(int32_t count);
JanetTable *janet_get_core_table(const char *name);
void janet_def_addflags(JanetFuncDef *def);
const void *janet_strbinsearch(
const void *tab,
size_t tabcount,
Expand Down

0 comments on commit 3bb8f1a

Please sign in to comment.