From 1b6091b8712cd8767750375e912fda580b380d31 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Sun, 13 Oct 2019 10:36:29 -0700 Subject: [PATCH] Typed coroutine in/out --- 4ed.cpp | 96 +++++++++++++------------------------- 4ed_api_implementation.cpp | 27 +++++++---- 4ed_app_models.h | 42 ++++++++++++----- 3 files changed, 81 insertions(+), 84 deletions(-) diff --git a/4ed.cpp b/4ed.cpp index 7a895696..27b7951c 100644 --- a/4ed.cpp +++ b/4ed.cpp @@ -24,39 +24,40 @@ restore_state(Application_Links *app, App_Coroutine_State state){ } internal Coroutine* -app_coroutine_handle_request(Models *models, Coroutine *co, u32 *vals){ +app_coroutine_handle_request(Models *models, Coroutine *co, App_Coroutine_Out *out){ Coroutine *result = 0; - switch (vals[2]){ + switch (out->request){ case AppCoroutineRequest_NewFontFace: { - Face_Description *description = ((Face_Description**)vals)[0]; + Face_Description *description = out->face_description; Face *face = font_set_new_face(&models->font_set, description); - result = coroutine_run(&models->coroutines, co, &face->id, vals); + App_Coroutine_In in = {}; + in.face_id = face->id; + result = coroutine_run(&models->coroutines, co, &in, out); }break; case AppCoroutineRequest_ModifyFace: { - Face_Description *description = ((Face_Description**)vals)[0]; - Face_ID face_id = ((Face_ID*)vals)[3]; - b32 success = font_set_modify_face(&models->font_set, face_id, description); - result = coroutine_run(&models->coroutines, co, &success, vals); + Face_Description *description = out->face_description; + Face_ID face_id = out->face_id; + App_Coroutine_In in = {}; + in.success = font_set_modify_face(&models->font_set, face_id, description); + result = coroutine_run(&models->coroutines, co, &in, out); }break; } return(result); } internal Coroutine* -app_coroutine_run(Models *models, App_Coroutine_Purpose purpose, Coroutine *co, void *in, u32 *out){ +app_coroutine_run(Models *models, App_Coroutine_Purpose purpose, Coroutine *co, App_Coroutine_In *in, App_Coroutine_Out *out){ Application_Links *app = &models->app_links; App_Coroutine_State prev_state = get_state(app); app->current_coroutine = co; app->type_coroutine = purpose; - u32 coroutine_out[4] = {}; - Coroutine *result = coroutine_run(&models->coroutines, co, in, coroutine_out); - for (;result != 0 && coroutine_out[2] != 0;){ - result = app_coroutine_handle_request(models, result, coroutine_out); + Coroutine *result = coroutine_run(&models->coroutines, co, in, out); + for (;result != 0 && out->request != AppCoroutineRequest_None;){ + result = app_coroutine_handle_request(models, result, out); } - block_copy(out, coroutine_out, sizeof(*out)*2); restore_state(app, prev_state); return(result); } @@ -115,8 +116,8 @@ DELTA_RULE_SIG(fallback_scroll_rule){ internal void command_caller(Coroutine *coroutine){ - Command_In *cmd_in = (Command_In*)coroutine->in; - Models *models = cmd_in->models; + App_Coroutine_In *in = (App_Coroutine_In*)coroutine->in; + Models *models = in->models; Assert(models->command_caller != 0); models->command_caller(&models->app_links); } @@ -350,10 +351,10 @@ models_init(Thread_Context *tctx){ internal void force_abort_coroutine(Models *models, View *view){ - User_Input user_in = {}; - user_in.abort = true; - for (u32 j = 0; j < 10 && models->command_coroutine != 0; ++j){ - models->command_coroutine = app_coroutine_run(models, Co_Command, models->command_coroutine, &user_in, models->command_coroutine_flags); + App_Coroutine_In in = {}; + in.user_input.abort = true; + for (u32 j = 0; j < 100 && models->command_coroutine != 0; ++j){ + models->command_coroutine = app_coroutine_run(models, Co_Command, models->command_coroutine, &in, &models->coroutine_out); } if (models->command_coroutine != 0){ #define M "SERIOUS ERROR: command did not terminate when passed an abort" @@ -370,47 +371,16 @@ launch_command_via_event(Models *models, View *view, Input_Event *event){ Assert(models->command_coroutine == 0); Coroutine *command_coroutine = coroutine_create(&models->coroutines, command_caller); models->command_coroutine = command_coroutine; - Command_In cmd_in = {models}; + App_Coroutine_In in = {}; + in.models = models; models->event_unhandled = false; models->command_coroutine = app_coroutine_run(models, Co_Command, models->command_coroutine, - &cmd_in, models->command_coroutine_flags); - if (match_core_code(event, CoreCode_Animate)){ + &in, &models->coroutine_out); + if (match_core_code(event, CoreCode_Animate)){ models->animate_next_frame = true; } return(!models->event_unhandled); - -#if 0 - b32 result = false; - - Command_Map_ID map = view_get_map(view); - Command_Binding cmd_bind = map_get_binding_recursive(&models->mapping, map, event); - - if (cmd_bind.custom != 0){ - result = true; - block_copy_struct(&models->event, event); - - Assert(models->command_coroutine == 0); - Coroutine *command_coroutine = coroutine_create(&models->coroutines, command_caller); - models->command_coroutine = command_coroutine; - - Command_In cmd_in = {}; - cmd_in.models = models; - cmd_in.bind = cmd_bind; - - models->event_unhandled = false; - models->command_coroutine = app_coroutine_run(models, Co_Command, models->command_coroutine, &cmd_in, models->command_coroutine_flags); - if (models->event_unhandled){ - result = false; - } - - if (match_core_code(event, CoreCode_Animate)){ - models->animate_next_frame = true; - } - } - - return(result); -#endif } internal void @@ -841,17 +811,17 @@ App_Step_Sig(app_step){ block_copy_struct(&models->event, event); Coroutine *command_coroutine = models->command_coroutine; - Event_Property abort_flags = models->command_coroutine_flags[1]; - Event_Property get_flags = models->command_coroutine_flags[0] | abort_flags; + App_Coroutine_Out *co_out = &models->coroutine_out; + Event_Property abort_flags = co_out->abort_flags; + Event_Property get_flags = co_out->get_flags|abort_flags; Event_Property event_flags = get_event_properties(event); - if ((get_flags & event_flags) != 0){ - User_Input user_in = {}; - user_in.event = *event; - user_in.abort = ((abort_flags & event_flags) != 0); - + if ((get_flags&event_flags) != 0){ + App_Coroutine_In in = {}; + in.user_input.event = *event; + in.user_input.abort = ((abort_flags & event_flags) != 0); models->event_unhandled = false; - models->command_coroutine = app_coroutine_run(models, Co_Command, command_coroutine, &user_in, models->command_coroutine_flags); + models->command_coroutine = app_coroutine_run(models, Co_Command, command_coroutine, &in, &models->coroutine_out); if (!HasFlag(event_flags, EventProperty_Animate)){ models->animate_next_frame = true; } diff --git a/4ed_api_implementation.cpp b/4ed_api_implementation.cpp index 774d29eb..73d86237 100644 --- a/4ed_api_implementation.cpp +++ b/4ed_api_implementation.cpp @@ -2088,10 +2088,13 @@ get_user_input(Application_Links *app, Event_Property get_properties, Event_Prop if (app->type_coroutine == Co_Command){ Coroutine *coroutine = (Coroutine*)app->current_coroutine; Assert(coroutine != 0); - ((u32*)coroutine->out)[0] = get_properties; - ((u32*)coroutine->out)[1] = abort_properties; + App_Coroutine_Out *out = (App_Coroutine_Out*)coroutine->out; + out->request = AppCoroutineRequest_None; + out->get_flags = get_properties; + out->abort_flags = abort_properties; coroutine_yield(coroutine); - result = *(User_Input*)coroutine->in; + App_Coroutine_In *in = (App_Coroutine_In*)coroutine->in; + result = in->user_input; } return(result); } @@ -2549,10 +2552,12 @@ try_create_new_face(Application_Links *app, Face_Description *description) if (is_running_coroutine(app)){ Coroutine *coroutine = (Coroutine*)app->current_coroutine; Assert(coroutine != 0); - ((Face_Description**)coroutine->out)[0] = description; - ((u32*)coroutine->out)[2] = AppCoroutineRequest_NewFontFace; + App_Coroutine_Out *out = (App_Coroutine_Out*)coroutine->out; + out->request = AppCoroutineRequest_NewFontFace; + out->face_description = description; coroutine_yield(coroutine); - result = *(Face_ID*)(coroutine->in); + App_Coroutine_In *in = (App_Coroutine_In*)coroutine->in; + result = in->face_id; } else{ Face *new_face = font_set_new_face(&models->font_set, description); @@ -2569,11 +2574,13 @@ try_modify_face(Application_Links *app, Face_ID id, Face_Description *descriptio if (is_running_coroutine(app)){ Coroutine *coroutine = (Coroutine*)app->current_coroutine; Assert(coroutine != 0); - ((Face_Description**)coroutine->out)[0] = description; - ((u32*)coroutine->out)[2] = AppCoroutineRequest_ModifyFace; - ((u32*)coroutine->out)[3] = id; + App_Coroutine_Out *out = (App_Coroutine_Out*)coroutine->out; + out->request = AppCoroutineRequest_NewFontFace; + out->face_description = description; + out->face_id = id; coroutine_yield(coroutine); - result = *(b32*)(coroutine->in); + App_Coroutine_In *in = (App_Coroutine_In*)coroutine->in; + result = in->success; } else{ result = font_set_modify_face(&models->font_set, id, description); diff --git a/4ed_app_models.h b/4ed_app_models.h index db790de6..ba854f3a 100644 --- a/4ed_app_models.h +++ b/4ed_app_models.h @@ -34,6 +34,36 @@ enum App_State{ APP_STATE_COUNT }; +struct App_Coroutine_In{ + union{ + struct Models *models; + User_Input user_input; + Face_ID face_id; + b32 success; + }; +}; + +typedef i32 App_Coroutine_Request; +enum{ + AppCoroutineRequest_None = 0, + AppCoroutineRequest_NewFontFace = 1, + AppCoroutineRequest_ModifyFace = 2, +}; + +struct App_Coroutine_Out{ + App_Coroutine_Request request; + union{ + struct{ + Event_Property get_flags; + Event_Property abort_flags; + }; + struct{ + Face_Description *face_description; + Face_ID face_id; + }; + }; +}; + struct Models{ Thread_Context *tctx; @@ -47,7 +77,7 @@ struct Models{ Coroutine_Group coroutines; Coroutine *command_coroutine; - u32 command_coroutine_flags[2]; + App_Coroutine_Out coroutine_out; Child_Process_Container child_processes; Custom_API config_api; @@ -163,10 +193,6 @@ struct App_Coroutine_State{ i32 type; }; -struct Command_In{ - Models *models; -}; - struct File_Init{ String_Const_u8 name; Editing_File **ptr; @@ -194,12 +220,6 @@ enum Command_Line_Mode{ CLMode_Custom }; -enum{ - AppCoroutineRequest_None = 0, - AppCoroutineRequest_NewFontFace = 1, - AppCoroutineRequest_ModifyFace = 2, -}; - #endif // BOTTOM