mirror of
https://github.com/janet-lang/janet
synced 2024-11-29 03:19:54 +00:00
Fix memory issue in allocating decode buffer.
Since the decode table is currently a single table per thread, we just make it a thread local to avoid issues.
This commit is contained in:
parent
b567ece401
commit
bc2bac8cd3
@ -51,9 +51,6 @@ struct JanetMailbox {
|
|||||||
pthread_cond_t cond;
|
pthread_cond_t cond;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Receiving messages - (only by owner thread) */
|
|
||||||
JanetTable *decode;
|
|
||||||
|
|
||||||
/* Setup procedure - requires a parent mailbox
|
/* Setup procedure - requires a parent mailbox
|
||||||
* to receive thunk from */
|
* to receive thunk from */
|
||||||
JanetMailbox *parent;
|
JanetMailbox *parent;
|
||||||
@ -75,6 +72,15 @@ struct JanetMailbox {
|
|||||||
|
|
||||||
static JANET_THREAD_LOCAL JanetMailbox *janet_vm_mailbox = NULL;
|
static JANET_THREAD_LOCAL JanetMailbox *janet_vm_mailbox = NULL;
|
||||||
static JANET_THREAD_LOCAL JanetThread *janet_vm_thread_current = NULL;
|
static JANET_THREAD_LOCAL JanetThread *janet_vm_thread_current = NULL;
|
||||||
|
static JANET_THREAD_LOCAL JanetTable *janet_vm_thread_decode = NULL;
|
||||||
|
|
||||||
|
static JanetTable *janet_thread_get_decode(void) {
|
||||||
|
if (janet_vm_thread_decode == NULL) {
|
||||||
|
janet_vm_thread_decode = janet_get_core_table("load-image-dict");
|
||||||
|
janet_gcroot(janet_wrap_table(janet_vm_thread_decode));
|
||||||
|
}
|
||||||
|
return janet_vm_thread_decode;
|
||||||
|
}
|
||||||
|
|
||||||
static JanetMailbox *janet_mailbox_create(JanetMailbox *parent, int refCount, uint16_t capacity) {
|
static JanetMailbox *janet_mailbox_create(JanetMailbox *parent, int refCount, uint16_t capacity) {
|
||||||
JanetMailbox *mailbox = malloc(sizeof(JanetMailbox) + sizeof(JanetBuffer) * (size_t) capacity);
|
JanetMailbox *mailbox = malloc(sizeof(JanetMailbox) + sizeof(JanetBuffer) * (size_t) capacity);
|
||||||
@ -356,7 +362,7 @@ int janet_thread_receive(Janet *msg_out, double timeout) {
|
|||||||
const uint8_t *nextItem = NULL;
|
const uint8_t *nextItem = NULL;
|
||||||
Janet item = janet_unmarshal(
|
Janet item = janet_unmarshal(
|
||||||
msgbuf->data, msgbuf->count,
|
msgbuf->data, msgbuf->count,
|
||||||
0, mailbox->decode, &nextItem);
|
0, janet_thread_get_decode(), &nextItem);
|
||||||
*msg_out = item;
|
*msg_out = item;
|
||||||
|
|
||||||
/* Cleanup */
|
/* Cleanup */
|
||||||
@ -423,7 +429,6 @@ static int thread_worker(JanetMailbox *mailbox) {
|
|||||||
|
|
||||||
/* Get dictionaries for default encode/decode */
|
/* Get dictionaries for default encode/decode */
|
||||||
JanetTable *encode = janet_get_core_table("make-image-dict");
|
JanetTable *encode = janet_get_core_table("make-image-dict");
|
||||||
mailbox->decode = janet_get_core_table("load-image-dict");
|
|
||||||
|
|
||||||
/* Create parent thread */
|
/* Create parent thread */
|
||||||
JanetThread *parent = janet_make_thread(mailbox->parent, encode);
|
JanetThread *parent = janet_make_thread(mailbox->parent, encode);
|
||||||
@ -507,6 +512,8 @@ void janet_threads_init(void) {
|
|||||||
if (NULL == janet_vm_mailbox) {
|
if (NULL == janet_vm_mailbox) {
|
||||||
janet_vm_mailbox = janet_mailbox_create(NULL, 1, 10);
|
janet_vm_mailbox = janet_mailbox_create(NULL, 1, 10);
|
||||||
}
|
}
|
||||||
|
janet_vm_thread_decode = NULL;
|
||||||
|
janet_vm_thread_current = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void janet_threads_deinit(void) {
|
void janet_threads_deinit(void) {
|
||||||
@ -515,6 +522,7 @@ void janet_threads_deinit(void) {
|
|||||||
janet_mailbox_ref_with_lock(janet_vm_mailbox, -1);
|
janet_mailbox_ref_with_lock(janet_vm_mailbox, -1);
|
||||||
janet_vm_mailbox = NULL;
|
janet_vm_mailbox = NULL;
|
||||||
janet_vm_thread_current = NULL;
|
janet_vm_thread_current = NULL;
|
||||||
|
janet_vm_thread_decode = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -284,7 +284,7 @@ void janet_cfuns(JanetTable *env, const char *regprefix, const JanetReg *cfuns)
|
|||||||
while (cfuns->name[nmlen]) nmlen++;
|
while (cfuns->name[nmlen]) nmlen++;
|
||||||
int32_t totallen = (int32_t) prefixlen + nmlen;
|
int32_t totallen = (int32_t) prefixlen + nmlen;
|
||||||
if ((size_t) totallen > bufsize) {
|
if ((size_t) totallen > bufsize) {
|
||||||
bufsize = (size_t) (totallen) + 128;
|
bufsize = (size_t)(totallen) + 128;
|
||||||
longname_buffer = realloc(longname_buffer, bufsize);
|
longname_buffer = realloc(longname_buffer, bufsize);
|
||||||
if (NULL == longname_buffer) {
|
if (NULL == longname_buffer) {
|
||||||
JANET_OUT_OF_MEMORY;
|
JANET_OUT_OF_MEMORY;
|
||||||
@ -324,7 +324,7 @@ typedef struct {
|
|||||||
|
|
||||||
void janet_register_abstract_type(const JanetAbstractType *at) {
|
void janet_register_abstract_type(const JanetAbstractType *at) {
|
||||||
JanetAbstractTypeWrap *abstract = (JanetAbstractTypeWrap *)
|
JanetAbstractTypeWrap *abstract = (JanetAbstractTypeWrap *)
|
||||||
janet_abstract(&type_wrap, sizeof(JanetAbstractTypeWrap));
|
janet_abstract(&type_wrap, sizeof(JanetAbstractTypeWrap));
|
||||||
abstract->at = at;
|
abstract->at = at;
|
||||||
Janet sym = janet_csymbolv(at->name);
|
Janet sym = janet_csymbolv(at->name);
|
||||||
if (!(janet_checktype(janet_table_get(janet_vm_registry, sym), JANET_NIL))) {
|
if (!(janet_checktype(janet_table_get(janet_vm_registry, sym), JANET_NIL))) {
|
||||||
|
Loading…
Reference in New Issue
Block a user