155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/*
255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak *   Copyright (c) International Business Machines Corp., 2001-2006
355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak *
455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak *   This program is free software;  you can redistribute it and/or modify
555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak *   it under the terms of the GNU General Public License as published by
655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak *   the Free Software Foundation; either version 2 of the License, or
755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak *   (at your option) any later version.
855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak *
955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak *   This program is distributed in the hope that it will be useful,
1055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
1155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
1255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak *   the GNU General Public License for more details.
1355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak *
1455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak *   You should have received a copy of the GNU General Public License
1555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak *   along with this program;  if not, write to the Free Software
164548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak */
1855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#ifndef _UTIL_H_
1955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#define _UTIL_H_
2055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak
2155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include "config.h"
2255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak
2355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include <sys/time.h>
2455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include <sys/resource.h>
2555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak
2655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#ifdef HAVE_SYS_VFS_H
2755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include <sys/vfs.h>
2855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#endif
2955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include <sys/statvfs.h>
3055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include <unistd.h>
3155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include <stdlib.h>
3255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include <assert.h>
3355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include <string.h>
3455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include <pthread.h>
3555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak
3655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak
3755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid ffsb_sleep(unsigned secs);
3855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid *ffsb_malloc(size_t size);
3955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid *ffsb_realloc(void *ptr, size_t size);
4055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakchar *ffsb_strdup(const char *str);
4155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modaksize_t ffsb_strnlen(const char *str, size_t maxlen);
4255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak
4355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid ffsb_mkdir(char *dirname);
4455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid ffsb_getrusage(struct rusage *ru_self, struct rusage *ru_children);
4555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid ffsb_sync(void);
4655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid *ffsb_align_4k(void *ptr);
4755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakchar *ffsb_printsize(char *buf, double size, int bufsize);
4855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak
4955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakint ffsb_system(char *command);
5055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid ffsb_milli_sleep(unsigned time);
5155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid ffsb_micro_sleep(unsigned time);
5255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid ffsb_unbuffer_stdout(void);
5355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid ffsb_bench_gettimeofday(void);
5455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid ffsb_bench_getpid(void);
5555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak
5655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakuint64_t ffsb_get_filesize(char *name);
5755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak
5855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modaktypedef struct {
5955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak	unsigned required_count;
6055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak	unsigned current_count;
6155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak	pthread_mutex_t plock;
6255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak	pthread_cond_t pcond;
6355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak} ffsb_barrier_t ;
6455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak
6555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid ffsb_barrier_init(ffsb_barrier_t *fb, unsigned count);
6655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid ffsb_barrier_wait(ffsb_barrier_t *fb);
6755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak
6855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakdouble cpu_so_far(void);
6955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakdouble time_so_far(void);
7055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakdouble cpu_so_far_children(void);
7155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakfloat getfsutil(char *dirname);
7255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakuint64_t getfsutil_size(char *dirname);
7355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak
7455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakstruct timeval tvsub(struct timeval t1, struct timeval t0);
7555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakstruct timeval tvadd(struct timeval t1, struct timeval t0);
7655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakdouble tvtodouble(struct timeval *t);
7755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak
7855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak
7955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#define max(a, b) (((a) > (b)) ? (a) : (b))
8055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak
8155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#ifndef timersub
8255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#define timersub(a, b, result)                                          \
8355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak	do {           	                                                \
8455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak		(result)->tv_sec = (a)->tv_sec - (b)->tv_sec;		\
8555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak		(result)->tv_usec = (a)->tv_usec - (b)->tv_usec;	\
8655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak									\
8755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak		if ((result)->tv_usec < 0) {				\
8855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak			(result)->tv_sec--;				\
8955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak			(result)->tv_usec += 1000000;			\
9055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak		}							\
9155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak	} while (0)
9255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#endif /* timersub */
9355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak
9455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#endif /* _UTIL_H_ */
95