Skip to content

Commit 825de8a

Browse files
committed
Remove Win32 console output overhead
Don't repeatedly call GetConsoleMode() on Win32 each time sim_console_write() is called. Use an output function pointer to invoke WriteConsoleA (console output) or WriteFile (output is not a console). The console output destination doesn't change during the lifetime of the simulator, so avoid extraneous overhead for each character output (sometimes strings, but mostly characters.)
1 parent b036821 commit 825de8a

1 file changed

Lines changed: 18 additions & 9 deletions

File tree

sim_console.c

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3483,9 +3483,12 @@ return SCPE_OK;
34833483
#include <fcntl.h>
34843484
#include <io.h>
34853485
#define RAW_MODE 0
3486+
typedef BOOL (WINAPI *std_output_writer_fn)(HANDLE, const void *, DWORD, LPDWORD, LPVOID);
3487+
34863488
static HANDLE std_input;
34873489
static HANDLE std_output;
34883490
static HANDLE std_error;
3491+
static std_output_writer_fn std_output_writer = NULL;
34893492
static DWORD saved_input_mode;
34903493
static DWORD saved_output_mode;
34913494
static DWORD saved_error_mode;
@@ -3537,12 +3540,19 @@ SetConsoleCtrlHandler( ControlHandler, TRUE );
35373540
std_input = GetStdHandle (STD_INPUT_HANDLE);
35383541
std_output = GetStdHandle (STD_OUTPUT_HANDLE);
35393542
std_error = GetStdHandle (STD_ERROR_HANDLE);
3543+
35403544
if ((std_input) && /* Not Background process? */
35413545
(std_input != INVALID_HANDLE_VALUE))
35423546
GetConsoleMode (std_input, &saved_input_mode); /* Save Input Mode */
35433547
if ((std_output) && /* Not Background process? */
3544-
(std_output != INVALID_HANDLE_VALUE))
3545-
GetConsoleMode (std_output, &saved_output_mode); /* Save Output Mode */
3548+
(std_output != INVALID_HANDLE_VALUE)) { /* Save Output Mode */
3549+
std_output_writer = GetConsoleMode(std_output, &saved_output_mode)
3550+
? WriteConsoleA
3551+
: (std_output_writer_fn) WriteFile;
3552+
} else {
3553+
/* Default to something resonable... */
3554+
std_output_writer = (std_output_writer_fn) WriteFile;
3555+
}
35463556
if ((std_error) && /* Not Background process? */
35473557
(std_error != INVALID_HANDLE_VALUE))
35483558
GetConsoleMode (std_error, &saved_error_mode); /* Save Output Mode */
@@ -3690,16 +3700,15 @@ return (WAIT_OBJECT_0 == WaitForSingleObject (std_input, ms_timeout));
36903700
static uint8 out_buf[ESC_HOLD_MAX]; /* Buffered characters pending output */
36913701
static int32 out_ptr = 0;
36923702

3693-
static void sim_console_write(uint8 *outbuf, int32 outsz)
3703+
static inline void sim_console_write(uint8 *outbuf, int32 outsz)
36943704
{
36953705
DWORD unused;
3696-
DWORD mode;
3706+
BOOL result;
36973707

3698-
if (GetConsoleMode(std_output, &mode)) {
3699-
WriteConsoleA(std_output, outbuf, outsz, &unused, NULL);
3700-
} else {
3701-
BOOL result = WriteFile(std_output, outbuf, outsz, &unused, NULL);
3702-
}
3708+
/* Useful to see the return value from std_output_writer. */
3709+
result = std_output_writer(std_output, outbuf, outsz, &unused, NULL);
3710+
/* But squelch the set-but-not-used warnings. */
3711+
(void) result;
37033712
}
37043713

37053714
static t_stat sim_out_hold_svc (UNIT *uptr)

0 commit comments

Comments
 (0)