Skip to content

Commit 40304b5

Browse files
committed
Lock (codegen_lock) during typedef to prevent concurrency violation.
As far as I can tell, this doesn't much affect parallel performance, and prevents this exception from triggering if you attempt to define new functions from multiple threads: ``` ERROR: TaskFailedException: cannot eval a new struct type definition while defining another type ```
1 parent 91effa2 commit 40304b5

File tree

1 file changed

+9
-0
lines changed

1 file changed

+9
-0
lines changed

src/interpreter.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ SECT_INTERP void jl_set_datatype_super(jl_datatype_t *tt, jl_value_t *super)
128128
static void eval_abstracttype(jl_expr_t *ex, interpreter_state *s)
129129
{
130130
jl_value_t **args = jl_array_ptr_data(ex->args);
131+
JL_LOCK(&codegen_lock);
131132
if (inside_typedef)
132133
jl_error("cannot eval a new abstract type definition while defining another type");
133134
jl_value_t *name = args[0];
@@ -156,9 +157,11 @@ static void eval_abstracttype(jl_expr_t *ex, interpreter_state *s)
156157
super = eval_value(args[2], s);
157158
jl_set_datatype_super(dt, super);
158159
jl_reinstantiate_inner_types(dt);
160+
JL_UNLOCK(&codegen_lock);
159161
}
160162
JL_CATCH {
161163
jl_reset_instantiate_inner_types(dt);
164+
JL_UNLOCK(&codegen_lock);
162165
b->value = temp;
163166
jl_rethrow();
164167
}
@@ -172,6 +175,7 @@ static void eval_abstracttype(jl_expr_t *ex, interpreter_state *s)
172175
static void eval_primitivetype(jl_expr_t *ex, interpreter_state *s)
173176
{
174177
jl_value_t **args = (jl_value_t**)jl_array_ptr_data(ex->args);
178+
JL_LOCK(&codegen_lock);
175179
if (inside_typedef)
176180
jl_error("cannot eval a new primitive type definition while defining another type");
177181
jl_value_t *name = args[0];
@@ -207,9 +211,11 @@ static void eval_primitivetype(jl_expr_t *ex, interpreter_state *s)
207211
super = eval_value(args[3], s);
208212
jl_set_datatype_super(dt, super);
209213
jl_reinstantiate_inner_types(dt);
214+
JL_UNLOCK(&codegen_lock);
210215
}
211216
JL_CATCH {
212217
jl_reset_instantiate_inner_types(dt);
218+
JL_UNLOCK(&codegen_lock);
213219
b->value = temp;
214220
jl_rethrow();
215221
}
@@ -223,6 +229,7 @@ static void eval_primitivetype(jl_expr_t *ex, interpreter_state *s)
223229
static void eval_structtype(jl_expr_t *ex, interpreter_state *s)
224230
{
225231
jl_value_t **args = jl_array_ptr_data(ex->args);
232+
JL_LOCK(&codegen_lock);
226233
if (inside_typedef)
227234
jl_error("cannot eval a new struct type definition while defining another type");
228235
jl_value_t *name = args[0];
@@ -268,9 +275,11 @@ static void eval_structtype(jl_expr_t *ex, interpreter_state *s)
268275
}
269276
}
270277
jl_reinstantiate_inner_types(dt);
278+
JL_UNLOCK(&codegen_lock);
271279
}
272280
JL_CATCH {
273281
jl_reset_instantiate_inner_types(dt);
282+
JL_UNLOCK(&codegen_lock);
274283
b->value = temp;
275284
jl_rethrow();
276285
}

0 commit comments

Comments
 (0)