Module: wine Branch: master Commit: 90307e067f985f5963b62829993b320537578333 URL: http://source.winehq.org/git/wine.git/?a=commit;h=90307e067f985f5963b6282999...
Author: Piotr Caban piotr@codeweavers.com Date: Mon Mar 27 10:26:54 2017 +0200
msvcrt: Add helper for exception throwing.
Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/msvcrt/cpp.c | 38 +++++++++++++++++++------------------- dlls/msvcrt/heap.c | 2 +- dlls/msvcrt/lock.c | 8 ++++---- dlls/msvcrt/msvcrt.h | 11 +++++++---- dlls/msvcrt/scheduler.c | 4 ++-- 5 files changed, 33 insertions(+), 30 deletions(-)
diff --git a/dlls/msvcrt/cpp.c b/dlls/msvcrt/cpp.c index 70f5cb5..b69ff9a 100644 --- a/dlls/msvcrt/cpp.c +++ b/dlls/msvcrt/cpp.c @@ -880,27 +880,27 @@ void msvcrt_init_exception(void *base) }
#if _MSVCR_VER >= 80 -void throw_bad_alloc(const char *str) +void throw_exception(exception_type et, HRESULT hr, const char *str) { - bad_alloc e; - bad_alloc_ctor(&e, &str); - _CxxThrowException(&e, &bad_alloc_exception_type); -} -#endif - + switch(et) { + case EXCEPTION_BAD_ALLOC: { + bad_alloc e; + bad_alloc_ctor(&e, &str); + _CxxThrowException(&e, &bad_alloc_exception_type); + } #if _MSVCR_VER >= 100 -void throw_scheduler_resource_allocation_error(const char *str, HRESULT hr) -{ - scheduler_resource_allocation_error e; - scheduler_resource_allocation_error_ctor_name(&e, str, hr); - _CxxThrowException(&e.e, &scheduler_resource_allocation_error_exception_type); -} - -void throw_improper_lock(const char *str) -{ - improper_lock e; - improper_lock_ctor_str(&e, str); - _CxxThrowException(&e, &improper_lock_exception_type); + case EXCEPTION_SCHEDULER_RESOURCE_ALLOCATION_ERROR: { + scheduler_resource_allocation_error e; + scheduler_resource_allocation_error_ctor_name(&e, str, hr); + _CxxThrowException(&e.e, &scheduler_resource_allocation_error_exception_type); + } + case EXCEPTION_IMPROPER_LOCK: { + improper_lock e; + improper_lock_ctor_str(&e, str); + _CxxThrowException(&e, &improper_lock_exception_type); + } +#endif + } } #endif
diff --git a/dlls/msvcrt/heap.c b/dlls/msvcrt/heap.c index 3ae2599..ed41253 100644 --- a/dlls/msvcrt/heap.c +++ b/dlls/msvcrt/heap.c @@ -151,7 +151,7 @@ void* CDECL MSVCRT_operator_new(MSVCRT_size_t size)
TRACE("(%ld) out of memory\n", size); #if _MSVCR_VER >= 80 - throw_bad_alloc("bad allocation"); + throw_exception(EXCEPTION_BAD_ALLOC, 0, "bad allocation"); #endif return NULL; } diff --git a/dlls/msvcrt/lock.c b/dlls/msvcrt/lock.c index c2efae1..f4cf558 100644 --- a/dlls/msvcrt/lock.c +++ b/dlls/msvcrt/lock.c @@ -763,7 +763,7 @@ int __cdecl event_wait_for_multiple(event **events, MSVCRT_size_t count, MSVCRT_
wait = heap_alloc(FIELD_OFFSET(thread_wait, entries[count])); if(!wait) - throw_bad_alloc("bad allocation"); + throw_exception(EXCEPTION_BAD_ALLOC, 0, "bad allocation"); ret = evt_wait(wait, events, count, wait_all, timeout); heap_free(wait);
@@ -846,7 +846,7 @@ MSVCRT_bool __thiscall _Condition_variable_wait_for(_Condition_variable *this, TRACE("(%p %p %d)\n", this, cs, timeout);
if(!(q = HeapAlloc(GetProcessHeap(), 0, sizeof(cv_queue)))) { - throw_bad_alloc("bad allocation"); + throw_exception(EXCEPTION_BAD_ALLOC, 0, "bad allocation"); }
critical_section_lock(&this->lock); @@ -1026,7 +1026,7 @@ void __thiscall reader_writer_lock_lock(reader_writer_lock *this) TRACE("(%p)\n", this);
if (this->thread_id == GetCurrentThreadId()) - throw_improper_lock("Already locked"); + throw_exception(EXCEPTION_IMPROPER_LOCK, 0, "Already locked");
last = InterlockedExchangePointer((void**)&this->writer_tail, &q); if (last) { @@ -1057,7 +1057,7 @@ void __thiscall reader_writer_lock_lock_read(reader_writer_lock *this) TRACE("(%p)\n", this);
if (this->thread_id == GetCurrentThreadId()) - throw_improper_lock("Already locked as writer"); + throw_exception(EXCEPTION_IMPROPER_LOCK, 0, "Already locked as writer");
do { q.next = this->reader_head; diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h index 775ee0c..2b9d229 100644 --- a/dlls/msvcrt/msvcrt.h +++ b/dlls/msvcrt/msvcrt.h @@ -283,11 +283,14 @@ extern WORD MSVCRT__ctype [257];
void msvcrt_set_errno(int) DECLSPEC_HIDDEN; #if _MSVCR_VER >= 80 -void throw_bad_alloc(const char*) DECLSPEC_HIDDEN; -#endif +typedef enum { + EXCEPTION_BAD_ALLOC, #if _MSVCR_VER >= 100 -void throw_scheduler_resource_allocation_error(const char*, HRESULT) DECLSPEC_HIDDEN; -void throw_improper_lock(const char*) DECLSPEC_HIDDEN; + EXCEPTION_SCHEDULER_RESOURCE_ALLOCATION_ERROR, + EXCEPTION_IMPROPER_LOCK, +#endif +} exception_type; +void throw_exception(exception_type, HRESULT, const char*) DECLSPEC_HIDDEN; #endif
void __cdecl _purecall(void); diff --git a/dlls/msvcrt/scheduler.c b/dlls/msvcrt/scheduler.c index 5d31d58..9551810 100644 --- a/dlls/msvcrt/scheduler.c +++ b/dlls/msvcrt/scheduler.c @@ -99,8 +99,8 @@ static Context* get_current_context(void) if (context_tls_index == TLS_OUT_OF_INDEXES) { int tls_index = TlsAlloc(); if (tls_index == TLS_OUT_OF_INDEXES) { - throw_scheduler_resource_allocation_error(NULL, - HRESULT_FROM_WIN32(GetLastError())); + throw_exception(EXCEPTION_SCHEDULER_RESOURCE_ALLOCATION_ERROR, + HRESULT_FROM_WIN32(GetLastError()), NULL); return NULL; }