Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 5 additions & 8 deletions applications/services/cli/cli_vcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,11 @@ static void cli_vcp_internal_event_happened(FuriEventLoopObject* object, void* c
pipe_detach_from_event_loop(cli_vcp->own_pipe);
pipe_free(cli_vcp->own_pipe);
cli_vcp->own_pipe = NULL;

// wait for shell to stop
cli_shell_join(cli_vcp->shell);
cli_shell_free(cli_vcp->shell);
pipe_free(cli_vcp->shell_pipe);
break;
}

Expand All @@ -226,14 +231,6 @@ static void cli_vcp_internal_event_happened(FuriEventLoopObject* object, void* c
FURI_LOG_D(TAG, "Connected");
cli_vcp->is_connected = true;

// wait for previous shell to stop
furi_check(!cli_vcp->own_pipe);
if(cli_vcp->shell) {
cli_shell_join(cli_vcp->shell);
cli_shell_free(cli_vcp->shell);
pipe_free(cli_vcp->shell_pipe);
}

// start shell thread
PipeSideBundle bundle = pipe_alloc(VCP_BUF_SIZE, 1);
cli_vcp->own_pipe = bundle.alices_side;
Expand Down
16 changes: 11 additions & 5 deletions lib/toolbox/cli/shell/cli_shell.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@

#define TAG "CliShell"

#define ANSI_TIMEOUT_MS 10
#define ANSI_TIMEOUT_MS 10
#define TRANSIENT_SESSION_WINDOW_MS 100

typedef enum {
CliShellComponentCompletions,
Expand Down Expand Up @@ -415,10 +416,15 @@ static void cli_shell_deinit(CliShell* shell) {
static int32_t cli_shell_thread(void* context) {
CliShell* shell = context;

// Sometimes, the other side closes the pipe even before our thread is started. Although the
// rest of the code will eventually find this out if this check is removed, there's no point in
// wasting time.
if(pipe_state(shell->pipe) == PipeStateBroken) return 0;
// Sometimes, the other side (e.g. qFlipper) closes the pipe even before our thread is started.
// Although the rest of the code will eventually find this out if this check is removed,
// there's no point in wasting time. This gives qFlipper a chance to quickly close and re-open
// the session.
const size_t delay_step = 10;
for(size_t i = 0; i < TRANSIENT_SESSION_WINDOW_MS / delay_step; i++) {
furi_delay_ms(delay_step);
if(pipe_state(shell->pipe) == PipeStateBroken) return 0;
}

cli_shell_init(shell);
FURI_LOG_D(TAG, "Started");
Expand Down
Loading