|
@@ -588,7 +588,7 @@ void qi_new_scope(qi_state_t *state) {
|
|
|
qi_list_push(state->scopes, scope);
|
|
|
}
|
|
|
|
|
|
-bool qi_old_scope(qi_state_t *state) {
|
|
|
+static bool _qi_old_scope(qi_state_t *state, bool ignore_barriers) {
|
|
|
qi_scope_t *scope;
|
|
|
qi_list_t *defers;
|
|
|
|
|
@@ -596,7 +596,7 @@ bool qi_old_scope(qi_state_t *state) {
|
|
|
return false;
|
|
|
|
|
|
scope = qi_list_last(state->scopes);
|
|
|
- if (scope->is_barrier)
|
|
|
+ if (!ignore_barriers && scope->is_barrier)
|
|
|
return false;
|
|
|
|
|
|
defers = scope->defers;
|
|
@@ -620,6 +620,10 @@ bool qi_old_scope(qi_state_t *state) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+bool qi_old_scope(qi_state_t *state) {
|
|
|
+ return _qi_old_scope(state, false);
|
|
|
+}
|
|
|
+
|
|
|
qi_value_t *qi_call_meta(qi_state_t *state, bool *fail_flag, qi_value_t *value,
|
|
|
char *name, qi_size_t count, ...);
|
|
|
|
|
@@ -2860,6 +2864,13 @@ static qi_state_t *qi_state_clone(qi_state_t *state) {
|
|
|
return newstate;
|
|
|
}
|
|
|
|
|
|
+void qi_exit(qi_state_t *state, int code) {
|
|
|
+ while (_qi_old_scope(state, true)) ;
|
|
|
+ qi_finalize();
|
|
|
+
|
|
|
+ exit(code);
|
|
|
+}
|
|
|
+
|
|
|
static void *__thread_wrapper(void *_args) {
|
|
|
qi_list_t *args = (qi_list_t *)_args;
|
|
|
|