Applied, thanks! Luca Dariz, le mer. 12 juin 2024 08:27:55 +0200, a ecrit: > * tests/test-machmsg.c: add more combinations to existing cases: > - make tx and rx ports independent in the send/receive tests > - add two more variants for send/receive tests, using two separate > system calls, using different code paths in mach_msg(). > --- > tests/test-machmsg.c | 117 +++++++++++++++++++++++++++++++++++++++++-- > 1 file changed, 114 insertions(+), 3 deletions(-) > > diff --git a/tests/test-machmsg.c b/tests/test-machmsg.c > index 60f3f49f..ac292376 100644 > --- a/tests/test-machmsg.c > +++ b/tests/test-machmsg.c > @@ -40,6 +40,7 @@ static uint32_t align(uint32_t val, size_t aln) > > struct echo_params > { > + mach_port_t tx_port; > mach_port_t rx_port; > mach_msg_size_t rx_size; > mach_msg_size_t rx_number; > @@ -110,6 +111,7 @@ test_iterations (void) > > struct echo_params params; > params.rx_port = port; > + params.tx_port = port; > params.rx_size = sizeof(message.header) + sizeof(message.type) + 5; > ALIGN_INLINE(params.rx_size, MACH_MSG_USER_ALIGNMENT); > params.rx_number = TEST_ITERATIONS; > @@ -183,6 +185,7 @@ run_test_simple(void *msg, mach_msg_size_t msglen, > mach_msg_id_t msgid) > ASSERT_RET(err, "syscall_mach_port_allocate 2"); > > struct echo_params params; > + params.tx_port = MACH_PORT_NULL; > params.rx_port = port; > params.rx_size = msglen; > params.rx_number = 1; > @@ -208,6 +211,63 @@ run_test_simple(void *msg, mach_msg_size_t msglen, > mach_msg_id_t msgid) > ASSERT(head->msgh_size == msglen, "wrong size in final rx"); > } > > +/* same as run_test_simple(), but use two different sysccalls for tx and rx > */ > +void > +run_test_simple_split(void *msg, mach_msg_size_t msglen, mach_msg_id_t msgid) > +{ > + mach_msg_header_t *head = msg; > + mach_port_t port, receive; > + int err; > + > + err = syscall_mach_port_allocate (mach_task_self (), > + MACH_PORT_RIGHT_RECEIVE, &port); > + ASSERT_RET(err, "syscall_mach_port_allocate"); > + > + err = syscall_mach_port_allocate (mach_task_self (), > + MACH_PORT_RIGHT_RECEIVE, &receive); > + ASSERT_RET(err, "syscall_mach_port_allocate 2"); > + > + struct echo_params params; > + params.tx_port = receive; > + params.rx_port = port; > + params.rx_size = msglen; > + params.rx_number = 1; > + test_thread_start (mach_task_self (), echo_thread, ¶ms); > + > + head->msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_MAKE_SEND, > + MACH_MSG_TYPE_MAKE_SEND_ONCE); > + head->msgh_remote_port = port; > + head->msgh_local_port = receive; > + head->msgh_id = msgid; > + head->msgh_size = 0; // check that the echo thread receives the correct > size > + > + err = mach_msg (msg, > + MACH_SEND_MSG, > + msglen, > + 0, > + MACH_PORT_NULL, > + MACH_MSG_TIMEOUT_NONE, > + MACH_PORT_NULL); > + ASSERT_RET(err, "mach_msg tx"); > + > + memset(msg, 0, msglen); > + > + err = mach_msg (msg, > + MACH_RCV_MSG, > + 0, > + msglen, > + receive, > + MACH_MSG_TIMEOUT_NONE, > + MACH_PORT_NULL); > + ASSERT_RET(err, "mach_msg rx"); > + > + printf("size in final rx: %d expected %d\n", head->msgh_size, msglen); > + ASSERT(head->msgh_size == msglen, "wrong size in final rx"); > +} > + > +/* Text tx and rx of a message, without using a different thread. We > + * also use the same port to send and receive the message. > + */ > void > run_test_simple_self(void *msg, mach_msg_size_t msglen, mach_msg_id_t msgid) > { > @@ -222,9 +282,6 @@ run_test_simple_self(void *msg, mach_msg_size_t msglen, > mach_msg_id_t msgid) > head->msgh_bits > = MACH_MSGH_BITS (MACH_MSG_TYPE_MAKE_SEND, > MACH_MSG_TYPE_MAKE_SEND_ONCE); > - /* head->msgh_bits */ > - /* = MACH_MSGH_BITS (MACH_MSG_TYPE_MAKE_SEND_ONCE, */ > - /* MACH_MSG_TYPE_COPY_SEND); */ > > head->msgh_bits |= MACH_MSGH_BITS_COMPLEX; > head->msgh_remote_port = port; > @@ -245,6 +302,52 @@ run_test_simple_self(void *msg, mach_msg_size_t msglen, > mach_msg_id_t msgid) > ASSERT(head->msgh_size == msglen, "wrong size in final rx\n"); > } > > +/* same as run_test_simple_self(), but use two different sysccalls for tx > and rx */ > +void > +run_test_simple_self_split(void *msg, mach_msg_size_t msglen, mach_msg_id_t > msgid) > +{ > + mach_msg_header_t *head = msg; > + mach_port_t port, receive; > + int err; > + > + err = syscall_mach_port_allocate (mach_task_self (), > + MACH_PORT_RIGHT_RECEIVE, &port); > + ASSERT_RET(err, "syscall_mach_port_allocate"); > + > + head->msgh_bits > + = MACH_MSGH_BITS (MACH_MSG_TYPE_MAKE_SEND, > + MACH_MSG_TYPE_MAKE_SEND_ONCE); > + > + head->msgh_bits |= MACH_MSGH_BITS_COMPLEX; > + head->msgh_remote_port = port; > + head->msgh_local_port = port; > + head->msgh_id = msgid; > + head->msgh_size = msglen; > + > + err = mach_msg (msg, > + MACH_SEND_MSG, > + msglen, > + 0, > + port, > + MACH_MSG_TIMEOUT_NONE, > + MACH_PORT_NULL); > + ASSERT_RET(err, "mach_msg tx"); > + > + memset(msg, 0, msglen); > + > + err = mach_msg (msg, > + MACH_RCV_MSG, > + 0, > + msglen, > + port, > + MACH_MSG_TIMEOUT_NONE, > + MACH_PORT_NULL); > + ASSERT_RET(err, "mach_msg rx"); > + > + printf("size in final rx: %d expected %d\n", head->msgh_size, msglen); > + ASSERT(head->msgh_size == msglen, "wrong size in final rx\n"); > +} > + > > void test_msg_string(void) > { > @@ -272,7 +375,9 @@ void test_msg_string(void) > msg.type.msgt_unused = 0; > > run_test_simple_self(&msg, msglen, msgid); > + run_test_simple_self_split(&msg, msglen, msgid); > run_test_simple(&msg, msglen, msgid); > + run_test_simple_split(&msg, msglen, msgid); > } > > void test_msg_string2(void) > @@ -312,7 +417,9 @@ void test_msg_string2(void) > memset (msg.data2, 'x', len2); > > run_test_simple_self(&msg, msglen, msgid); > + run_test_simple_self_split(&msg, msglen, msgid); > run_test_simple(&msg, msglen, msgid); > + run_test_simple_split(&msg, msglen, msgid); > } > > > @@ -343,7 +450,9 @@ void test_msg_ports(void) > msgports[2] = mach_thread_self(); > > run_test_simple_self(&msg, msglen, msgid); > + run_test_simple_self_split(&msg, msglen, msgid); > run_test_simple(&msg, msglen, msgid); > + run_test_simple_split(&msg, msglen, msgid); > } > > void test_msg_emptydesc(void) > @@ -384,7 +493,9 @@ void test_msg_emptydesc(void) > msg.type.msgt_unused = 0; > > run_test_simple_self(&msg, msglen, msgid); > + run_test_simple_self_split(&msg, msglen, msgid); > run_test_simple(&msg, msglen, msgid); > + run_test_simple_split(&msg, msglen, msgid); > } > > > -- > 2.39.2 > >
-- Samuel --- Pour une évaluation indépendante, transparente et rigoureuse ! Je soutiens la Commission d'Évaluation de l'Inria.