
Removed the existing mbox that is used to pass transactions from one thread to the other, use a non-locking FIFO and a simple semaphore instead. Removed all notion of void* from the FIFO system, use the now generic FIFO. Also started to rework the mirror.c code to use typedefs for structs enums etc. DO NOT USE. check_mbox is borken and needs changing. Currently 'functional' otherwise like this, but requires more testing. Signed-off-by: Michel Pollet <buserror@gmail.com>
104 lines
2.2 KiB
C
104 lines
2.2 KiB
C
#include "mbox.h"
|
|
#include "util.h"
|
|
|
|
#include <pthread.h>
|
|
#include <check.h>
|
|
|
|
START_TEST( test_allocs_cvar )
|
|
{
|
|
struct mbox_t * mbox = mbox_create();
|
|
fail_if( NULL == mbox, "Nothing allocated" );
|
|
|
|
pthread_cond_t cond_zero;
|
|
/* A freshly inited pthread_cond_t is set to {0} */
|
|
memset( &cond_zero, 'X', sizeof( cond_zero ) );
|
|
fail_if( memcmp( &cond_zero, &mbox->filled_cond, sizeof( cond_zero ) ) == 0 ,
|
|
"Condition variable not allocated" );
|
|
fail_if( memcmp( &cond_zero, &mbox->emptied_cond, sizeof( cond_zero ) ) == 0 ,
|
|
"Condition variable not allocated" );
|
|
}
|
|
END_TEST
|
|
|
|
|
|
START_TEST( test_post_stores_value )
|
|
{
|
|
struct mbox_t * mbox = mbox_create();
|
|
|
|
void * deadbeef = (void *)0xDEADBEEF;
|
|
mbox_post( mbox, deadbeef );
|
|
|
|
fail_unless( deadbeef == mbox_contents( mbox ),
|
|
"Contents were not posted" );
|
|
}
|
|
END_TEST
|
|
|
|
|
|
mbox_item_t mbox_receive_runner( void * mbox_uncast )
|
|
{
|
|
struct mbox_t * mbox = (struct mbox_t *)mbox_uncast;
|
|
void * contents = NULL;
|
|
|
|
return mbox_receive( mbox );
|
|
}
|
|
|
|
|
|
START_TEST( test_receive_blocks_until_post )
|
|
{
|
|
struct mbox_t * mbox = mbox_create();
|
|
pthread_t receiver;
|
|
pthread_create( &receiver, NULL, mbox_receive_runner, mbox );
|
|
|
|
void * deadbeef = (void *)0xDEADBEEF;
|
|
void * retval =NULL;
|
|
usleep(10000);
|
|
fail_unless( EBUSY == pthread_tryjoin_np( receiver, &retval ),
|
|
"Receiver thread wasn't blocked");
|
|
|
|
mbox_post( mbox, deadbeef );
|
|
fail_unless( 0 == pthread_join( receiver, &retval ),
|
|
"Failed to join the receiver thread" );
|
|
fail_unless( retval == deadbeef,
|
|
"Return value was wrong" );
|
|
|
|
|
|
}
|
|
END_TEST
|
|
|
|
|
|
Suite* mbox_suite(void)
|
|
{
|
|
Suite *s = suite_create("mbox");
|
|
TCase *tc_create = tcase_create("create");
|
|
TCase *tc_post = tcase_create("post");
|
|
|
|
tcase_add_test(tc_create, test_allocs_cvar);
|
|
|
|
tcase_add_test( tc_post, test_post_stores_value );
|
|
tcase_add_test( tc_post, test_receive_blocks_until_post);
|
|
|
|
suite_add_tcase(s, tc_create);
|
|
suite_add_tcase(s, tc_post);
|
|
|
|
return s;
|
|
}
|
|
|
|
|
|
|
|
int main(void)
|
|
{
|
|
#ifdef DEBUG
|
|
log_level = 0;
|
|
#else
|
|
log_level = 2;
|
|
#endif
|
|
int number_failed;
|
|
Suite *s = mbox_suite();
|
|
SRunner *sr = srunner_create(s);
|
|
srunner_run_all(sr, CK_NORMAL);
|
|
log_level = 0;
|
|
number_failed = srunner_ntests_failed(sr);
|
|
srunner_free(sr);
|
|
return (number_failed == 0) ? 0 : 1;
|
|
}
|
|
|