LdH::abort

This commit is contained in:
Andrew Golovashevich 2025-10-28 08:25:59 +03:00
parent 78702435a7
commit f62215635b
3 changed files with 23 additions and 14 deletions

View File

@ -29,6 +29,13 @@ namespace LdH {
std::cerr << this->formatOutput();
}
};
export
[[noreturn]]
void abort(char const *msg) {
std::cerr << "Fatal error:\n" << (Exception{msg}).formatOutput() << std::endl;
std::abort();
}
}
module : private;

View File

@ -166,7 +166,7 @@ LdH::CommonHighLevelThreadWrapper<native_wrapper_t> &LdH::CommonHighLevelThreadW
case _thread_state_RUNNING:
case _thread_state_JOINING:
case _thread_state_JOINED:
throw LdH::Exception{"Variable already initialized"};
LdH::abort("Variable already initialized");
}
new(this)CommonHighLevelThreadWrapper{std::move(other)};
return *this;
@ -176,16 +176,16 @@ template<class native_wrapper_t> requires LdH::NativeHighLevelThreadWrapper<nati
void LdH::CommonHighLevelThreadWrapper<native_wrapper_t>::join() {
switch (this->_cas_state(_thread_state_RUNNING, _thread_state_JOINING)) {
case _thread_state_UNINITIALIZED:
throw LdH::Exception{"Variable not initialized"};
LdH::abort("Variable not initialized");
case _thread_state_RUNNING:
break;
case _thread_state_JOINING:
case _thread_state_JOINED:
throw LdH::Exception{"Thread already joined"};
LdH::abort("Thread already joined");
case _thread_state_DESTROYED:
throw LdH::Exception{"Thread already destroyed"};
LdH::abort("Thread already destroyed");
case _thread_state_MOVED:
throw LdH::Exception{"Content of this variable was moved to another variable"};
LdH::abort("Content of this variable was moved to another variable");
break;
}
@ -197,16 +197,16 @@ template<class native_wrapper_t> requires LdH::NativeHighLevelThreadWrapper<nati
void LdH::CommonHighLevelThreadWrapper<native_wrapper_t>::destroy() {
switch (this->_cas_state(_thread_state_JOINED, _thread_state_DESTROYED)) {
case _thread_state_UNINITIALIZED:
throw LdH::Exception{"Variable not initialized"};
LdH::abort("Variable not initialized");
case _thread_state_RUNNING:
case _thread_state_JOINING:
throw LdH::Exception{"Thread not finished yet"};
LdH::abort("Thread not finished yet");
case _thread_state_JOINED:
break;
case _thread_state_DESTROYED:
throw LdH::Exception{"Thread already destroyed"};
LdH::abort("Thread already destroyed");
case _thread_state_MOVED:
throw LdH::Exception{"Content of this variable was moved to another variable"};
LdH::abort("Content of this variable was moved to another variable");
}
this->_native.destroy();
}
@ -219,9 +219,9 @@ LdH::CommonHighLevelThreadWrapper<native_wrapper_t>::~CommonHighLevelThreadWrapp
break;
case _thread_state_RUNNING:
case _thread_state_JOINING:
throw LdH::Exception{"Thread not finished yet"};
LdH::abort("Thread not finished yet");
case _thread_state_JOINED:
throw LdH::Exception{"Thread not destroyed yet"};
LdH::abort("Thread not destroyed yet");
case _thread_state_DESTROYED:
break;
case _thread_state_MOVED:

View File

@ -32,11 +32,11 @@ namespace LdH {
case WAIT_TIMEOUT:
continue;
case WAIT_ABANDONED:
throw LdH::Exception{"Unexpected return WAIT_ABANDONED of WaitForSingleObject"};
LdH::abort("Unexpected return WAIT_ABANDONED of WaitForSingleObject");
case WAIT_OBJECT_0:
return;
default:
throw LdH::Exception{"Unexpected return of WaitForSingleObject"};
LdH::abort("Unexpected return of WaitForSingleObject");
}
}
}
@ -79,9 +79,11 @@ namespace LdH {
static DWORD kernel_ret() {
return 0;
}
private:
explicit NativeThreadWrapperForWindows(HANDLE hThread) : _hThread{hThread} {
}
public:
static NativeThreadWrapperForWindows start(std::string &, DWORD (*kernel)(void *), void *kernel_arg) {
HANDLE hThread = CreateThread(