Skip to content

Commit cd36f1e

Browse files
committed
Distinguish between threaded channels and non-threaded when marshalling.
Threaded channels _can_ be marshalled, just not for communication between threads. This is a special case since the same abstract type is used for both threaded and non-threaded channels.
1 parent 8df7364 commit cd36f1e

File tree

3 files changed

+15
-1
lines changed

3 files changed

+15
-1
lines changed

src/core/ev.c

+8-1
Original file line numberDiff line numberDiff line change
@@ -1224,6 +1224,7 @@ static Janet janet_chanat_next(void *p, Janet key) {
12241224

12251225
static void janet_chanat_marshal(void *p, JanetMarshalContext *ctx) {
12261226
JanetChannel *channel = (JanetChannel *)p;
1227+
janet_marshal_byte(ctx, channel->is_threaded);
12271228
janet_marshal_abstract(ctx, channel);
12281229
janet_marshal_byte(ctx, channel->closed);
12291230
janet_marshal_int(ctx, channel->limit);
@@ -1243,7 +1244,13 @@ static void janet_chanat_marshal(void *p, JanetMarshalContext *ctx) {
12431244
}
12441245

12451246
static void *janet_chanat_unmarshal(JanetMarshalContext *ctx) {
1246-
JanetChannel *abst = janet_unmarshal_abstract(ctx, sizeof(JanetChannel));
1247+
uint8_t is_threaded = janet_unmarshal_byte(ctx);
1248+
JanetChannel *abst;
1249+
if (is_threaded) {
1250+
abst = janet_unmarshal_abstract_threaded(ctx, sizeof(JanetChannel));
1251+
} else {
1252+
abst = janet_unmarshal_abstract(ctx, sizeof(JanetChannel));
1253+
}
12471254
uint8_t is_closed = janet_unmarshal_byte(ctx);
12481255
int32_t limit = janet_unmarshal_int(ctx);
12491256
int32_t count = janet_unmarshal_int(ctx);

src/core/marsh.c

+6
Original file line numberDiff line numberDiff line change
@@ -1245,6 +1245,12 @@ void *janet_unmarshal_abstract(JanetMarshalContext *ctx, size_t size) {
12451245
return p;
12461246
}
12471247

1248+
void *janet_unmarshal_abstract_threaded(JanetMarshalContext *ctx, size_t size) {
1249+
void *p = janet_abstract_threaded(ctx->at, size);
1250+
janet_unmarshal_abstract_reuse(ctx, p);
1251+
return p;
1252+
}
1253+
12481254
static const uint8_t *unmarshal_one_abstract(UnmarshalState *st, const uint8_t *data, Janet *out, int flags) {
12491255
Janet key;
12501256
data = unmarshal_one(st, data, &key, flags + 1);

src/include/janet.h

+1
Original file line numberDiff line numberDiff line change
@@ -2072,6 +2072,7 @@ JANET_API uint8_t janet_unmarshal_byte(JanetMarshalContext *ctx);
20722072
JANET_API void janet_unmarshal_bytes(JanetMarshalContext *ctx, uint8_t *dest, size_t len);
20732073
JANET_API Janet janet_unmarshal_janet(JanetMarshalContext *ctx);
20742074
JANET_API JanetAbstract janet_unmarshal_abstract(JanetMarshalContext *ctx, size_t size);
2075+
JANET_API JanetAbstract janet_unmarshal_abstract_threaded(JanetMarshalContext *ctx, size_t size);
20752076
JANET_API void janet_unmarshal_abstract_reuse(JanetMarshalContext *ctx, void *p);
20762077

20772078
JANET_API void janet_register_abstract_type(const JanetAbstractType *at);

0 commit comments

Comments
 (0)