txlyre 1 day ago
parent
commit
87da711271
2 changed files with 14 additions and 2 deletions
  1. 13 2
      qirt.c
  2. 1 0
      qirt.h

+ 13 - 2
qirt.c

@@ -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;
 

+ 1 - 0
qirt.h

@@ -432,6 +432,7 @@ bool _qi_lt(qi_state_t *state, qi_value_t *a, qi_value_t *b);
 bool _qi_gt(qi_state_t *state, qi_value_t *a, qi_value_t *b);
 qi_value_t *qi_negate(qi_state_t *state, qi_value_t *a);
 qi_value_t *qi_bnot(qi_state_t *state, qi_value_t *a);
+void qi_exit(qi_state_t *state, int code);
 void *qi_thread_create(qi_state_t *state, qi_value_t *fn, qi_list_t *args);
 qi_value_t *qi_thread_join(qi_state_t *state, void *td);
 void qi_thread_exit(qi_state_t *state, qi_value_t *value);