mirror of
https://github.com/MariaDB/server.git
synced 2025-01-28 01:34:17 +01:00
186 lines
3.3 KiB
C
186 lines
3.3 KiB
C
|
/************************************************************************
|
||
|
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");
|
||
|
}
|