diff options
Diffstat (limited to 'usr/src/cmd/filebench/common/fileset.h')
| -rw-r--r-- | usr/src/cmd/filebench/common/fileset.h | 59 |
1 files changed, 36 insertions, 23 deletions
diff --git a/usr/src/cmd/filebench/common/fileset.h b/usr/src/cmd/filebench/common/fileset.h index fa08b443c5..1250d50c32 100644 --- a/usr/src/cmd/filebench/common/fileset.h +++ b/usr/src/cmd/filebench/common/fileset.h @@ -39,7 +39,6 @@ #define off64_t off_t #endif /* HAVE_OFF64_T */ - #include <stdio.h> #include <stdlib.h> #include <unistd.h> @@ -50,6 +49,7 @@ #include <pthread.h> #include "vars.h" +#include "fb_avl.h" #define FILE_ALLOC_BLOCK (off64_t)(1024 * 1024) #ifdef __cplusplus @@ -70,18 +70,22 @@ extern "C" { #define FSE_THRD_WAITNG 0x40 typedef struct filesetentry { - struct filesetentry *fse_next; - struct filesetentry *fse_parent; - struct filesetentry *fse_filenext; /* List of files */ - struct filesetentry *fse_dirnext; /* List of directories */ - struct filesetentry *fse_leafdirnext; /* List of leaf dirs */ + struct filesetentry *fse_next; /* master list of entries */ + struct filesetentry *fse_parent; /* link to directory */ + avl_node_t fse_link; /* links in avl btree, prot. */ + /* by fs_pick_lock */ + uint_t fse_index; /* file order number */ + struct filesetentry *fse_nextoftype; /* List of specific fse */ struct fileset *fse_fileset; /* Parent fileset */ char *fse_path; int fse_depth; off64_t fse_size; + int fse_open_cnt; /* protected by fs_pick_lock */ int fse_flags; /* protected by fs_pick_lock */ } filesetentry_t; +#define FSE_OFFSETOF(f) ((size_t)(&(((filesetentry_t *)0)->f))) + /* type of fileset entry to obtain */ #define FILESET_PICKFILE 0x00 /* Pick a file from the set */ #define FILESET_PICKDIR 0x01 /* Pick a directory */ @@ -90,9 +94,10 @@ typedef struct filesetentry { /* other pick flags */ #define FILESET_PICKUNIQUE 0x04 /* Pick a unique file or leafdir from the */ /* fileset until empty */ -#define FILESET_PICKRESET 0x08 /* Reset FILESET_PICKUNIQUE selection list */ #define FILESET_PICKEXISTS 0x10 /* Pick an existing file */ #define FILESET_PICKNOEXIST 0x20 /* Pick a file that doesn't exist */ +#define FILESET_PICKBYINDEX 0x40 /* use supplied index number to select file */ +#define FILESET_PICKFREE FILESET_PICKUNIQUE /* fileset attributes */ #define FILESET_IS_RAW_DEV 0x01 /* fileset is a raw device */ @@ -134,32 +139,37 @@ typedef struct fileset { int64_t fs_idle_files; /* number of files NOT busy */ pthread_cond_t fs_idle_files_cv; /* idle files condition variable */ - fbint_t fs_num_act_files; /* total number of files */ - /* actually existing in the */ - /* host or server's file system */ + int64_t fs_idle_dirs; /* number of dirs NOT busy */ pthread_cond_t fs_idle_dirs_cv; /* idle dirs condition variable */ int64_t fs_idle_leafdirs; /* number of dirs NOT busy */ pthread_cond_t fs_idle_leafdirs_cv; /* idle dirs condition variable */ - fbint_t fs_num_act_leafdirs; /* total number of leaf dirs */ - /* actually existing in the */ - /* host or server's file system */ + pthread_mutex_t fs_pick_lock; /* per fileset "pick" function lock */ pthread_cond_t fs_thrd_wait_cv; /* per fileset file busy wait cv */ + avl_tree_t fs_free_files; /* btree of free files */ + avl_tree_t fs_exist_files; /* btree of files on device */ + avl_tree_t fs_noex_files; /* btree of files NOT on device */ + avl_tree_t fs_dirs; /* btree of internal dirs */ + avl_tree_t fs_free_leaf_dirs; /* btree of free leaf dirs */ + avl_tree_t fs_exist_leaf_dirs; /* btree of leaf dirs on device */ + avl_tree_t fs_noex_leaf_dirs; /* btree of leaf dirs NOT */ + /* currently on device */ filesetentry_t *fs_filelist; /* List of files */ - filesetentry_t *fs_filefree; /* Ptr to next free file */ - filesetentry_t *fs_filerotor[FSE_MAXTID]; /* next file to */ + uint_t fs_file_exrotor[FSE_MAXTID]; /* next file to */ /* select */ - filesetentry_t *fs_file_ne_rotor; /* next non existent file */ + uint_t fs_file_nerotor; /* next non existent file */ /* to select for createfile */ filesetentry_t *fs_dirlist; /* List of directories */ - filesetentry_t *fs_dirfree; /* List of free directories */ - filesetentry_t *fs_dirrotor; /* Ptr to next directory to select */ + uint_t fs_dirrotor; /* index of next directory to select */ filesetentry_t *fs_leafdirlist; /* List of leaf directories */ - filesetentry_t *fs_leafdirfree; /* Ptr to next free leaf directory */ - filesetentry_t *fs_leafdirrotor; /* Ptr to next leaf */ + uint_t fs_leafdir_exrotor; /* Ptr to next existing leaf */ /* directory to select */ + uint_t fs_leafdir_nerotor; /* Ptr to next non-existing */ + int *fs_filehistop; /* Ptr to access histogram */ + int fs_histo_id; /* shared memory id for filehisto */ + pthread_mutex_t fs_histo_lock; /* lock for incr of histo */ } fileset_t; int fileset_createset(fileset_t *); @@ -167,13 +177,16 @@ int fileset_openfile(fileset_t *fileset, filesetentry_t *entry, int flag, int mode, int attrs); fileset_t *fileset_define(avd_t); fileset_t *fileset_find(char *name); -filesetentry_t *fileset_pick(fileset_t *fileset, int flags, int tid); +filesetentry_t *fileset_pick(fileset_t *fileset, int flags, int tid, + int index); char *fileset_resolvepath(filesetentry_t *entry); void fileset_usage(void); -void fileset_iter(int (*cmd)(fileset_t *fileset, int first)); +int fileset_iter(int (*cmd)(fileset_t *fileset, int first)); int fileset_print(fileset_t *fileset, int first); void fileset_unbusy(filesetentry_t *entry, int update_exist, - int new_exist_val); + int new_exist_val, int open_cnt_incr); +int fileset_dump_histo(fileset_t *fileset, int first); +void fileset_attach_all_histos(void); #ifdef __cplusplus } |
