[PATCH 1/2] msvcrt: Lazily initialize console handles.

Piotr Caban piotr.caban at gmail.com
Fri Mar 12 06:40:18 CST 2021


On 3/12/21 1:31 PM, Rémi Bernon wrote:
> On 3/12/21 1:27 PM, Piotr Caban wrote:
>> Hi Rémi,
>>
>> On 3/12/21 11:02 AM, Rémi Bernon wrote:
>>> +static HANDLE msvcrt_input_console(void)
>>>   {
>>
>>> +  HANDLE console;
>>> +  LOCK_CONSOLE;
>>> +  if (!MSVCRT_console_in)
>>> +  {
>>> +    MSVCRT_console_in = CreateFileA("CONIN$", 
>>> GENERIC_WRITE|GENERIC_READ,
>>> +                                    FILE_SHARE_WRITE|FILE_SHARE_READ,
>>> +                                    NULL, OPEN_EXISTING, 0, NULL);
>>> +    if (MSVCRT_console_in == INVALID_HANDLE_VALUE)
>>> +      WARN("Input console handle initialization failed!\n");
>>> +  }
>>> +  console = MSVCRT_console_in;
>>> +  UNLOCK_CONSOLE;
>>> +  return console;
>>> +}
>> I think that the caller should be responsible for locking. It's 
>> especially important for the _nolock functions that shouldn't lock at 
>> all.
>>
>> Thanks,
>> Piotr
> 
> Ah alright, so how should these be handled? We could also probably make 
> the helper lockfree with interlocked exchange.

You can just remove the LOCK_CONSOLE/UNLOCK_CONSOLE from the 
msvcrt_input_console/msvcrt_output_console functions (it also makes the 
console handle not needed). In case of _nolock function the application 
is responsible for making sure the functions are called in thread-safe 
contexts.



More information about the wine-devel mailing list