mirror of
https://github.com/RGBCube/serenity
synced 2025-05-14 09:24:57 +00:00
Tests: Add a test for pthread_cancel
This commit is contained in:
parent
c85f307e62
commit
8ab1245e4a
1 changed files with 38 additions and 0 deletions
|
@ -6,6 +6,7 @@
|
|||
|
||||
#include <LibTest/TestCase.h>
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define TEST_CASE_IN_PTHREAD(x) \
|
||||
static void* __TESTCASE_FUNC(x##__inner)(void*); \
|
||||
|
@ -86,3 +87,40 @@ TEST_CASE_IN_PTHREAD(cancel_type_invalid)
|
|||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static void cancel_clenaup_handler(void* data)
|
||||
{
|
||||
(*static_cast<bool*>(data)) = true;
|
||||
}
|
||||
|
||||
static void* cancel_inner(void* data)
|
||||
{
|
||||
pthread_cleanup_push(cancel_clenaup_handler, data);
|
||||
|
||||
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, nullptr);
|
||||
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, nullptr);
|
||||
|
||||
// Sleep for a second until the other side sets up their end of the check,
|
||||
// then do a call to write, which should be a cancellation point.
|
||||
sleep(1);
|
||||
write(STDOUT_FILENO, nullptr, 0);
|
||||
|
||||
pthread_exit(nullptr);
|
||||
}
|
||||
|
||||
TEST_CASE(cancel)
|
||||
{
|
||||
pthread_t thread;
|
||||
|
||||
bool called_cleanup_handler = false;
|
||||
pthread_create(&thread, nullptr, cancel_inner, &called_cleanup_handler);
|
||||
|
||||
int rc = pthread_cancel(thread);
|
||||
|
||||
void* exit_code;
|
||||
pthread_join(thread, &exit_code);
|
||||
|
||||
EXPECT_EQ(rc, 0);
|
||||
EXPECT_EQ(called_cleanup_handler, true);
|
||||
EXPECT_EQ(exit_code, PTHREAD_CANCELED);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue