diff options
Diffstat (limited to 'innobase/buf/ts/tsos.c')
-rw-r--r-- | innobase/buf/ts/tsos.c | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/innobase/buf/ts/tsos.c b/innobase/buf/ts/tsos.c new file mode 100644 index 00000000000..c1cc3f27172 --- /dev/null +++ b/innobase/buf/ts/tsos.c @@ -0,0 +1,185 @@ +/************************************************************************ +The test module for the operating system interface + +(c) 1995 Innobase Oy + +Created 9/27/1995 Heikki Tuuri +*************************************************************************/ + + +#include "../os0thread.h" +#include "../os0shm.h" +#include "../os0proc.h" +#include "../os0sync.h" +#include "../os0file.h" +#include "ut0ut.h" +#include "sync0sync.h" +#include "mem0mem.h" + +ulint last_thr = 1; + +byte global_buf[1000000]; + +os_file_t file; +os_file_t file2; + +os_event_t gl_ready; + +mutex_t ios_mutex; +ulint ios; + +/************************************************************************ +Io-handler thread function. */ + +ulint +handler_thread( +/*===========*/ + void* arg) +{ + ulint segment; + void* mess; + ulint i; + bool ret; + + segment = *((ulint*)arg); + + printf("Thread %lu starts\n", segment); + + for (i = 0;; i++) { + ret = os_aio_wait(segment, &mess); + + mutex_enter(&ios_mutex); + ios++; + mutex_exit(&ios_mutex); + + ut_a(ret); +/* printf("Message for thread %lu %lu\n", segment, + (ulint)mess); */ + if ((ulint)mess == 3333) { + os_event_set(gl_ready); + } + } + + return(0); +} + +/************************************************************************ +Test of io-handler threads */ + +void +test4(void) +/*=======*/ +{ + ulint i; + bool ret; + void* buf; + ulint rnd; + ulint tm, oldtm; + + os_thread_t thr[5]; + os_thread_id_t id[5]; + ulint n[5]; + + printf("-------------------------------------------\n"); + printf("OS-TEST 4. Test of asynchronous file io\n"); + + /* Align the buffer for file io */ + + buf = (void*)(((ulint)global_buf + 6300) & (~0xFFF)); + + gl_ready = os_event_create(NULL); + ios = 0; + + sync_init(); + mem_init(); + + mutex_create(&ios_mutex); + + for (i = 0; i < 5; i++) { + n[i] = i; + + thr[i] = os_thread_create(handler_thread, n + i, id + i); + } + + rnd = 0; + + oldtm = ut_clock(); + + for (i = 0; i < 4096; i++) { + ret = os_aio_read(file, (byte*)buf + 8192 * (rnd % 100), + 8192 * (rnd % 4096), 0, + 8192, (void*)i); + ut_a(ret); + rnd += 1; + } + + ret = os_aio_read(file, buf, 8192 * (rnd % 1024), 0, 8192, + (void*)3333); + ut_a(ret); + + ut_a(!os_aio_all_slots_free()); + + tm = ut_clock(); + + printf("All ios queued! N ios: %lu\n", ios); + + printf("Wall clock time for test %lu milliseconds\n", tm - oldtm); + + os_event_wait(gl_ready); + + tm = ut_clock(); + printf("N ios: %lu\n", ios); + printf("Wall clock time for test %lu milliseconds\n", tm - oldtm); + + os_thread_sleep(2000000); + + printf("N ios: %lu\n", ios); + + ut_a(os_aio_all_slots_free()); +} + +/************************************************************************* +Initializes the asyncronous io system for tests. */ + +void +init_aio(void) +/*==========*/ +{ + bool ret; + void* buf; + + buf = (void*)(((ulint)global_buf + 6300) & (~0xFFF)); + + os_aio_init(160, 5); + file = os_file_create("j:\\tsfile4", OS_FILE_CREATE, OS_FILE_TABLESPACE, + &ret); + + if (ret == FALSE) { + ut_a(os_file_get_last_error() == OS_FILE_ALREADY_EXISTS); + + file = os_file_create("j:\\tsfile4", OS_FILE_OPEN, + OS_FILE_TABLESPACE, &ret); + + ut_a(ret); + } +} + +/************************************************************************ +Main test function. */ + +void +main(void) +/*======*/ +{ + ulint tm, oldtm; + + oldtm = ut_clock(); + + init_aio(); + + test4(); + + tm = ut_clock(); + printf("Wall clock time for test %lu milliseconds\n", tm - oldtm); + printf("TESTS COMPLETED SUCCESSFULLY!\n"); +} |