blob: 95cebcb3536cf12718d17a391e3727834bd84066 [file] [log] [blame]
/*
* Copyright (c) International Business Machines Corp., 2001-2004
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
* the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "ffsb_tg.h"
#include "ffsb_thread.h"
#include "ffsb_op.h"
#include "util.h"
void init_ffsb_thread(ffsb_thread_t * ft, struct ffsb_tg *tg, unsigned bufsize,
unsigned tg_num, unsigned thread_num)
{
memset(ft, 0, sizeof(ffsb_thread_t));
ft->tg = tg;
ft->tg_num = tg_num;
ft->thread_num = thread_num;
if (bufsize)
ft_alter_bufsize(ft, bufsize);
init_random(&ft->rd, MAX_RANDBUF_SIZE);
}
void destroy_ffsb_thread(ffsb_thread_t * ft)
{
free(ft->mallocbuf);
destroy_random(&ft->rd);
if (ft->fsd.config)
ffsb_statsd_destroy(&ft->fsd);
}
void ft_set_statsc(ffsb_thread_t * ft, ffsb_statsc_t * fsc)
{
ffsb_statsd_init(&ft->fsd, fsc);
}
void *ft_run(void *data)
{
ffsb_thread_t *ft = (ffsb_thread_t *) data;
tg_op_params_t params;
unsigned wait_time = tg_get_waittime(ft->tg);
int stopval = tg_get_stopval(ft->tg);
ffsb_barrier_wait(tg_get_start_barrier(ft->tg));
while (tg_get_flagval(ft->tg) != stopval) {
tg_get_op(ft->tg, &ft->rd, &params);
do_op(ft, params.fs, params.opnum);
ffsb_milli_sleep(wait_time);
}
return NULL;
}
void ft_alter_bufsize(ffsb_thread_t * ft, unsigned bufsize)
{
if (ft->mallocbuf != NULL)
free(ft->mallocbuf);
ft->mallocbuf = ffsb_malloc(bufsize + 4096);
ft->alignedbuf = ffsb_align_4k(ft->mallocbuf + (4096 - 1));
}
char *ft_getbuf(ffsb_thread_t * ft)
{
return ft->alignedbuf;
}
int ft_get_read_random(ffsb_thread_t * ft)
{
return tg_get_read_random(ft->tg);
}
uint32_t ft_get_read_size(ffsb_thread_t * ft)
{
return tg_get_read_size(ft->tg);
}
uint32_t ft_get_read_blocksize(ffsb_thread_t * ft)
{
return tg_get_read_blocksize(ft->tg);
}
int ft_get_write_random(ffsb_thread_t * ft)
{
return tg_get_write_random(ft->tg);
}
uint32_t ft_get_write_size(ffsb_thread_t * ft)
{
return tg_get_write_size(ft->tg);
}
uint32_t ft_get_write_blocksize(ffsb_thread_t * ft)
{
return tg_get_write_blocksize(ft->tg);
}
int ft_get_fsync_file(ffsb_thread_t * ft)
{
return tg_get_fsync_file(ft->tg);
}
randdata_t *ft_get_randdata(ffsb_thread_t * ft)
{
return &ft->rd;
}
void ft_incr_op(ffsb_thread_t * ft, unsigned opnum, unsigned increment,
uint64_t bytes)
{
ft->results.ops[opnum] += increment;
ft->results.op_weight[opnum]++;
ft->results.bytes[opnum] += bytes;
}
void ft_add_readbytes(ffsb_thread_t * ft, uint32_t bytes)
{
ft->results.read_bytes += bytes;
}
void ft_add_writebytes(ffsb_thread_t * ft, uint32_t bytes)
{
ft->results.write_bytes += bytes;
}
ffsb_op_results_t *ft_get_results(ffsb_thread_t * ft)
{
return &ft->results;
}
int ft_get_read_skip(ffsb_thread_t * ft)
{
return tg_get_read_skip(ft->tg);
}
uint32_t ft_get_read_skipsize(ffsb_thread_t * ft)
{
return tg_get_read_skipsize(ft->tg);
}
int ft_needs_stats(ffsb_thread_t * ft, syscall_t sys)
{
int ret = 0;
if (ft && ft->fsd.config && !fsc_ignore_sys(ft->fsd.config, sys))
ret = 1;
return ret;
}
void ft_add_stat(ffsb_thread_t * ft, syscall_t sys, uint32_t val)
{
if (ft)
ffsb_add_data(&ft->fsd, sys, val);
}
ffsb_statsd_t *ft_get_stats_data(ffsb_thread_t * ft)
{
return &ft->fsd;
}