Skip to content

Commit

Permalink
win32: fix thread usage for win32
Browse files Browse the repository at this point in the history
Use pthread_exit instead of async_exit.

This means we do not have
to deal with Windows's implementation
requiring an unsigned exit coded
despite the POSIX exit code requiring
a signed exit code.

Use _beginthreadex instead of CreateThread
since we use the Windows CRT.

Finally, check for NULL handles, not "INVALID_HANDLE,"
as _beginthreadex guarantees a valid handle in most cases

Signed-off-by: Seija Kijin <doremylover123@gmail.com>
  • Loading branch information
GameCubeGBA authored and RSilicon committed Jan 21, 2023
1 parent 904d404 commit f5de6bf
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 24 deletions.
2 changes: 1 addition & 1 deletion compat/mingw.c
Original file line number Diff line number Diff line change
Expand Up @@ -2295,7 +2295,7 @@ static int start_timer_thread(void)
timer_event = CreateEvent(NULL, FALSE, FALSE, NULL);
if (timer_event) {
timer_thread = (HANDLE) _beginthreadex(NULL, 0, ticktack, NULL, 0, NULL);
if (!timer_thread )
if (!timer_thread)
return errno = ENOMEM,
error("cannot start timer thread");
} else
Expand Down
8 changes: 4 additions & 4 deletions compat/winansi.c
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,7 @@ enum {
TEXT = 0, ESCAPE = 033, BRACKET = '['
};

static DWORD WINAPI console_thread(LPVOID unused)
static unsigned int WINAPI console_thread(LPVOID unused)
{
unsigned char buffer[BUFFER_SIZE];
DWORD bytes;
Expand Down Expand Up @@ -643,9 +643,9 @@ void winansi_init(void)
die_lasterr("CreateFile for named pipe failed");

/* start console spool thread on the pipe's read end */
hthread = CreateThread(NULL, 0, console_thread, NULL, 0, NULL);
if (hthread == INVALID_HANDLE_VALUE)
die_lasterr("CreateThread(console_thread) failed");
hthread = (HANDLE)_beginthreadex(NULL, 0, console_thread, NULL, 0, NULL);
if (!hthread)
die_lasterr("_beginthreadex(console_thread) failed");

/* schedule cleanup routine */
if (atexit(winansi_exit))
Expand Down
33 changes: 14 additions & 19 deletions run-command.c
Original file line number Diff line number Diff line change
Expand Up @@ -1030,6 +1030,13 @@ static void *run_thread(void *data)
return (void *)ret;
}

int in_async(void)
{
if (!main_thread_set)
return 0; /* no asyncs started yet */
return !pthread_equal(main_thread, pthread_self());
}

static NORETURN void die_async(const char *err, va_list params)
{
report_fn die_message_fn = get_die_message_routine();
Expand All @@ -1055,18 +1062,6 @@ static int async_die_is_recursing(void)
return ret != NULL;
}

int in_async(void)
{
if (!main_thread_set)
return 0; /* no asyncs started yet */
return !pthread_equal(main_thread, pthread_self());
}

static void NORETURN async_exit(int code)
{
pthread_exit((void *)(intptr_t)code);
}

#else

static struct {
Expand Down Expand Up @@ -1112,18 +1107,18 @@ int in_async(void)
return process_is_async;
}

static void NORETURN async_exit(int code)
{
exit(code);
}

#endif

void check_pipe(int err)
{
if (err == EPIPE) {
if (in_async())
async_exit(141);
if (in_async()) {
#ifdef NO_PTHREADS
exit(141);
#else
pthread_exit((void *)141);
#endif
}

signal(SIGPIPE, SIG_DFL);
raise(SIGPIPE);
Expand Down

0 comments on commit f5de6bf

Please sign in to comment.