From: Piotr Caban Subject: [PATCH 2/2] msvcp110: Add _Throw_C_error implementation. Message-Id: <848dc2a7-e503-03eb-da04-84bc603d3714@codeweavers.com> Date: Thu, 11 Feb 2021 13:49:13 +0100 Implementation based on https://github.com/microsoft/STL/blob/main/stl/src/thread0.cpp Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46483 Signed-off-by: Piotr Caban --- dlls/msvcp110/msvcp110.spec | 2 +- dlls/msvcp120/msvcp120.spec | 2 +- dlls/msvcp120_app/msvcp120_app.spec | 2 +- dlls/msvcp140/msvcp140.spec | 2 +- dlls/msvcp90/misc.c | 36 +++++++++++++++++++++++++++++ 5 files changed, 40 insertions(+), 4 deletions(-) diff --git a/dlls/msvcp110/msvcp110.spec b/dlls/msvcp110/msvcp110.spec index 40cd6370dd3..13ce6c2cc3d 100644 --- a/dlls/msvcp110/msvcp110.spec +++ b/dlls/msvcp110/msvcp110.spec @@ -1778,7 +1778,7 @@ @ extern ?_Sync@ios_base@std@@0_NA ios_base_Sync @ cdecl -arch=win32 ?_Syserror_map@std@@YAPBDH@Z(long) _Syserror_map @ cdecl -arch=win64 ?_Syserror_map@std@@YAPEBDH@Z(long) _Syserror_map -@ stub ?_Throw_C_error@std@@YAXH@Z +@ cdecl ?_Throw_C_error@std@@YAXH@Z(long) _Throw_C_error @ cdecl ?_Throw_Cpp_error@std@@YAXH@Z(long) _Throw_Cpp_error @ stub -arch=win32 ?_Throw_future_error@std@@YAXABVerror_code@1@@Z @ stub -arch=win64 ?_Throw_future_error@std@@YAXAEBVerror_code@1@@Z diff --git a/dlls/msvcp120/msvcp120.spec b/dlls/msvcp120/msvcp120.spec index c21895eecf5..e2ff6ddef2e 100644 --- a/dlls/msvcp120/msvcp120.spec +++ b/dlls/msvcp120/msvcp120.spec @@ -1739,7 +1739,7 @@ @ extern ?_Sync@ios_base@std@@0_NA ios_base_Sync @ cdecl -arch=win32 ?_Syserror_map@std@@YAPBDH@Z(long) _Syserror_map @ cdecl -arch=win64 ?_Syserror_map@std@@YAPEBDH@Z(long) _Syserror_map -@ stub ?_Throw_C_error@std@@YAXH@Z +@ cdecl ?_Throw_C_error@std@@YAXH@Z(long) _Throw_C_error @ cdecl ?_Throw_Cpp_error@std@@YAXH@Z(long) _Throw_Cpp_error @ stub -arch=win32 ?_Throw_future_error@std@@YAXABVerror_code@1@@Z @ stub -arch=win64 ?_Throw_future_error@std@@YAXAEBVerror_code@1@@Z diff --git a/dlls/msvcp120_app/msvcp120_app.spec b/dlls/msvcp120_app/msvcp120_app.spec index 00fa5592ac5..51b5f96f822 100644 --- a/dlls/msvcp120_app/msvcp120_app.spec +++ b/dlls/msvcp120_app/msvcp120_app.spec @@ -1739,7 +1739,7 @@ @ extern ?_Sync@ios_base@std@@0_NA msvcp120.?_Sync@ios_base@std@@0_NA @ cdecl -arch=win32 ?_Syserror_map@std@@YAPBDH@Z(long) msvcp120.?_Syserror_map@std@@YAPBDH@Z @ cdecl -arch=win64 ?_Syserror_map@std@@YAPEBDH@Z(long) msvcp120.?_Syserror_map@std@@YAPEBDH@Z -@ stub ?_Throw_C_error@std@@YAXH@Z +@ cdecl ?_Throw_C_error@std@@YAXH@Z(long) msvcp120.?_Throw_C_error@std@@YAXH@Z @ cdecl ?_Throw_Cpp_error@std@@YAXH@Z(long) msvcp120.?_Throw_Cpp_error@std@@YAXH@Z @ stub -arch=win32 ?_Throw_future_error@std@@YAXABVerror_code@1@@Z @ stub -arch=win64 ?_Throw_future_error@std@@YAXAEBVerror_code@1@@Z diff --git a/dlls/msvcp140/msvcp140.spec b/dlls/msvcp140/msvcp140.spec index 2b0bf5ffa5e..a22f179a3c4 100644 --- a/dlls/msvcp140/msvcp140.spec +++ b/dlls/msvcp140/msvcp140.spec @@ -1623,7 +1623,7 @@ @ extern ?_Sync@ios_base@std@@0_NA ios_base_Sync @ cdecl -arch=win32 ?_Syserror_map@std@@YAPBDH@Z(long) _Syserror_map @ cdecl -arch=win64 ?_Syserror_map@std@@YAPEBDH@Z(long) _Syserror_map -@ stub ?_Throw_C_error@std@@YAXH@Z +@ cdecl ?_Throw_C_error@std@@YAXH@Z(long) _Throw_C_error @ cdecl ?_Throw_Cpp_error@std@@YAXH@Z(long) _Throw_Cpp_error @ stub -arch=win32 ?_Throw_future_error@std@@YAXABVerror_code@1@@Z @ stub -arch=win64 ?_Throw_future_error@std@@YAXAEBVerror_code@1@@Z diff --git a/dlls/msvcp90/misc.c b/dlls/msvcp90/misc.c index 7978b87777a..2f086676d4b 100644 --- a/dlls/msvcp90/misc.c +++ b/dlls/msvcp90/misc.c @@ -195,6 +195,17 @@ static const struct { {EWOULDBLOCK, str_EWOULDBLOCK}, }; +/* _Throw_Cpp_error error codes */ +enum { + _DEVICE_OR_RESOURCE_BUSY, + _INVALID_ARGUMENT, + _NO_SUCH_PROCESS, + _NOT_ENOUGH_MEMORY, + _OPERATION_NOT_PERMITTED, + _RESOURCE_DEADLOCK_WOULD_OCCUR, + _RESOURCE_UNAVAILABLE_TRY_AGAIN +}; + static const struct { int err; const char *msg; @@ -2893,6 +2904,31 @@ void __cdecl _Throw_Cpp_error(int code) sprintf(msg, "%s: %s", _Syserror_map(cpp_error[code].err), cpp_error[code].msg); throw_exception(EXCEPTION_SYSTEM_ERROR, cpp_error[code].err, msg); } + +enum +{ + _Thrd_success, + _Thrd_nomem, + _Thrd_timedout, + _Thrd_busy, + _Thrd_error +}; + +void __cdecl _Throw_C_error(int code) +{ + switch(code) + { + case _Thrd_nomem: + case _Thrd_timedout: + _Throw_Cpp_error(_RESOURCE_UNAVAILABLE_TRY_AGAIN); + case _Thrd_busy: + _Throw_Cpp_error(_DEVICE_OR_RESOURCE_BUSY); + case _Thrd_error: + _Throw_Cpp_error(_INVALID_ARGUMENT); + default: + abort(); + } +} #endif #if _MSVCP_VER >= 140