summaryrefslogtreecommitdiff
path: root/usr/src/cmd/filebench/common/fileset.h
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd/filebench/common/fileset.h')
-rw-r--r--usr/src/cmd/filebench/common/fileset.h59
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
}