diff options
author | Luca Dariz <luca@orpolo.org> | 2024-08-21 18:36:16 +0200 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2024-08-22 23:49:01 +0200 |
commit | ca7f98dab6ae77802a7d861ad76d9c4a4700b084 (patch) | |
tree | b5a8c718a2c69b8fc3b29fa7bb7960f2c6095e24 /tests/test-machmsg.c | |
parent | 384679f9e0c3243f452322174d7d3eef5354baf2 (diff) | |
download | gnumach-ca7f98dab6ae77802a7d861ad76d9c4a4700b084.tar.gz gnumach-ca7f98dab6ae77802a7d861ad76d9c4a4700b084.tar.bz2 gnumach-ca7f98dab6ae77802a7d861ad76d9c4a4700b084.zip |
add rpc interrupted test
* tests/test-machmsg.c: add two use cases used by glibc during signal
handling
* tests/include/testlib.h
* tests/testlib.c: add new wait_thread_terminated() helper
Message-ID: <20240821163616.189307-3-luca@orpolo.org>
Diffstat (limited to 'tests/test-machmsg.c')
-rw-r--r-- | tests/test-machmsg.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/tests/test-machmsg.c b/tests/test-machmsg.c index ac292376..7f535bde 100644 --- a/tests/test-machmsg.c +++ b/tests/test-machmsg.c @@ -499,6 +499,83 @@ void test_msg_emptydesc(void) } +void recv_to_be_interrupted(void *arg) +{ + mach_msg_header_t msg; + kern_return_t ret; + mach_port_t rcv_name; + long err = (long)arg; + + ret = mach_port_allocate(mach_task_self (), MACH_PORT_RIGHT_RECEIVE, &rcv_name); + ASSERT_RET(ret, "creating rx port"); + + ret = mach_msg(&msg, MACH_RCV_MSG, + 0, sizeof(msg), rcv_name, + MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); + + printf("mach_msg returned %x\n", ret); + ASSERT(ret == err, "recv not interrupted correctly"); + + thread_terminate(mach_thread_self()); + FAILURE("thread_terminate"); +} + +void test_recv_interrupted(void) +{ + kern_return_t ret; + thread_t th; + th = test_thread_start(mach_task_self(), recv_to_be_interrupted, (void*)MACH_RCV_INTERRUPTED); + msleep(100); + + ret = thread_suspend(th); + ASSERT_RET(ret, "thread_suspend"); + + ret = thread_abort(th); + ASSERT_RET(ret, "thread_abort"); + + ret = thread_resume(th); + ASSERT_RET(ret, "thread_resume"); + + wait_thread_terminated(th); +} + +void test_recv_interrupted_setreturn(void) +{ + kern_return_t ret; + thread_t th; + th = test_thread_start(mach_task_self(), recv_to_be_interrupted, (void*)123L); + msleep(100); + + ret = thread_suspend(th); + ASSERT_RET(ret, "thread_suspend"); + + ret = thread_abort(th); + ASSERT_RET(ret, "thread_abort"); + + + struct i386_thread_state state; + unsigned int count; + count = i386_THREAD_STATE_COUNT; + ret = thread_get_state(th, i386_REGS_SEGS_STATE, + (thread_state_t) &state, &count); + ASSERT_RET(ret, "thread_get_state()"); + +#ifdef __i386__ + state.eax = 123; +#elif defined(__x86_64__) + state.rax = 123; +#endif + ret = thread_set_state(th, i386_REGS_SEGS_STATE, + (thread_state_t) &state, i386_THREAD_STATE_COUNT); + ASSERT_RET(ret, "thread_set_state"); + + ret = thread_resume(th); + ASSERT_RET(ret, "thread_resume"); + + wait_thread_terminated(th); +} + + int main (int argc, char *argv[], int envc, char *envp[]) { @@ -512,5 +589,8 @@ main (int argc, char *argv[], int envc, char *envp[]) test_msg_emptydesc(); printf("test_iters()\n"); test_iterations(); + printf("test_recv_interrupted()\n"); + test_recv_interrupted(); + test_recv_interrupted_setreturn(); return 0; } |