[PATCH 2/4] msvcrt: Use trampoline for _beginthreadex().
Piotr Caban
piotr.caban at gmail.com
Mon May 3 10:44:59 CDT 2021
Hi Arek,
On 5/3/21 3:44 PM, Arkadiusz Hiler wrote:
> +/*********************************************************************
> + * _beginthreadex_trampoline
> + */
> +static DWORD CALLBACK _beginthreadex_trampoline(LPVOID arg)
> +{
> + unsigned int retval;
> + _beginthread_trampoline_t local_trampoline;
> + thread_data_t *data = msvcrt_get_thread_data();
> +
> + memcpy(&local_trampoline,arg,sizeof(local_trampoline));
Please add spaces between arguments.
> /*********************************************************************
> * _beginthreadex (MSVCRT.@)
> */
> @@ -157,12 +177,30 @@ uintptr_t CDECL _beginthreadex(
> unsigned int initflag, /* [in] Initial state of new thread (0 for running or CREATE_SUSPEND for suspended) */
> unsigned int *thrdaddr) /* [out] Points to a 32-bit variable that receives the thread identifier */
> {
> + _beginthread_trampoline_t* trampoline;
> + HANDLE thread;
> +
> TRACE("(%p, %d, %p, %p, %d, %p)\n", security, stack_size, start_address, arglist, initflag, thrdaddr);
>
> - /* FIXME */
> - return (uintptr_t)CreateThread(security, stack_size,
> - start_address, arglist,
> - initflag, thrdaddr);
> + trampoline = malloc(sizeof(*trampoline));
> + if(!trampoline) {
> + *_errno() = EAGAIN;
> + return -1;
malloc already sets errno. Resetting it to EAGAIN looks questionable.
The function should also return 0 on error.
> + trampoline->thread = INVALID_HANDLE_VALUE;
> + trampoline->start_address_ex = start_address;
> + trampoline->arglist = arglist;
> +
> + thread = CreateThread(security, stack_size, _beginthreadex_trampoline,
> + trampoline, initflag, thrdaddr);
> + if(!thread) {
> + free(trampoline);
> + *_errno() = EAGAIN;
> + return -1;
It should probably do something like:
msvcrt_set_errno(GetLastError());
return 0;
It would be nice to do similar changes in _beginthread() as well.
Thanks,
Piotr
More information about the wine-devel
mailing list