Home | History | Annotate | Download | only in common
      1  5184  ek110237 /*
      2  5184  ek110237  * CDDL HEADER START
      3  5184  ek110237  *
      4  5184  ek110237  * The contents of this file are subject to the terms of the
      5  5184  ek110237  * Common Development and Distribution License (the "License").
      6  5184  ek110237  * You may not use this file except in compliance with the License.
      7  5184  ek110237  *
      8  5184  ek110237  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  5184  ek110237  * or http://www.opensolaris.org/os/licensing.
     10  5184  ek110237  * See the License for the specific language governing permissions
     11  5184  ek110237  * and limitations under the License.
     12  5184  ek110237  *
     13  5184  ek110237  * When distributing Covered Code, include this CDDL HEADER in each
     14  5184  ek110237  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  5184  ek110237  * If applicable, add the following below this CDDL HEADER, with the
     16  5184  ek110237  * fields enclosed by brackets "[]" replaced with your own identifying
     17  5184  ek110237  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  5184  ek110237  *
     19  5184  ek110237  * CDDL HEADER END
     20  5184  ek110237  */
     21  5184  ek110237 /*
     22  8615    Andrew  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     23  5184  ek110237  * Use is subject to license terms.
     24  6613  ek110237  *
     25  6613  ek110237  * Portions Copyright 2008 Denis Cheng
     26  5184  ek110237  */
     27  5184  ek110237 
     28  5184  ek110237 %{
     29  5184  ek110237 
     30  5184  ek110237 #include <stdlib.h>
     31  5184  ek110237 #include <stdio.h>
     32  5184  ek110237 #include <string.h>
     33  5184  ek110237 #include <signal.h>
     34  5184  ek110237 #include <errno.h>
     35  5184  ek110237 #include <sys/types.h>
     36  5184  ek110237 #include <locale.h>
     37  5184  ek110237 #include <sys/utsname.h>
     38  9513    Andrew #include <sys/statvfs.h>
     39  5184  ek110237 #ifdef HAVE_STDINT_H
     40  5184  ek110237 #include <stdint.h>
     41  5184  ek110237 #endif
     42  5184  ek110237 #include <fcntl.h>
     43  5184  ek110237 #include <sys/mman.h>
     44  5184  ek110237 #include <sys/wait.h>
     45  5184  ek110237 #ifdef HAVE_LIBTECLA
     46  5184  ek110237 #include <libtecla.h>
     47  5184  ek110237 #endif
     48  5184  ek110237 #include "parsertypes.h"
     49  5184  ek110237 #include "filebench.h"
     50  5184  ek110237 #include "utils.h"
     51  5184  ek110237 #include "stats.h"
     52  5184  ek110237 #include "vars.h"
     53  5184  ek110237 #include "eventgen.h"
     54  5184  ek110237 #ifdef HAVE_LIBTECLA
     55  5184  ek110237 #include "auto_comp.h"
     56  5184  ek110237 #endif
     57  7736    Andrew #include "multi_client_sync.h"
     58  5184  ek110237 
     59  5184  ek110237 int dofile = FS_FALSE;
     60  5184  ek110237 static const char cmdname[] = "filebench";
     61  5184  ek110237 static const char cmd_options[] = "pa:f:hi:s:m:";
     62  5184  ek110237 static void usage(int);
     63  5184  ek110237 
     64  5184  ek110237 static cmd_t *cmd = NULL;		/* Command being processed */
     65  5184  ek110237 #ifdef HAVE_LIBTECLA
     66  5184  ek110237 static GetLine *gl;			/* GetLine resource object */
     67  5184  ek110237 #endif
     68  5184  ek110237 
     69  5184  ek110237 char *execname;
     70  9513    Andrew char *fbbasepath = FILEBENCHDIR;
     71  5184  ek110237 char *fscriptname;
     72  5184  ek110237 int noproc = 0;
     73  5184  ek110237 var_t *var_list = NULL;
     74  5184  ek110237 pidlist_t *pidlist = NULL;
     75  5184  ek110237 char *cwd = NULL;
     76  5184  ek110237 FILE *parentscript = NULL;
     77  5673  aw148015 
     78  5673  aw148015 static int filecreate_done = 0;
     79  5673  aw148015 
     80  5184  ek110237 /* yacc externals */
     81  5184  ek110237 extern FILE *yyin;
     82  5184  ek110237 extern int yydebug;
     83  5184  ek110237 extern void yyerror(char *s);
     84  5184  ek110237 
     85  5184  ek110237 /* utilities */
     86  5184  ek110237 static void terminate(void);
     87  5184  ek110237 static cmd_t *alloc_cmd(void);
     88  5184  ek110237 static attr_t *alloc_attr(void);
     89  6550  aw148015 static attr_t *alloc_lvar_attr(var_t *var);
     90  5184  ek110237 static attr_t *get_attr(cmd_t *cmd, int64_t name);
     91  8404    Andrew static attr_t *get_attr_fileset(cmd_t *cmd, int64_t name);
     92  5184  ek110237 static attr_t *get_attr_integer(cmd_t *cmd, int64_t name);
     93  5184  ek110237 static attr_t *get_attr_bool(cmd_t *cmd, int64_t name);
     94  6550  aw148015 static void get_attr_lvars(cmd_t *cmd, flowop_t *flowop);
     95  5184  ek110237 static var_t *alloc_var(void);
     96  5184  ek110237 static var_t *get_var(cmd_t *cmd, int64_t name);
     97  5184  ek110237 static list_t *alloc_list();
     98  6212  aw148015 static probtabent_t *alloc_probtabent(void);
     99  6550  aw148015 static void add_lvar_to_list(var_t *newlvar, var_t **lvar_list);
    100  5184  ek110237 
    101  5184  ek110237 /* Info Commands */
    102  5184  ek110237 static void parser_list(cmd_t *);
    103  6212  aw148015 static void parser_flowop_list(cmd_t *);
    104  5184  ek110237 
    105  5184  ek110237 /* Define Commands */
    106  5184  ek110237 static void parser_proc_define(cmd_t *);
    107  5184  ek110237 static void parser_thread_define(cmd_t *, procflow_t *, int instances);
    108  6212  aw148015 static void parser_flowop_define(cmd_t *, threadflow_t *, flowop_t **, int);
    109  5184  ek110237 static void parser_file_define(cmd_t *);
    110  5184  ek110237 static void parser_fileset_define(cmd_t *);
    111  6212  aw148015 static void parser_randvar_define(cmd_t *);
    112  6212  aw148015 static void parser_randvar_set(cmd_t *);
    113  6550  aw148015 static void parser_composite_flowop_define(cmd_t *);
    114  5184  ek110237 
    115  5184  ek110237 /* Create Commands */
    116  5184  ek110237 static void parser_proc_create(cmd_t *);
    117  5184  ek110237 static void parser_thread_create(cmd_t *);
    118  5184  ek110237 static void parser_flowop_create(cmd_t *);
    119  5184  ek110237 static void parser_fileset_create(cmd_t *);
    120  6212  aw148015 
    121  6212  aw148015 /* set commands */
    122  9801    Andrew static void parser_set_integer(cmd_t *cmd);
    123  9801    Andrew static void parser_set_var(cmd_t *cmd);
    124  9801    Andrew static void parser_set_var_op_int(cmd_t *cmd);
    125  9801    Andrew static void parser_set_int_op_var(cmd_t *cmd);
    126  9801    Andrew static void parser_set_var_op_var(cmd_t *cmd);
    127  5184  ek110237 
    128  5184  ek110237 /* Shutdown Commands */
    129  5184  ek110237 static void parser_proc_shutdown(cmd_t *);
    130  5184  ek110237 static void parser_filebench_shutdown(cmd_t *cmd);
    131  5184  ek110237 
    132  5184  ek110237 /* Other Commands */
    133  9513    Andrew static void parser_echo(cmd_t *cmd);
    134  5184  ek110237 static void parser_foreach_integer(cmd_t *cmd);
    135  5184  ek110237 static void parser_foreach_string(cmd_t *cmd);
    136  9513    Andrew static void parser_fscheck(cmd_t *cmd);
    137  9513    Andrew static void parser_fsflush(cmd_t *cmd);
    138  5184  ek110237 static void parser_log(cmd_t *cmd);
    139  5184  ek110237 static void parser_statscmd(cmd_t *cmd);
    140  5184  ek110237 static void parser_statsdump(cmd_t *cmd);
    141  5184  ek110237 static void parser_statsxmldump(cmd_t *cmd);
    142  7736    Andrew static void parser_statsmultidump(cmd_t *cmd);
    143  5184  ek110237 static void parser_usage(cmd_t *cmd);
    144  5184  ek110237 static void parser_vars(cmd_t *cmd);
    145  5184  ek110237 static void parser_printvars(cmd_t *cmd);
    146  5184  ek110237 static void parser_system(cmd_t *cmd);
    147  5184  ek110237 static void parser_statssnap(cmd_t *cmd);
    148  5184  ek110237 static void parser_directory(cmd_t *cmd);
    149  5184  ek110237 static void parser_eventgen(cmd_t *cmd);
    150  7736    Andrew static void parser_enable_mc(cmd_t *cmd);
    151  7736    Andrew static void parser_domultisync(cmd_t *cmd);
    152  5184  ek110237 static void parser_run(cmd_t *cmd);
    153  5184  ek110237 static void parser_run_variable(cmd_t *cmd);
    154  9326    Andrew static void parser_sleep(cmd_t *cmd);
    155  9326    Andrew static void parser_sleep_variable(cmd_t *cmd);
    156  9326    Andrew static void parser_warmup(cmd_t *cmd);
    157  9326    Andrew static void parser_warmup_variable(cmd_t *cmd);
    158  5184  ek110237 static void parser_help(cmd_t *cmd);
    159  5184  ek110237 static void arg_parse(const char *command);
    160  5184  ek110237 static void parser_abort(int arg);
    161  6750  ek110237 static void parser_version(cmd_t *cmd);
    162  5184  ek110237 
    163  5184  ek110237 %}
    164  5184  ek110237 
    165  5184  ek110237 %union {
    166  6212  aw148015 	int64_t		 ival;
    167  6212  aw148015 	uchar_t		 bval;
    168  6212  aw148015 	char *		 sval;
    169  6212  aw148015 	fs_u		 val;
    170  6212  aw148015 	avd_t		 avd;
    171  6212  aw148015 	cmd_t		*cmd;
    172  6212  aw148015 	attr_t		*attr;
    173  6212  aw148015 	list_t		*list;
    174  6212  aw148015 	probtabent_t	*rndtb;
    175  5184  ek110237 }
    176  5184  ek110237 
    177  5184  ek110237 %start commands
    178  5184  ek110237 
    179  5184  ek110237 %token FSC_LIST FSC_DEFINE FSC_EXEC FSC_QUIT FSC_DEBUG FSC_CREATE
    180  5184  ek110237 %token FSC_SLEEP FSC_STATS FSC_FOREACH FSC_SET FSC_SHUTDOWN FSC_LOG
    181  5184  ek110237 %token FSC_SYSTEM FSC_FLOWOP FSC_EVENTGEN FSC_ECHO FSC_LOAD FSC_RUN
    182  9513    Andrew %token FSC_WARMUP FSC_NOUSESTATS FSC_FSCHECK FSC_FSFLUSH
    183  7736    Andrew %token FSC_USAGE FSC_HELP FSC_VARS FSC_VERSION FSC_ENABLE FSC_DOMULTISYNC
    184  5184  ek110237 %token FSV_STRING FSV_VAL_INT FSV_VAL_BOOLEAN FSV_VARIABLE FSV_WHITESTRING
    185  6212  aw148015 %token FSV_RANDUNI FSV_RANDTAB FSV_RANDVAR FSV_URAND FSV_RAND48
    186  5184  ek110237 %token FST_INT FST_BOOLEAN
    187  5184  ek110237 %token FSE_FILE FSE_PROC FSE_THREAD FSE_CLEAR FSE_ALL FSE_SNAP FSE_DUMP
    188  6212  aw148015 %token FSE_DIRECTORY FSE_COMMAND FSE_FILESET FSE_XMLDUMP FSE_RAND FSE_MODE
    189  7736    Andrew %token FSE_MULTI FSE_MULTIDUMP
    190  5184  ek110237 %token FSK_SEPLST FSK_OPENLST FSK_CLOSELST FSK_ASSIGN FSK_IN FSK_QUOTE
    191  9801    Andrew %token FSK_DIRSEPLST FSK_PLUS FSK_MINUS FSK_MULTIPLY FSK_DIVIDE
    192  5184  ek110237 %token FSA_SIZE FSA_PREALLOC FSA_PARALLOC FSA_PATH FSA_REUSE
    193  9326    Andrew %token FSA_PROCESS FSA_MEMSIZE FSA_RATE FSA_CACHED FSA_READONLY FSA_TRUSTTREE
    194  5184  ek110237 %token FSA_IOSIZE FSA_FILE FSA_WSS FSA_NAME FSA_RANDOM FSA_INSTANCES
    195  5184  ek110237 %token FSA_DSYNC FSA_TARGET FSA_ITERS FSA_NICE FSA_VALUE FSA_BLOCKING
    196  5184  ek110237 %token FSA_HIGHWATER FSA_DIRECTIO FSA_DIRWIDTH FSA_FD FSA_SRCFD FSA_ROTATEFD
    197  6212  aw148015 %token FSA_NAMELENGTH FSA_FILESIZE FSA_ENTRIES FSA_FILESIZEGAMMA FSA_DIRDEPTHRV
    198  6212  aw148015 %token FSA_DIRGAMMA FSA_USEISM FSA_TYPE FSA_RANDTABLE FSA_RANDSRC FSA_RANDROUND
    199  9513    Andrew %token FSA_LEAFDIRS FSA_INDEXED FSA_FSTYPE
    200  7736    Andrew %token FSA_RANDSEED FSA_RANDGAMMA FSA_RANDMEAN FSA_RANDMIN FSA_MASTER
    201  7736    Andrew %token FSA_CLIENT
    202  6212  aw148015 %token FSS_TYPE FSS_SEED FSS_GAMMA FSS_MEAN FSS_MIN FSS_SRC FSS_ROUND
    203  6550  aw148015 %token FSV_SET_LOCAL_VAR FSA_LVAR_ASSIGN
    204  6212  aw148015 %token FSA_ALLDONE FSA_FIRSTDONE FSA_TIMEOUT
    205  5184  ek110237 
    206  5184  ek110237 %type <ival> FSV_VAL_INT
    207  5184  ek110237 %type <bval> FSV_VAL_BOOLEAN
    208  5184  ek110237 %type <sval> FSV_STRING
    209  5184  ek110237 %type <sval> FSV_WHITESTRING
    210  5184  ek110237 %type <sval> FSV_VARIABLE
    211  6212  aw148015 %type <sval> FSV_RANDVAR
    212  5184  ek110237 %type <sval> FSK_ASSIGN
    213  6550  aw148015 %type <sval> FSV_SET_LOCAL_VAR
    214  5184  ek110237 
    215  7736    Andrew %type <ival> FSC_LIST FSC_DEFINE FSC_SET FSC_LOAD FSC_RUN FSC_ENABLE
    216  7736    Andrew %type <ival> FSC_DOMULTISYNC
    217  6750  ek110237 %type <ival> FSE_FILE FSE_PROC FSE_THREAD FSE_CLEAR FSC_HELP FSC_VERSION
    218  5184  ek110237 
    219  5184  ek110237 %type <sval> name
    220  5184  ek110237 %type <ival> entity
    221  5184  ek110237 %type <val>  value
    222  5184  ek110237 
    223  6212  aw148015 %type <cmd> command inner_commands load_command run_command list_command
    224  6212  aw148015 %type <cmd> proc_define_command files_define_command randvar_define_command
    225  6550  aw148015 %type <cmd> fo_define_command debug_command create_command
    226  5184  ek110237 %type <cmd> sleep_command stats_command set_command shutdown_command
    227  5184  ek110237 %type <cmd> foreach_command log_command system_command flowop_command
    228  5184  ek110237 %type <cmd> eventgen_command quit_command flowop_list thread_list
    229  5184  ek110237 %type <cmd> thread echo_command usage_command help_command vars_command
    230  9513    Andrew %type <cmd> version_command enable_command multisync_command
    231  9513    Andrew %type <cmd> warmup_command fscheck_command fsflush_command
    232  9801    Andrew %type <cmd> set_integer_command set_other_command
    233  5184  ek110237 
    234  6212  aw148015 %type <attr> files_attr_op files_attr_ops pt_attr_op pt_attr_ops
    235  6212  aw148015 %type <attr> fo_attr_op fo_attr_ops ev_attr_op ev_attr_ops
    236  6212  aw148015 %type <attr> randvar_attr_op randvar_attr_ops randvar_attr_typop
    237  6212  aw148015 %type <attr> randvar_attr_srcop attr_value attr_list_value
    238  6550  aw148015 %type <attr> comp_lvar_def comp_attr_op comp_attr_ops
    239  7736    Andrew %type <attr> enable_multi_ops enable_multi_op multisync_op
    240  9513    Andrew %type <attr> fscheck_attr_op
    241  6212  aw148015 %type <list> integer_seplist string_seplist string_list var_string_list
    242  6212  aw148015 %type <list> var_string whitevar_string whitevar_string_list
    243  6212  aw148015 %type <ival> attrs_define_file attrs_define_thread attrs_flowop
    244  6550  aw148015 %type <ival> attrs_define_fileset attrs_define_proc attrs_eventgen attrs_define_comp
    245  6212  aw148015 %type <ival> files_attr_name pt_attr_name fo_attr_name ev_attr_name
    246  6212  aw148015 %type <ival> randvar_attr_name FSA_TYPE randtype_name randvar_attr_param
    247  7736    Andrew %type <ival> randsrc_name FSA_RANDSRC randvar_attr_tsp em_attr_name
    248  6212  aw148015 %type <ival> FSS_TYPE FSS_SEED FSS_GAMMA FSS_MEAN FSS_MIN FSS_SRC
    249  9801    Andrew %type <ival> fscheck_attr_name FSA_FSTYPE binary_op
    250  5184  ek110237 
    251  6212  aw148015 %type <rndtb>  probtabentry_list probtabentry
    252  6212  aw148015 %type <avd> var_int_val
    253  5184  ek110237 %%
    254  5184  ek110237 
    255  5184  ek110237 commands: commands command
    256  5184  ek110237 {
    257  5184  ek110237 	list_t *list = NULL;
    258  5184  ek110237 	list_t *list_end = NULL;
    259  5184  ek110237 
    260  5184  ek110237 	if ($2->cmd != NULL)
    261  5184  ek110237 		$2->cmd($2);
    262  5184  ek110237 
    263  5184  ek110237 	free($2);
    264  5184  ek110237 }
    265  5184  ek110237 | commands error
    266  5184  ek110237 {
    267  5184  ek110237 	if (dofile)
    268  5184  ek110237 		YYABORT;
    269  5184  ek110237 }
    270  5184  ek110237 |;
    271  5184  ek110237 
    272  5184  ek110237 inner_commands: command
    273  5184  ek110237 {
    274  5184  ek110237 	filebench_log(LOG_DEBUG_IMPL, "inner_command %zx", $1);
    275  5184  ek110237 	$$ = $1;
    276  5184  ek110237 }
    277  5184  ek110237 | inner_commands command
    278  5184  ek110237 {
    279  5184  ek110237 	cmd_t *list = NULL;
    280  5184  ek110237 	cmd_t *list_end = NULL;
    281  5184  ek110237 
    282  5184  ek110237 	/* Find end of list */
    283  5184  ek110237 	for (list = $1; list != NULL;
    284  5184  ek110237 	    list = list->cmd_next)
    285  5184  ek110237 		list_end = list;
    286  5184  ek110237 
    287  5184  ek110237 	list_end->cmd_next = $2;
    288  5184  ek110237 
    289  5184  ek110237 	filebench_log(LOG_DEBUG_IMPL,
    290  5184  ek110237 	    "inner_commands adding cmd %zx to list %zx", $2, $1);
    291  5184  ek110237 
    292  5184  ek110237 	$$ = $1;
    293  5184  ek110237 };
    294  5184  ek110237 
    295  5184  ek110237 command:
    296  6212  aw148015   proc_define_command
    297  6212  aw148015 | files_define_command
    298  6212  aw148015 | randvar_define_command
    299  6550  aw148015 | fo_define_command
    300  5184  ek110237 | debug_command
    301  5184  ek110237 | eventgen_command
    302  5184  ek110237 | create_command
    303  5184  ek110237 | echo_command
    304  5184  ek110237 | usage_command
    305  5184  ek110237 | vars_command
    306  5184  ek110237 | foreach_command
    307  9513    Andrew | fscheck_command
    308  9513    Andrew | fsflush_command
    309  5184  ek110237 | help_command
    310  5184  ek110237 | list_command
    311  5184  ek110237 | load_command
    312  5184  ek110237 | log_command
    313  5184  ek110237 | run_command
    314  5184  ek110237 | set_command
    315  5184  ek110237 | shutdown_command
    316  5184  ek110237 | sleep_command
    317  9326    Andrew | warmup_command
    318  5184  ek110237 | stats_command
    319  5184  ek110237 | system_command
    320  6750  ek110237 | version_command
    321  7736    Andrew | enable_command
    322  7736    Andrew | multisync_command
    323  5184  ek110237 | quit_command;
    324  5184  ek110237 
    325  5184  ek110237 foreach_command: FSC_FOREACH
    326  5184  ek110237 {
    327  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
    328  5184  ek110237 		YYERROR;
    329  5184  ek110237 	filebench_log(LOG_DEBUG_IMPL, "foreach_command %zx", $$);
    330  5184  ek110237 }
    331  5184  ek110237 | foreach_command FSV_VARIABLE FSK_IN integer_seplist FSK_OPENLST inner_commands FSK_CLOSELST
    332  5184  ek110237 {
    333  5184  ek110237 	cmd_t *cmd, *inner_cmd;
    334  5184  ek110237 	list_t *list;
    335  5184  ek110237 
    336  5184  ek110237 	$$ = $1;
    337  5184  ek110237 	$$->cmd_list = $6;
    338  5184  ek110237 	$$->cmd_tgt1 = $2;
    339  5184  ek110237 	$$->cmd_param_list = $4;
    340  5184  ek110237 	$$->cmd = parser_foreach_integer;
    341  5184  ek110237 
    342  5184  ek110237 	for (list = $$->cmd_param_list; list != NULL;
    343  5184  ek110237 	    list = list->list_next) {
    344  5184  ek110237 		for (inner_cmd = $$->cmd_list;
    345  5184  ek110237 		    inner_cmd != NULL;
    346  5184  ek110237 		    inner_cmd = inner_cmd->cmd_next) {
    347  5184  ek110237 			filebench_log(LOG_DEBUG_IMPL,
    348  6286  aw148015 			    "packing foreach: %zx %s=%llu, cmd %zx",
    349  6212  aw148015 			    $$, $$->cmd_tgt1,
    350  6286  aw148015 			    (u_longlong_t)avd_get_int(list->list_integer),
    351  6286  aw148015 			    inner_cmd);
    352  5184  ek110237 		}
    353  5184  ek110237 	}
    354  5184  ek110237 }| foreach_command FSV_VARIABLE FSK_IN string_seplist FSK_OPENLST inner_commands FSK_CLOSELST
    355  5184  ek110237 {
    356  5184  ek110237 	cmd_t *cmd, *inner_cmd;
    357  5184  ek110237 	list_t *list;
    358  5184  ek110237 
    359  5184  ek110237 	$$ = $1;
    360  5184  ek110237 	$$->cmd_list = $6;
    361  5184  ek110237 	$$->cmd_tgt1 = $2;
    362  5184  ek110237 	$$->cmd_param_list = $4;
    363  5184  ek110237 	$$->cmd = parser_foreach_string;
    364  5184  ek110237 
    365  5184  ek110237 	for (list = $$->cmd_param_list; list != NULL;
    366  5184  ek110237 	    list = list->list_next) {
    367  5184  ek110237 		for (inner_cmd = $$->cmd_list;
    368  5184  ek110237 		    inner_cmd != NULL;
    369  5184  ek110237 		    inner_cmd = inner_cmd->cmd_next) {
    370  5184  ek110237 			filebench_log(LOG_DEBUG_IMPL,
    371  5184  ek110237 			    "packing foreach: %zx %s=%s, cmd %zx",
    372  5184  ek110237 			    $$,
    373  5184  ek110237 			    $$->cmd_tgt1,
    374  5184  ek110237 			    *list->list_string, inner_cmd);
    375  5184  ek110237 		}
    376  5184  ek110237 	}
    377  5184  ek110237 };
    378  5184  ek110237 
    379  5184  ek110237 integer_seplist: FSV_VAL_INT
    380  5184  ek110237 {
    381  5184  ek110237 	if (($$ = alloc_list()) == NULL)
    382  5184  ek110237 		YYERROR;
    383  5184  ek110237 
    384  6212  aw148015 	$$->list_integer = avd_int_alloc($1);
    385  5184  ek110237 }
    386  5184  ek110237 | integer_seplist FSK_SEPLST FSV_VAL_INT
    387  5184  ek110237 {
    388  5184  ek110237 	list_t *list = NULL;
    389  5184  ek110237 	list_t *list_end = NULL;
    390  5184  ek110237 
    391  5184  ek110237 	if (($$ = alloc_list()) == NULL)
    392  5184  ek110237 		YYERROR;
    393  5184  ek110237 
    394  6212  aw148015 	$$->list_integer = avd_int_alloc($3);
    395  5184  ek110237 
    396  5184  ek110237 	/* Find end of list */
    397  5184  ek110237 	for (list = $1; list != NULL;
    398  5184  ek110237 	    list = list->list_next)
    399  5184  ek110237 		list_end = list;
    400  5184  ek110237 	list_end->list_next = $$;
    401  5184  ek110237 	$$ = $1;
    402  5184  ek110237 };
    403  5184  ek110237 
    404  5184  ek110237 string_seplist: FSK_QUOTE FSV_WHITESTRING FSK_QUOTE
    405  5184  ek110237 {
    406  5184  ek110237 	if (($$ = alloc_list()) == NULL)
    407  5184  ek110237 		YYERROR;
    408  5184  ek110237 
    409  6212  aw148015 	$$->list_string = avd_str_alloc($2);
    410  5184  ek110237 }
    411  5184  ek110237 | string_seplist FSK_SEPLST FSK_QUOTE FSV_WHITESTRING FSK_QUOTE
    412  5184  ek110237 {
    413  5184  ek110237 	list_t *list = NULL;
    414  5184  ek110237 	list_t *list_end = NULL;
    415  5184  ek110237 
    416  5184  ek110237 	if (($$ = alloc_list()) == NULL)
    417  5184  ek110237 			YYERROR;
    418  5184  ek110237 
    419  6212  aw148015 	$$->list_string = avd_str_alloc($4);
    420  5184  ek110237 
    421  5184  ek110237 	/* Find end of list */
    422  5184  ek110237 	for (list = $1; list != NULL;
    423  5184  ek110237 	    list = list->list_next)
    424  5184  ek110237 		list_end = list;
    425  5184  ek110237 	list_end->list_next = $$;
    426  5184  ek110237 	$$ = $1;
    427  5184  ek110237 };
    428  5184  ek110237 
    429  5184  ek110237 eventgen_command: FSC_EVENTGEN
    430  5184  ek110237 {
    431  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
    432  5184  ek110237 		YYERROR;
    433  5184  ek110237 	$$->cmd = &parser_eventgen;
    434  5184  ek110237 }
    435  6212  aw148015 | eventgen_command ev_attr_ops
    436  5184  ek110237 {
    437  5184  ek110237 	$1->cmd_attr_list = $2;
    438  5184  ek110237 };
    439  5184  ek110237 
    440  5184  ek110237 system_command: FSC_SYSTEM whitevar_string_list
    441  5184  ek110237 {
    442  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
    443  5184  ek110237 		YYERROR;
    444  5184  ek110237 
    445  5184  ek110237 	$$->cmd_param_list = $2;
    446  5184  ek110237 	$$->cmd = parser_system;
    447  5184  ek110237 };
    448  5184  ek110237 
    449  5184  ek110237 echo_command: FSC_ECHO whitevar_string_list
    450  5184  ek110237 {
    451  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
    452  5184  ek110237 		YYERROR;
    453  5184  ek110237 
    454  5184  ek110237 	$$->cmd_param_list = $2;
    455  5184  ek110237 	$$->cmd = parser_echo;
    456  6750  ek110237 };
    457  6750  ek110237 
    458  6750  ek110237 version_command: FSC_VERSION
    459  6750  ek110237 {
    460  6750  ek110237 	if (($$ = alloc_cmd()) == NULL)
    461  6750  ek110237 		YYERROR;
    462  6750  ek110237 	$$->cmd = parser_version;
    463  5184  ek110237 };
    464  5184  ek110237 
    465  5184  ek110237 usage_command: FSC_USAGE whitevar_string_list
    466  5184  ek110237 {
    467  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
    468  5184  ek110237 		YYERROR;
    469  5184  ek110237 
    470  5184  ek110237 	$$->cmd_param_list = $2;
    471  5184  ek110237 	$$->cmd = parser_usage;
    472  5184  ek110237 };
    473  5184  ek110237 
    474  5184  ek110237 vars_command: FSC_VARS
    475  5184  ek110237 {
    476  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
    477  5184  ek110237 		YYERROR;
    478  5184  ek110237 
    479  5184  ek110237 	$$->cmd = parser_printvars;
    480  5184  ek110237 };
    481  5184  ek110237 
    482  7736    Andrew enable_command: FSC_ENABLE FSE_MULTI
    483  7736    Andrew {
    484  7736    Andrew 	if (($$ = alloc_cmd()) == NULL)
    485  7736    Andrew 		YYERROR;
    486  7736    Andrew 
    487  7736    Andrew 	$$->cmd = parser_enable_mc;
    488  7736    Andrew }
    489  7736    Andrew | enable_command  enable_multi_ops
    490  7736    Andrew {
    491  7736    Andrew 	$1->cmd_attr_list = $2;
    492  7736    Andrew };
    493  7736    Andrew 
    494  7736    Andrew multisync_command: FSC_DOMULTISYNC multisync_op
    495  7736    Andrew {
    496  7736    Andrew 	if (($$ = alloc_cmd()) == NULL)
    497  7736    Andrew 		YYERROR;
    498  7736    Andrew 
    499  7736    Andrew 	$$->cmd = parser_domultisync;
    500  7736    Andrew 	$$->cmd_attr_list = $2;
    501  7736    Andrew }
    502  7736    Andrew 
    503  5184  ek110237 string_list: FSV_VARIABLE
    504  5184  ek110237 {
    505  5184  ek110237 	if (($$ = alloc_list()) == NULL)
    506  5184  ek110237 			YYERROR;
    507  6212  aw148015 	$$->list_string = avd_str_alloc($1);
    508  5184  ek110237 }
    509  5184  ek110237 | string_list FSK_SEPLST FSV_VARIABLE
    510  5184  ek110237 {
    511  5184  ek110237 	list_t *list = NULL;
    512  5184  ek110237 	list_t *list_end = NULL;
    513  5184  ek110237 
    514  5184  ek110237 	if (($$ = alloc_list()) == NULL)
    515  5184  ek110237 		YYERROR;
    516  5184  ek110237 
    517  6212  aw148015 	$$->list_string = avd_str_alloc($3);
    518  5184  ek110237 
    519  5184  ek110237 	/* Find end of list */
    520  5184  ek110237 	for (list = $1; list != NULL;
    521  5184  ek110237 	    list = list->list_next)
    522  5184  ek110237 		list_end = list;
    523  5184  ek110237 	list_end->list_next = $$;
    524  5184  ek110237 	$$ = $1;
    525  5184  ek110237 };
    526  5184  ek110237 
    527  5184  ek110237 var_string: FSV_VARIABLE
    528  5184  ek110237 {
    529  5184  ek110237 	if (($$ = alloc_list()) == NULL)
    530  5184  ek110237 			YYERROR;
    531  5184  ek110237 
    532  6212  aw148015 	$$->list_string = avd_str_alloc($1);
    533  5184  ek110237 }
    534  5184  ek110237 | FSV_STRING
    535  5184  ek110237 {
    536  5184  ek110237 	if (($$ = alloc_list()) == NULL)
    537  5184  ek110237 			YYERROR;
    538  5184  ek110237 
    539  6212  aw148015 	$$->list_string = avd_str_alloc($1);
    540  5184  ek110237 };
    541  5184  ek110237 
    542  5184  ek110237 var_string_list: var_string
    543  5184  ek110237 {
    544  5184  ek110237 	$$ = $1;
    545  5184  ek110237 }| var_string FSV_STRING
    546  5184  ek110237 {
    547  5184  ek110237 	list_t *list = NULL;
    548  5184  ek110237 	list_t *list_end = NULL;
    549  5184  ek110237 
    550  5184  ek110237 	/* Add string */
    551  5184  ek110237 	if (($$ = alloc_list()) == NULL)
    552  5184  ek110237 		YYERROR;
    553  5184  ek110237 
    554  6212  aw148015 	$$->list_string = avd_str_alloc($2);
    555  5184  ek110237 
    556  5184  ek110237 	/* Find end of list */
    557  5184  ek110237 	for (list = $1; list != NULL;
    558  5184  ek110237 	    list = list->list_next)
    559  5184  ek110237 		list_end = list;
    560  5184  ek110237 	list_end->list_next = $$;
    561  5184  ek110237 	$$ = $1;
    562  5184  ek110237 
    563  5184  ek110237 }| var_string FSV_VARIABLE
    564  5184  ek110237 {
    565  5184  ek110237 	list_t *list = NULL;
    566  5184  ek110237 	list_t *list_end = NULL;
    567  5184  ek110237 
    568  5184  ek110237 	/* Add variable */
    569  5184  ek110237 	if (($$ = alloc_list()) == NULL)
    570  5184  ek110237 		YYERROR;
    571  5184  ek110237 
    572  6212  aw148015 	$$->list_string = avd_str_alloc($2);
    573  5184  ek110237 
    574  5184  ek110237 	/* Find end of list */
    575  5184  ek110237 	for (list = $1; list != NULL;
    576  5184  ek110237 	    list = list->list_next)
    577  5184  ek110237 		list_end = list;
    578  5184  ek110237 	list_end->list_next = $$;
    579  5184  ek110237 	$$ = $1;
    580  5184  ek110237 } |var_string_list FSV_STRING
    581  5184  ek110237 {
    582  5184  ek110237 	list_t *list = NULL;
    583  5184  ek110237 	list_t *list_end = NULL;
    584  5184  ek110237 
    585  5184  ek110237 	/* Add string */
    586  5184  ek110237 	if (($$ = alloc_list()) == NULL)
    587  5184  ek110237 		YYERROR;
    588  5184  ek110237 
    589  6212  aw148015 	$$->list_string = avd_str_alloc($2);
    590  5184  ek110237 
    591  5184  ek110237 	/* Find end of list */
    592  5184  ek110237 	for (list = $1; list != NULL;
    593  5184  ek110237 	    list = list->list_next)
    594  5184  ek110237 		list_end = list;
    595  5184  ek110237 	list_end->list_next = $$;
    596  5184  ek110237 	$$ = $1;
    597  5184  ek110237 
    598  5184  ek110237 }| var_string_list FSV_VARIABLE
    599  5184  ek110237 {
    600  5184  ek110237 	list_t *list = NULL;
    601  5184  ek110237 	list_t *list_end = NULL;
    602  5184  ek110237 
    603  5184  ek110237 	/* Add variable */
    604  5184  ek110237 	if (($$ = alloc_list()) == NULL)
    605  5184  ek110237 		YYERROR;
    606  5184  ek110237 
    607  6212  aw148015 	$$->list_string = avd_str_alloc($2);
    608  5184  ek110237 
    609  5184  ek110237 	/* Find end of list */
    610  5184  ek110237 	for (list = $1; list != NULL;
    611  5184  ek110237 	    list = list->list_next)
    612  5184  ek110237 		list_end = list;
    613  5184  ek110237 	list_end->list_next = $$;
    614  5184  ek110237 	$$ = $1;
    615  5184  ek110237 };
    616  5184  ek110237 
    617  5184  ek110237 whitevar_string: FSK_QUOTE FSV_VARIABLE
    618  5184  ek110237 {
    619  5184  ek110237 	if (($$ = alloc_list()) == NULL)
    620  5184  ek110237 			YYERROR;
    621  5184  ek110237 
    622  6212  aw148015 	$$->list_string = avd_str_alloc($2);
    623  5184  ek110237 }
    624  5184  ek110237 | FSK_QUOTE FSV_WHITESTRING
    625  5184  ek110237 {
    626  5184  ek110237 	if (($$ = alloc_list()) == NULL)
    627  5184  ek110237 			YYERROR;
    628  5184  ek110237 
    629  6212  aw148015 	$$->list_string = avd_str_alloc($2);
    630  5184  ek110237 };
    631  5184  ek110237 
    632  5184  ek110237 whitevar_string_list: whitevar_string FSV_WHITESTRING
    633  5184  ek110237 {
    634  5184  ek110237 	list_t *list = NULL;
    635  5184  ek110237 	list_t *list_end = NULL;
    636  5184  ek110237 
    637  5184  ek110237 	/* Add string */
    638  5184  ek110237 	if (($$ = alloc_list()) == NULL)
    639  5184  ek110237 		YYERROR;
    640  5184  ek110237 
    641  6212  aw148015 	$$->list_string = avd_str_alloc($2);
    642  5184  ek110237 
    643  5184  ek110237 	/* Find end of list */
    644  5184  ek110237 	for (list = $1; list != NULL;
    645  5184  ek110237 	    list = list->list_next)
    646  5184  ek110237 		list_end = list;
    647  5184  ek110237 	list_end->list_next = $$;
    648  5184  ek110237 	$$ = $1;
    649  5184  ek110237 
    650  5184  ek110237 }| whitevar_string FSV_VARIABLE
    651  5184  ek110237 {
    652  5184  ek110237 	list_t *list = NULL;
    653  5184  ek110237 	list_t *list_end = NULL;
    654  5184  ek110237 
    655  5184  ek110237 	/* Add variable */
    656  5184  ek110237 	if (($$ = alloc_list()) == NULL)
    657  5184  ek110237 		YYERROR;
    658  5184  ek110237 
    659  6212  aw148015 	$$->list_string = avd_str_alloc($2);
    660  5184  ek110237 
    661  5184  ek110237 	/* Find end of list */
    662  5184  ek110237 	for (list = $1; list != NULL;
    663  5184  ek110237 	    list = list->list_next)
    664  5184  ek110237 		list_end = list;
    665  5184  ek110237 	list_end->list_next = $$;
    666  5184  ek110237 	$$ = $1;
    667  6212  aw148015 }| whitevar_string FSV_RANDVAR randvar_attr_tsp
    668  6212  aw148015 {
    669  6212  aw148015 	list_t *list = NULL;
    670  6212  aw148015 	list_t *list_end = NULL;
    671  6212  aw148015 
    672  6212  aw148015 	/* Add variable */
    673  6212  aw148015 	if (($$ = alloc_list()) == NULL)
    674  6212  aw148015 		YYERROR;
    675  6212  aw148015 
    676  6212  aw148015 	$$->list_string = avd_str_alloc($2);
    677  6212  aw148015 	$$->list_integer = avd_int_alloc($3);
    678  6212  aw148015 
    679  6212  aw148015 	/* Find end of list */
    680  6212  aw148015 	for (list = $1; list != NULL;
    681  6212  aw148015 	    list = list->list_next)
    682  6212  aw148015 		list_end = list;
    683  6212  aw148015 	list_end->list_next = $$;
    684  6212  aw148015 	$$ = $1;
    685  6212  aw148015 }| whitevar_string_list FSV_WHITESTRING
    686  5184  ek110237 {
    687  5184  ek110237 	list_t *list = NULL;
    688  5184  ek110237 	list_t *list_end = NULL;
    689  5184  ek110237 
    690  5184  ek110237 	/* Add string */
    691  5184  ek110237 	if (($$ = alloc_list()) == NULL)
    692  5184  ek110237 		YYERROR;
    693  5184  ek110237 
    694  6212  aw148015 	$$->list_string = avd_str_alloc($2);
    695  5184  ek110237 
    696  5184  ek110237 	/* Find end of list */
    697  5184  ek110237 	for (list = $1; list != NULL;
    698  5184  ek110237 	    list = list->list_next)
    699  5184  ek110237 		list_end = list;
    700  5184  ek110237 	list_end->list_next = $$;
    701  5184  ek110237 	$$ = $1;
    702  5184  ek110237 
    703  5184  ek110237 }| whitevar_string_list FSV_VARIABLE
    704  5184  ek110237 {
    705  5184  ek110237 	list_t *list = NULL;
    706  5184  ek110237 	list_t *list_end = NULL;
    707  5184  ek110237 
    708  5184  ek110237 	/* Add variable */
    709  5184  ek110237 	if (($$ = alloc_list()) == NULL)
    710  5184  ek110237 		YYERROR;
    711  5184  ek110237 
    712  6212  aw148015 	$$->list_string = avd_str_alloc($2);
    713  6212  aw148015 
    714  6212  aw148015 	/* Find end of list */
    715  6212  aw148015 	for (list = $1; list != NULL;
    716  6212  aw148015 	    list = list->list_next)
    717  6212  aw148015 		list_end = list;
    718  6212  aw148015 	list_end->list_next = $$;
    719  6212  aw148015 	$$ = $1;
    720  6212  aw148015 }| whitevar_string_list FSV_RANDVAR randvar_attr_tsp
    721  6212  aw148015 {
    722  6212  aw148015 	list_t *list = NULL;
    723  6212  aw148015 	list_t *list_end = NULL;
    724  6212  aw148015 
    725  6212  aw148015 	/* Add variable */
    726  6212  aw148015 	if (($$ = alloc_list()) == NULL)
    727  6212  aw148015 		YYERROR;
    728  6212  aw148015 
    729  6212  aw148015 	$$->list_string = avd_str_alloc($2);
    730  6212  aw148015 	$$->list_integer = avd_int_alloc($3);
    731  5184  ek110237 
    732  5184  ek110237 	/* Find end of list */
    733  5184  ek110237 	for (list = $1; list != NULL;
    734  5184  ek110237 	    list = list->list_next)
    735  5184  ek110237 		list_end = list;
    736  5184  ek110237 	list_end->list_next = $$;
    737  5184  ek110237 	$$ = $1;
    738  5184  ek110237 }| whitevar_string_list FSK_QUOTE
    739  5184  ek110237 {
    740  5184  ek110237 	$$ = $1;
    741  5184  ek110237 }| whitevar_string FSK_QUOTE
    742  5184  ek110237 {
    743  5184  ek110237 	$$ = $1;
    744  5184  ek110237 };
    745  5184  ek110237 
    746  5184  ek110237 list_command: FSC_LIST
    747  5184  ek110237 {
    748  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
    749  5184  ek110237 		YYERROR;
    750  5184  ek110237 	$$->cmd = &parser_list;
    751  6212  aw148015 }
    752  6212  aw148015 | list_command FSC_FLOWOP
    753  6212  aw148015 {
    754  6212  aw148015 	$1->cmd = &parser_flowop_list;
    755  5184  ek110237 };
    756  5184  ek110237 
    757  9513    Andrew fscheck_command: FSC_FSCHECK fscheck_attr_op
    758  9513    Andrew {
    759  9513    Andrew 	if (($$ = alloc_cmd()) == NULL)
    760  9513    Andrew 		YYERROR;
    761  9513    Andrew 	$$->cmd = &parser_fscheck;
    762  9513    Andrew 
    763  9513    Andrew 	$$->cmd_attr_list = $2;
    764  9513    Andrew }
    765  9513    Andrew | fscheck_command fscheck_attr_op
    766  9513    Andrew {
    767  9513    Andrew 	$1->cmd_attr_list->attr_next = $2;
    768  9513    Andrew };
    769  9513    Andrew 
    770  9513    Andrew fsflush_command: FSC_FSFLUSH fscheck_attr_op
    771  9513    Andrew {
    772  9513    Andrew 	if (($$ = alloc_cmd()) == NULL)
    773  9513    Andrew 		YYERROR;
    774  9513    Andrew 	$$->cmd = &parser_fsflush;
    775  9513    Andrew 
    776  9513    Andrew 	$$->cmd_attr_list = $2;
    777  9513    Andrew };
    778  9513    Andrew 
    779  5184  ek110237 log_command: FSC_LOG whitevar_string_list
    780  5184  ek110237 {
    781  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
    782  5184  ek110237 		YYERROR;
    783  5184  ek110237 	$$->cmd = &parser_log;
    784  5184  ek110237 	$$->cmd_param_list = $2;
    785  5184  ek110237 };
    786  5184  ek110237 
    787  5184  ek110237 debug_command: FSC_DEBUG FSV_VAL_INT
    788  5184  ek110237 {
    789  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
    790  5184  ek110237 		YYERROR;
    791  5184  ek110237 	$$->cmd = NULL;
    792  6391  aw148015 	filebench_shm->shm_debug_level = $2;
    793  6391  aw148015 	if (filebench_shm->shm_debug_level > 9)
    794  5184  ek110237 		yydebug = 1;
    795  5184  ek110237 };
    796  5184  ek110237 
    797  9801    Andrew set_command:
    798  9801    Andrew    set_integer_command
    799  9801    Andrew  | set_other_command;
    800  9801    Andrew 
    801  9801    Andrew set_integer_command: FSC_SET FSV_VARIABLE FSK_ASSIGN FSV_VAL_INT
    802  9801    Andrew {
    803  9801    Andrew 	if (($$ = alloc_cmd()) == NULL)
    804  9801    Andrew 		YYERROR;
    805  9801    Andrew 	$$->cmd_tgt1 = $2;
    806  9801    Andrew 	$$->cmd_qty = $4;
    807  9801    Andrew 	if (parentscript) {
    808  9801    Andrew 		parser_vars($$);
    809  9801    Andrew 	}
    810  9801    Andrew 	$$->cmd = parser_set_integer;
    811  9801    Andrew }| FSC_SET FSV_VARIABLE FSK_ASSIGN FSV_VARIABLE
    812  9801    Andrew {
    813  9801    Andrew 	if (($$ = alloc_cmd()) == NULL)
    814  9801    Andrew 		YYERROR;
    815  9801    Andrew 	var_assign_var($2, $4);
    816  9801    Andrew 	$$->cmd_tgt1 = $2;
    817  9801    Andrew 	$$->cmd_tgt2 = $4;
    818  9801    Andrew 	if (parentscript) {
    819  9801    Andrew 		parser_vars($$);
    820  9801    Andrew 	}
    821  9801    Andrew 	$$->cmd = parser_set_var;
    822  9801    Andrew }
    823  9801    Andrew | set_integer_command binary_op FSV_VAL_INT
    824  9801    Andrew {
    825  9801    Andrew 	if ($1->cmd == parser_set_integer) {
    826  9801    Andrew 		switch ($2) {
    827  9801    Andrew 		case FSK_PLUS:
    828  9801    Andrew 			var_assign_integer($1->cmd_tgt1, $1->cmd_qty + $3);
    829  9801    Andrew 			break;
    830  9801    Andrew 		case FSK_MINUS:
    831  9801    Andrew 			var_assign_integer($1->cmd_tgt1, $1->cmd_qty - $3);
    832  9801    Andrew 			break;
    833  9801    Andrew 		case FSK_MULTIPLY:
    834  9801    Andrew 			var_assign_integer($1->cmd_tgt1, $1->cmd_qty * $3);
    835  9801    Andrew 			break;
    836  9801    Andrew 		case FSK_DIVIDE:
    837  9801    Andrew 			var_assign_integer($1->cmd_tgt1, $1->cmd_qty / $3);
    838  9801    Andrew 			break;
    839  9801    Andrew 		}
    840  9801    Andrew 		$$->cmd = NULL;
    841  9801    Andrew 	} else {
    842  9801    Andrew 		$1->cmd_qty = $3;
    843  9801    Andrew 		$1->cmd_subtype = $2;
    844  9801    Andrew 		$1->cmd = parser_set_var_op_int;
    845  9801    Andrew 	}
    846  9801    Andrew }
    847  9801    Andrew | set_integer_command binary_op FSV_VARIABLE
    848  9801    Andrew {
    849  9801    Andrew 	$1->cmd_tgt3 = $3;
    850  9801    Andrew 	$1->cmd_subtype = $2;
    851  9801    Andrew 	if ($1->cmd == parser_set_integer) {
    852  9801    Andrew 		$$->cmd = parser_set_int_op_var;
    853  9801    Andrew 	} else {
    854  9801    Andrew 		$1->cmd = parser_set_var_op_var;
    855  9801    Andrew 	}
    856  9801    Andrew };
    857  9801    Andrew 
    858  9801    Andrew set_other_command: FSC_SET FSV_VARIABLE FSK_ASSIGN FSV_VAL_BOOLEAN
    859  9801    Andrew {
    860  9801    Andrew 	if (($$ = alloc_cmd()) == NULL)
    861  9801    Andrew 		YYERROR;
    862  9801    Andrew 	var_assign_boolean($2, $4);
    863  6212  aw148015 	if (parentscript) {
    864  6212  aw148015 		$$->cmd_tgt1 = $2;
    865  6212  aw148015 		parser_vars($$);
    866  6212  aw148015 	}
    867  6212  aw148015 	$$->cmd = NULL;
    868  6212  aw148015 }
    869  9801    Andrew | FSC_SET FSV_VARIABLE FSK_ASSIGN FSK_QUOTE FSV_WHITESTRING FSK_QUOTE
    870  9801    Andrew {
    871  9801    Andrew 	if (($$ = alloc_cmd()) == NULL)
    872  9801    Andrew 		YYERROR;
    873  9801    Andrew 	var_assign_string($2, $5);
    874  5184  ek110237 	if (parentscript) {
    875  5184  ek110237 		$$->cmd_tgt1 = $2;
    876  5184  ek110237 		parser_vars($$);
    877  5184  ek110237 	}
    878  5184  ek110237 	$$->cmd = NULL;
    879  5184  ek110237 }| FSC_SET FSV_VARIABLE FSK_ASSIGN FSV_STRING
    880  5184  ek110237 {
    881  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
    882  5184  ek110237 		YYERROR;
    883  5184  ek110237 	var_assign_string($2, $4);
    884  5184  ek110237 	if (parentscript) {
    885  5184  ek110237 		$$->cmd_tgt1 = $2;
    886  5184  ek110237 		parser_vars($$);
    887  5184  ek110237 	}
    888  5184  ek110237 	$$->cmd = NULL;
    889  6084  aw148015 } | FSC_SET FSE_MODE FSC_QUIT FSA_TIMEOUT
    890  6084  aw148015 {
    891  6084  aw148015 	filebench_shm->shm_rmode = FILEBENCH_MODE_TIMEOUT;
    892  6084  aw148015 	if (($$ = alloc_cmd()) == NULL)
    893  6084  aw148015 		YYERROR;
    894  6084  aw148015 	$$->cmd = NULL;
    895  6084  aw148015 } | FSC_SET FSE_MODE FSC_QUIT FSA_ALLDONE
    896  6084  aw148015 {
    897  6084  aw148015 	filebench_shm->shm_rmode = FILEBENCH_MODE_QALLDONE;
    898  6084  aw148015 	if (($$ = alloc_cmd()) == NULL)
    899  6084  aw148015 		YYERROR;
    900  6084  aw148015 	$$->cmd = NULL;
    901  6084  aw148015 } | FSC_SET FSE_MODE FSC_QUIT FSA_FIRSTDONE
    902  6084  aw148015 {
    903  6084  aw148015 	filebench_shm->shm_rmode = FILEBENCH_MODE_Q1STDONE;
    904  6084  aw148015 	if (($$ = alloc_cmd()) == NULL)
    905  6084  aw148015 		YYERROR;
    906  6084  aw148015 	$$->cmd = NULL;
    907  9356    Andrew } | FSC_SET FSE_MODE FSC_NOUSESTATS
    908  9356    Andrew {
    909  9356    Andrew 	filebench_shm->shm_mmode |= FILEBENCH_MODE_NOUSAGE;
    910  9356    Andrew 	filebench_log(LOG_INFO, "disabling CPU usage statistics");
    911  9356    Andrew 	if (($$ = alloc_cmd()) == NULL)
    912  9356    Andrew 		YYERROR;
    913  9356    Andrew 	$$->cmd = NULL;
    914  9513    Andrew } | FSC_SET FSV_RANDVAR FSS_TYPE FSK_ASSIGN randvar_attr_typop
    915  6212  aw148015 {
    916  6212  aw148015 	if (($$ = alloc_cmd()) == NULL)
    917  6212  aw148015 		YYERROR;
    918  6212  aw148015 	$$->cmd = &parser_randvar_set;
    919  6212  aw148015 	$$->cmd_tgt1 = $2;
    920  6212  aw148015 	$$->cmd_qty = FSS_TYPE;
    921  6212  aw148015 	$$->cmd_attr_list = $5;
    922  6212  aw148015 
    923  9513    Andrew } | FSC_SET FSV_RANDVAR FSS_SRC FSK_ASSIGN randvar_attr_srcop
    924  6212  aw148015 {
    925  6212  aw148015 	if (($$ = alloc_cmd()) == NULL)
    926  6212  aw148015 		YYERROR;
    927  6212  aw148015 	$$->cmd = &parser_randvar_set;
    928  6212  aw148015 	$$->cmd_tgt1 = $2;
    929  6212  aw148015 	$$->cmd_qty = FSS_SRC;
    930  6212  aw148015 	$$->cmd_attr_list = $5;
    931  6212  aw148015 
    932  9513    Andrew } | FSC_SET FSV_RANDVAR randvar_attr_param FSK_ASSIGN attr_value
    933  6212  aw148015 {
    934  6212  aw148015 	if (($$ = alloc_cmd()) == NULL)
    935  6212  aw148015 		YYERROR;
    936  6212  aw148015 	$$->cmd = &parser_randvar_set;
    937  6212  aw148015 	$$->cmd_tgt1 = $2;
    938  6212  aw148015 	$$->cmd_qty = $3;
    939  6212  aw148015 	$$->cmd_attr_list = $5;
    940  6212  aw148015 
    941  5184  ek110237 };
    942  5184  ek110237 
    943  5184  ek110237 stats_command: FSC_STATS FSE_SNAP
    944  5184  ek110237 {
    945  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
    946  5184  ek110237 		YYERROR;
    947  5184  ek110237 	$$->cmd = (void (*)(struct cmd *))&parser_statssnap;
    948  5184  ek110237 	break;
    949  5184  ek110237 
    950  5184  ek110237 }
    951  5184  ek110237 | FSC_STATS FSE_CLEAR
    952  5184  ek110237 {
    953  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
    954  5184  ek110237 		YYERROR;
    955  5184  ek110237 	$$->cmd = (void (*)(struct cmd *))&stats_clear;
    956  5184  ek110237 
    957  5184  ek110237 }
    958  5184  ek110237 | FSC_STATS FSE_DIRECTORY var_string_list
    959  5184  ek110237 {
    960  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
    961  5184  ek110237 		YYERROR;
    962  5184  ek110237 	$$->cmd_param_list = $3;
    963  5184  ek110237 	$$->cmd = (void (*)(struct cmd *))&parser_directory;
    964  5184  ek110237 
    965  5184  ek110237 }
    966  5184  ek110237 | FSC_STATS FSE_COMMAND whitevar_string_list
    967  5184  ek110237 {
    968  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
    969  5184  ek110237 		YYERROR;
    970  5184  ek110237 
    971  5184  ek110237 	$$->cmd_param_list = $3;
    972  5184  ek110237 	$$->cmd = parser_statscmd;
    973  5184  ek110237 
    974  5184  ek110237 }| FSC_STATS FSE_DUMP whitevar_string_list
    975  5184  ek110237 {
    976  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
    977  5184  ek110237 		YYERROR;
    978  5184  ek110237 
    979  5184  ek110237 	$$->cmd_param_list = $3;
    980  5184  ek110237 	$$->cmd = parser_statsdump;
    981  5184  ek110237 }| FSC_STATS FSE_XMLDUMP whitevar_string_list
    982  5184  ek110237 {
    983  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
    984  5184  ek110237 		YYERROR;
    985  5184  ek110237 
    986  5184  ek110237 	$$->cmd_param_list = $3;
    987  5184  ek110237 	$$->cmd = parser_statsxmldump;
    988  7736    Andrew }| FSC_STATS FSE_MULTIDUMP whitevar_string_list
    989  7736    Andrew {
    990  7736    Andrew 	if (($$ = alloc_cmd()) == NULL)
    991  7736    Andrew 		YYERROR;
    992  7736    Andrew 
    993  7736    Andrew 	$$->cmd_param_list = $3;
    994  7736    Andrew 	$$->cmd = parser_statsmultidump;
    995  5184  ek110237 };
    996  5184  ek110237 
    997  5184  ek110237 quit_command: FSC_QUIT
    998  5184  ek110237 {
    999  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
   1000  5184  ek110237 		YYERROR;
   1001  5184  ek110237 	$$->cmd = parser_filebench_shutdown;
   1002  5184  ek110237 };
   1003  5184  ek110237 
   1004  5184  ek110237 flowop_list: flowop_command
   1005  5184  ek110237 {
   1006  5184  ek110237 	$$ = $1;
   1007  5184  ek110237 }| flowop_list flowop_command
   1008  5184  ek110237 {
   1009  5184  ek110237 	cmd_t *list = NULL;
   1010  5184  ek110237 	cmd_t *list_end = NULL;
   1011  5184  ek110237 
   1012  5184  ek110237 	/* Find end of list */
   1013  5184  ek110237 	for (list = $1; list != NULL;
   1014  5184  ek110237 	    list = list->cmd_next)
   1015  5184  ek110237 		list_end = list;
   1016  5184  ek110237 
   1017  5184  ek110237 	list_end->cmd_next = $2;
   1018  5184  ek110237 
   1019  5184  ek110237 	filebench_log(LOG_DEBUG_IMPL,
   1020  5184  ek110237 	    "flowop_list adding cmd %zx to list %zx", $2, $1);
   1021  5184  ek110237 
   1022  5184  ek110237 	$$ = $1;
   1023  5184  ek110237 };
   1024  5184  ek110237 
   1025  6212  aw148015 thread: FSE_THREAD pt_attr_ops FSK_OPENLST flowop_list FSK_CLOSELST
   1026  5184  ek110237 {
   1027  5184  ek110237 	/*
   1028  5184  ek110237 	 * Allocate a cmd node per thread, with a
   1029  5184  ek110237 	 * list of flowops attached to the cmd_list
   1030  5184  ek110237 	 */
   1031  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
   1032  5184  ek110237 		YYERROR;
   1033  5184  ek110237 	$$->cmd_list = $4;
   1034  5184  ek110237 	$$->cmd_attr_list = $2;
   1035  5184  ek110237 };
   1036  5184  ek110237 
   1037  5184  ek110237 thread_list: thread
   1038  5184  ek110237 {
   1039  5184  ek110237 	$$ = $1;
   1040  5184  ek110237 }| thread_list thread
   1041  5184  ek110237 {
   1042  5184  ek110237 	cmd_t *list = NULL;
   1043  5184  ek110237 	cmd_t *list_end = NULL;
   1044  5184  ek110237 
   1045  5184  ek110237 	/* Find end of list */
   1046  5184  ek110237 	for (list = $1; list != NULL;
   1047  5184  ek110237 	    list = list->cmd_next)
   1048  5184  ek110237 		list_end = list;
   1049  5184  ek110237 
   1050  5184  ek110237 	list_end->cmd_next = $2;
   1051  5184  ek110237 
   1052  5184  ek110237 	filebench_log(LOG_DEBUG_IMPL,
   1053  5184  ek110237 	    "thread_list adding cmd %zx to list %zx", $2, $1);
   1054  5184  ek110237 
   1055  5184  ek110237 	$$ = $1;
   1056  5184  ek110237 };
   1057  5184  ek110237 
   1058  6212  aw148015 proc_define_command: FSC_DEFINE FSE_PROC pt_attr_ops FSK_OPENLST thread_list FSK_CLOSELST
   1059  5184  ek110237 {
   1060  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
   1061  5184  ek110237 		YYERROR;
   1062  5184  ek110237 	$$->cmd = &parser_proc_define;
   1063  5184  ek110237 	$$->cmd_list = $5;
   1064  5184  ek110237 	$$->cmd_attr_list = $3;
   1065  5184  ek110237 
   1066  6212  aw148015 }
   1067  6212  aw148015 | proc_define_command pt_attr_ops
   1068  6212  aw148015 {
   1069  6212  aw148015 	$1->cmd_attr_list = $2;
   1070  6212  aw148015 };
   1071  6212  aw148015 
   1072  6212  aw148015 files_define_command: FSC_DEFINE FSE_FILE
   1073  5184  ek110237 {
   1074  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
   1075  5184  ek110237 		YYERROR;
   1076  5184  ek110237 	$$->cmd = &parser_file_define;
   1077  5184  ek110237 }| FSC_DEFINE FSE_FILESET
   1078  5184  ek110237 {
   1079  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
   1080  5184  ek110237 		YYERROR;
   1081  5184  ek110237 	$$->cmd = &parser_fileset_define;
   1082  5184  ek110237 }
   1083  6212  aw148015 | files_define_command files_attr_ops
   1084  5184  ek110237 {
   1085  5184  ek110237 	$1->cmd_attr_list = $2;
   1086  6212  aw148015 };
   1087  6212  aw148015 
   1088  6212  aw148015 randvar_define_command: FSC_DEFINE FSE_RAND randvar_attr_ops
   1089  6212  aw148015 {
   1090  6212  aw148015 	if (($$ = alloc_cmd()) == NULL)
   1091  6212  aw148015 		YYERROR;
   1092  6212  aw148015 	$$->cmd = &parser_randvar_define;
   1093  6212  aw148015 	$$->cmd_attr_list = $3;
   1094  5184  ek110237 };
   1095  5184  ek110237 
   1096  6550  aw148015 fo_define_command: FSC_DEFINE FSC_FLOWOP comp_attr_ops FSK_OPENLST flowop_list FSK_CLOSELST
   1097  6550  aw148015 {
   1098  6550  aw148015 	if (($$ = alloc_cmd()) == NULL)
   1099  6550  aw148015 		YYERROR;
   1100  6550  aw148015 	$$->cmd = &parser_composite_flowop_define;
   1101  6550  aw148015 	$$->cmd_list = $5;
   1102  6550  aw148015 	$$->cmd_attr_list = $3;
   1103  6550  aw148015 }
   1104  6550  aw148015 | fo_define_command comp_attr_ops
   1105  6550  aw148015 {
   1106  6550  aw148015 	$1->cmd_attr_list = $2;
   1107  6550  aw148015 };
   1108  6550  aw148015 
   1109  5184  ek110237 create_command: FSC_CREATE entity
   1110  5184  ek110237 {
   1111  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
   1112  5184  ek110237 		YYERROR;
   1113  5184  ek110237 	switch ($2) {
   1114  5184  ek110237 	case FSE_PROC:
   1115  5184  ek110237 		$$->cmd = &parser_proc_create;
   1116  5184  ek110237 		break;
   1117  5673  aw148015 	case FSE_FILESET:
   1118  5184  ek110237 	case FSE_FILE:
   1119  5184  ek110237 		$$->cmd = &parser_fileset_create;
   1120  5184  ek110237 		break;
   1121  5184  ek110237 	default:
   1122  5184  ek110237 		filebench_log(LOG_ERROR, "unknown entity", $2);
   1123  5184  ek110237 		YYERROR;
   1124  5184  ek110237 	}
   1125  5184  ek110237 
   1126  5184  ek110237 };
   1127  5184  ek110237 
   1128  5184  ek110237 shutdown_command: FSC_SHUTDOWN entity
   1129  5184  ek110237 {
   1130  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
   1131  5184  ek110237 		YYERROR;
   1132  5184  ek110237 	switch ($2) {
   1133  5184  ek110237 	case FSE_PROC:
   1134  5184  ek110237 		$$->cmd = &parser_proc_shutdown;
   1135  9356    Andrew 		break;
   1136  9356    Andrew 	case FSE_FILE:
   1137  9356    Andrew 	case FSE_FILESET:
   1138  9356    Andrew 		$$->cmd = &parser_fileset_shutdown;
   1139  5184  ek110237 		break;
   1140  5184  ek110237 	default:
   1141  5184  ek110237 		filebench_log(LOG_ERROR, "unknown entity", $2);
   1142  5184  ek110237 		YYERROR;
   1143  5184  ek110237 	}
   1144  5184  ek110237 
   1145  5184  ek110237 };
   1146  5184  ek110237 
   1147  9326    Andrew warmup_command: FSC_WARMUP FSV_VAL_INT
   1148  9326    Andrew {
   1149  9326    Andrew 	if (($$ = alloc_cmd()) == NULL)
   1150  9326    Andrew 		YYERROR;
   1151  9326    Andrew 	$$->cmd = parser_warmup;
   1152  9326    Andrew 	$$->cmd_qty = $2;
   1153  9326    Andrew }
   1154  9326    Andrew | FSC_WARMUP FSV_VARIABLE
   1155  9326    Andrew {
   1156  9326    Andrew 	fbint_t *integer;
   1157  9326    Andrew 
   1158  9326    Andrew 	if (($$ = alloc_cmd()) == NULL)
   1159  9326    Andrew 		YYERROR;
   1160  9326    Andrew 	$$->cmd = parser_warmup_variable;
   1161  9326    Andrew 	$$->cmd_tgt1 = fb_stralloc($2);
   1162  9326    Andrew };
   1163  9326    Andrew 
   1164  5184  ek110237 sleep_command: FSC_SLEEP FSV_VAL_INT
   1165  5184  ek110237 {
   1166  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
   1167  5184  ek110237 		YYERROR;
   1168  5184  ek110237 	$$->cmd = parser_sleep;
   1169  5184  ek110237 	$$->cmd_qty = $2;
   1170  5184  ek110237 }
   1171  5184  ek110237 | FSC_SLEEP FSV_VARIABLE
   1172  5184  ek110237 {
   1173  6212  aw148015 	fbint_t *integer;
   1174  5184  ek110237 
   1175  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
   1176  5184  ek110237 		YYERROR;
   1177  5184  ek110237 	$$->cmd = parser_sleep_variable;
   1178  5184  ek110237 	$$->cmd_tgt1 = fb_stralloc($2);
   1179  5184  ek110237 };
   1180  5184  ek110237 
   1181  5184  ek110237 run_command: FSC_RUN FSV_VAL_INT
   1182  5184  ek110237 {
   1183  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
   1184  5184  ek110237 		YYERROR;
   1185  5184  ek110237 	$$->cmd = parser_run;
   1186  5184  ek110237 	$$->cmd_qty = $2;
   1187  5184  ek110237 }
   1188  5184  ek110237 | FSC_RUN FSV_VARIABLE
   1189  5184  ek110237 {
   1190  6212  aw148015 	fbint_t *integer;
   1191  5184  ek110237 
   1192  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
   1193  5184  ek110237 		YYERROR;
   1194  5184  ek110237 	$$->cmd = parser_run_variable;
   1195  5184  ek110237 	$$->cmd_tgt1 = fb_stralloc($2);
   1196  5184  ek110237 }
   1197  5184  ek110237 | FSC_RUN
   1198  5184  ek110237 {
   1199  6212  aw148015 	fbint_t *integer;
   1200  5184  ek110237 
   1201  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
   1202  5184  ek110237 		YYERROR;
   1203  5184  ek110237 	$$->cmd = parser_run;
   1204  5184  ek110237 	$$->cmd_qty = 60UL;
   1205  5184  ek110237 };
   1206  5184  ek110237 
   1207  5184  ek110237 help_command: FSC_HELP
   1208  5184  ek110237 {
   1209  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
   1210  5184  ek110237 		YYERROR;
   1211  5184  ek110237 	$$->cmd = parser_help;
   1212  5184  ek110237 };
   1213  5184  ek110237 
   1214  5184  ek110237 flowop_command: FSC_FLOWOP name
   1215  5184  ek110237 {
   1216  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
   1217  5184  ek110237 		YYERROR;
   1218  5184  ek110237 	$$->cmd_name = fb_stralloc($2);
   1219  5184  ek110237 }
   1220  6212  aw148015 | flowop_command fo_attr_ops
   1221  5184  ek110237 {
   1222  5184  ek110237 	$1->cmd_attr_list = $2;
   1223  5184  ek110237 };
   1224  5184  ek110237 
   1225  5184  ek110237 load_command: FSC_LOAD FSV_STRING
   1226  5184  ek110237 {
   1227  5184  ek110237 	FILE *newfile;
   1228  5184  ek110237 	char loadfile[128];
   1229  5184  ek110237 
   1230  5184  ek110237 	if (($$ = alloc_cmd()) == NULL)
   1231  5184  ek110237 		YYERROR;
   1232  5184  ek110237 
   1233  5184  ek110237 	(void) strcpy(loadfile, $2);
   1234  5184  ek110237 	(void) strcat(loadfile, ".f");
   1235  5184  ek110237 
   1236  5184  ek110237 	if ((newfile = fopen(loadfile, "r")) == NULL) {
   1237  9513    Andrew 		(void) strcpy(loadfile, fbbasepath);
   1238  5184  ek110237 		(void) strcat(loadfile, "/workloads/");
   1239  5184  ek110237 		(void) strcat(loadfile, $2);
   1240  5184  ek110237 		(void) strcat(loadfile, ".f");
   1241  5184  ek110237 		if ((newfile = fopen(loadfile, "r")) == NULL) {
   1242  5184  ek110237 			filebench_log(LOG_ERROR, "Cannot open %s", loadfile);
   1243  5184  ek110237 			YYERROR;
   1244  5184  ek110237 		}
   1245  5184  ek110237 	}
   1246  5184  ek110237 
   1247  5184  ek110237 	parentscript = yyin;
   1248  5184  ek110237 	yyin = newfile;
   1249  5184  ek110237 	yy_switchfileparent(yyin);
   1250  5184  ek110237 };
   1251  5184  ek110237 
   1252  6212  aw148015 
   1253  5184  ek110237 entity: FSE_PROC {$$ = FSE_PROC;}
   1254  5184  ek110237 | FSE_THREAD {$$ = FSE_THREAD;}
   1255  5184  ek110237 | FSE_FILESET {$$ = FSE_FILESET;}
   1256  5184  ek110237 | FSE_FILE {$$ = FSE_FILE;};
   1257  5184  ek110237 
   1258  5184  ek110237 value: FSV_VAL_INT { $$.i = $1;}
   1259  5184  ek110237 | FSV_STRING { $$.s = $1;}
   1260  5184  ek110237 | FSV_VAL_BOOLEAN { $$.b = $1;};
   1261  5184  ek110237 
   1262  5184  ek110237 name: FSV_STRING;
   1263  5184  ek110237 
   1264  6212  aw148015 /* attribute parsing for define file and define fileset */
   1265  6212  aw148015 files_attr_ops: files_attr_op
   1266  5184  ek110237 {
   1267  5184  ek110237 	$$ = $1;
   1268  5184  ek110237 }
   1269  6212  aw148015 | files_attr_ops FSK_SEPLST files_attr_op
   1270  5184  ek110237 {
   1271  5184  ek110237 	attr_t *attr = NULL;
   1272  5184  ek110237 	attr_t *list_end = NULL;
   1273  5184  ek110237 
   1274  5184  ek110237 	for (attr = $1; attr != NULL;
   1275  5184  ek110237 	    attr = attr->attr_next)
   1276  5184  ek110237 		list_end = attr; /* Find end of list */
   1277  5184  ek110237 
   1278  5184  ek110237 	list_end->attr_next = $3;
   1279  5184  ek110237 
   1280  5184  ek110237 	$$ = $1;
   1281  5184  ek110237 };
   1282  5184  ek110237 
   1283  6212  aw148015 files_attr_op: files_attr_name FSK_ASSIGN attr_list_value
   1284  5184  ek110237 {
   1285  5184  ek110237 	$$ = $3;
   1286  5184  ek110237 	$$->attr_name = $1;
   1287  5184  ek110237 }
   1288  6212  aw148015 | files_attr_name
   1289  6212  aw148015 {
   1290  6212  aw148015 	if (($$ = alloc_attr()) == NULL)
   1291  6212  aw148015 		YYERROR;
   1292  6212  aw148015 	$$->attr_name = $1;
   1293  6212  aw148015 };
   1294  6212  aw148015 
   1295  6212  aw148015 /* attribute parsing for random variables */
   1296  6212  aw148015 randvar_attr_ops: randvar_attr_op
   1297  6212  aw148015 {
   1298  6212  aw148015 	$$ = $1;
   1299  6212  aw148015 }
   1300  6212  aw148015 | randvar_attr_ops FSK_SEPLST randvar_attr_op
   1301  6212  aw148015 {
   1302  6212  aw148015 	attr_t *attr = NULL;
   1303  6212  aw148015 	attr_t *list_end = NULL;
   1304  6212  aw148015 
   1305  6212  aw148015 	for (attr = $1; attr != NULL;
   1306  6212  aw148015 	    attr = attr->attr_next)
   1307  6212  aw148015 		list_end = attr; /* Find end of list */
   1308  6212  aw148015 
   1309  6212  aw148015 	list_end->attr_next = $3;
   1310  6212  aw148015 
   1311  6212  aw148015 	$$ = $1;
   1312  6212  aw148015 }
   1313  6212  aw148015 | randvar_attr_ops FSK_SEPLST FSA_RANDTABLE FSK_ASSIGN FSK_OPENLST probtabentry_list FSK_CLOSELST
   1314  6212  aw148015 {
   1315  6212  aw148015 	attr_t *attr = NULL;
   1316  6212  aw148015 	attr_t *list_end = NULL;
   1317  6212  aw148015 
   1318  6212  aw148015 	for (attr = $1; attr != NULL;
   1319  6212  aw148015 	    attr = attr->attr_next)
   1320  6212  aw148015 		list_end = attr; /* Find end of list */
   1321  6212  aw148015 
   1322  6212  aw148015 
   1323  6212  aw148015 	if ((attr = alloc_attr()) == NULL)
   1324  6212  aw148015 		YYERROR;
   1325  6212  aw148015 
   1326  6212  aw148015 	attr->attr_name = FSA_RANDTABLE;
   1327  6212  aw148015 	attr->attr_obj = (void *)$6;
   1328  6212  aw148015 	list_end->attr_next = attr;
   1329  6212  aw148015 	$$ = $1;
   1330  6212  aw148015 };
   1331  6212  aw148015 
   1332  6212  aw148015 randvar_attr_op: randvar_attr_name FSK_ASSIGN attr_list_value
   1333  6212  aw148015 {
   1334  6212  aw148015 	$$ = $3;
   1335  6212  aw148015 	$$->attr_name = $1;
   1336  6212  aw148015 }
   1337  6212  aw148015 | randvar_attr_name
   1338  5184  ek110237 {
   1339  5184  ek110237 	if (($$ = alloc_attr()) == NULL)
   1340  5184  ek110237 		YYERROR;
   1341  5184  ek110237 	$$->attr_name = $1;
   1342  5184  ek110237 }
   1343  6212  aw148015 | FSA_TYPE FSK_ASSIGN randvar_attr_typop
   1344  6212  aw148015 {
   1345  6212  aw148015 	$$ = $3;
   1346  6212  aw148015 	$$->attr_name = FSA_TYPE;
   1347  6212  aw148015 }
   1348  6212  aw148015 | FSA_RANDSRC FSK_ASSIGN randvar_attr_srcop
   1349  6212  aw148015 {
   1350  6212  aw148015 	$$ = $3;
   1351  6212  aw148015 	$$->attr_name = FSA_RANDSRC;
   1352  6212  aw148015 };
   1353  5184  ek110237 
   1354  6212  aw148015 probtabentry: FSK_OPENLST var_int_val FSK_SEPLST var_int_val FSK_SEPLST var_int_val FSK_CLOSELST
   1355  6212  aw148015 {
   1356  6212  aw148015 	if (($$ = alloc_probtabent()) == NULL)
   1357  6212  aw148015 		YYERROR;
   1358  6212  aw148015 	$$->pte_percent = $2;
   1359  6212  aw148015 	$$->pte_segmin  = $4;
   1360  6212  aw148015 	$$->pte_segmax  = $6;
   1361  6212  aw148015 };
   1362  6212  aw148015 
   1363  6212  aw148015 /* attribute parsing for prob density function table */
   1364  6212  aw148015 probtabentry_list: probtabentry
   1365  6212  aw148015 {
   1366  6212  aw148015 	$$ = $1;
   1367  6212  aw148015 }
   1368  6212  aw148015 | probtabentry_list FSK_SEPLST probtabentry
   1369  6212  aw148015 {
   1370  6212  aw148015 	probtabent_t *pte = NULL;
   1371  6212  aw148015 	probtabent_t *ptelist_end = NULL;
   1372  6212  aw148015 
   1373  6212  aw148015 	for (pte = $1; pte != NULL;
   1374  6212  aw148015 	    pte = pte->pte_next)
   1375  6212  aw148015 		ptelist_end = pte; /* Find end of prob table entry list */
   1376  6212  aw148015 
   1377  6212  aw148015 	ptelist_end->pte_next = $3;
   1378  6212  aw148015 
   1379  6212  aw148015 	$$ = $1;
   1380  6212  aw148015 };
   1381  6212  aw148015 
   1382  6212  aw148015 /* attribute parsing for define thread and process */
   1383  6212  aw148015 pt_attr_ops: pt_attr_op
   1384  6212  aw148015 {
   1385  6212  aw148015 	$$ = $1;
   1386  6212  aw148015 }
   1387  6212  aw148015 | pt_attr_ops FSK_SEPLST pt_attr_op
   1388  6212  aw148015 {
   1389  6212  aw148015 	attr_t *attr = NULL;
   1390  6212  aw148015 	attr_t *list_end = NULL;
   1391  6212  aw148015 
   1392  6212  aw148015 	for (attr = $1; attr != NULL;
   1393  6212  aw148015 	    attr = attr->attr_next)
   1394  6212  aw148015 		list_end = attr; /* Find end of list */
   1395  6212  aw148015 
   1396  6212  aw148015 	list_end->attr_next = $3;
   1397  6212  aw148015 
   1398  6212  aw148015 	$$ = $1;
   1399  6212  aw148015 };
   1400  6212  aw148015 
   1401  6212  aw148015 pt_attr_op: pt_attr_name FSK_ASSIGN attr_value
   1402  6212  aw148015 {
   1403  6212  aw148015 	$$ = $3;
   1404  6212  aw148015 	$$->attr_name = $1;
   1405  6212  aw148015 }
   1406  6212  aw148015 | pt_attr_name
   1407  6212  aw148015 {
   1408  6212  aw148015 	if (($$ = alloc_attr()) == NULL)
   1409  6212  aw148015 		YYERROR;
   1410  6212  aw148015 	$$->attr_name = $1;
   1411  6212  aw148015 };
   1412  6212  aw148015 
   1413  6212  aw148015 /* attribute parsing for flowops */
   1414  6212  aw148015 fo_attr_ops: fo_attr_op
   1415  6212  aw148015 {
   1416  6212  aw148015 	$$ = $1;
   1417  6212  aw148015 }
   1418  6212  aw148015 | fo_attr_ops FSK_SEPLST fo_attr_op
   1419  6212  aw148015 {
   1420  6212  aw148015 	attr_t *attr = NULL;
   1421  6212  aw148015 	attr_t *list_end = NULL;
   1422  6212  aw148015 
   1423  6212  aw148015 	for (attr = $1; attr != NULL;
   1424  6212  aw148015 	    attr = attr->attr_next)
   1425  6212  aw148015 		list_end = attr; /* Find end of list */
   1426  6212  aw148015 
   1427  6212  aw148015 	list_end->attr_next = $3;
   1428  6212  aw148015 
   1429  6212  aw148015 	$$ = $1;
   1430  6550  aw148015 }
   1431  6550  aw148015 | fo_attr_ops FSK_SEPLST comp_lvar_def
   1432  6550  aw148015 {
   1433  6550  aw148015 	attr_t *attr = NULL;
   1434  6550  aw148015 	attr_t *list_end = NULL;
   1435  6550  aw148015 
   1436  6550  aw148015 	for (attr = $1; attr != NULL;
   1437  6550  aw148015 	    attr = attr->attr_next)
   1438  6550  aw148015 		list_end = attr; /* Find end of list */
   1439  6550  aw148015 
   1440  6550  aw148015 	list_end->attr_next = $3;
   1441  6550  aw148015 
   1442  6550  aw148015 	$$ = $1;
   1443  6212  aw148015 };
   1444  6212  aw148015 
   1445  6212  aw148015 fo_attr_op: fo_attr_name FSK_ASSIGN attr_value
   1446  6212  aw148015 {
   1447  6212  aw148015 	$$ = $3;
   1448  6212  aw148015 	$$->attr_name = $1;
   1449  6212  aw148015 }
   1450  6212  aw148015 | fo_attr_name
   1451  6212  aw148015 {
   1452  6212  aw148015 	if (($$ = alloc_attr()) == NULL)
   1453  6212  aw148015 		YYERROR;
   1454  6212  aw148015 	$$->attr_name = $1;
   1455  6212  aw148015 };
   1456  6212  aw148015 
   1457  6212  aw148015 /* attribute parsing for Event Generator */
   1458  6212  aw148015 ev_attr_ops: ev_attr_op
   1459  6212  aw148015 {
   1460  6212  aw148015 	$$ = $1;
   1461  6212  aw148015 }
   1462  6212  aw148015 | ev_attr_ops FSK_SEPLST ev_attr_op
   1463  6212  aw148015 {
   1464  6212  aw148015 	attr_t *attr = NULL;
   1465  6212  aw148015 	attr_t *list_end = NULL;
   1466  6212  aw148015 
   1467  6212  aw148015 	for (attr = $1; attr != NULL;
   1468  6212  aw148015 	    attr = attr->attr_next)
   1469  6212  aw148015 		list_end = attr; /* Find end of list */
   1470  6212  aw148015 
   1471  6212  aw148015 	list_end->attr_next = $3;
   1472  6212  aw148015 
   1473  6212  aw148015 	$$ = $1;
   1474  6212  aw148015 };
   1475  6212  aw148015 
   1476  6212  aw148015 ev_attr_op: ev_attr_name FSK_ASSIGN attr_value
   1477  6212  aw148015 {
   1478  6212  aw148015 	$$ = $3;
   1479  6212  aw148015 	$$->attr_name = $1;
   1480  6212  aw148015 }
   1481  6212  aw148015 | ev_attr_name
   1482  6212  aw148015 {
   1483  6212  aw148015 	if (($$ = alloc_attr()) == NULL)
   1484  6212  aw148015 		YYERROR;
   1485  6212  aw148015 	$$->attr_name = $1;
   1486  6212  aw148015 };
   1487  7736    Andrew 
   1488  7736    Andrew /* attribute parsing for enable multiple client command */
   1489  7736    Andrew enable_multi_ops: enable_multi_op
   1490  7736    Andrew {
   1491  7736    Andrew 	$$ = $1;
   1492  7736    Andrew }
   1493  7736    Andrew | enable_multi_ops FSK_SEPLST enable_multi_op
   1494  7736    Andrew {
   1495  7736    Andrew 	attr_t *attr = NULL;
   1496  7736    Andrew 	attr_t *list_end = NULL;
   1497  7736    Andrew 
   1498  7736    Andrew 	for (attr = $1; attr != NULL;
   1499  7736    Andrew 	    attr = attr->attr_next)
   1500  7736    Andrew 		list_end = attr; /* Find end of list */
   1501  7736    Andrew 
   1502  7736    Andrew 	list_end->attr_next = $3;
   1503  7736    Andrew 
   1504  7736    Andrew 	$$ = $1;
   1505  7736    Andrew };
   1506  7736    Andrew 
   1507  7736    Andrew enable_multi_op: em_attr_name FSK_ASSIGN attr_value
   1508  7736    Andrew {
   1509  7736    Andrew 	$$ = $3;
   1510  7736    Andrew 	$$->attr_name = $1;
   1511  9326    Andrew };
   1512  7736    Andrew 
   1513  7736    Andrew multisync_op: FSA_VALUE FSK_ASSIGN attr_value
   1514  7736    Andrew {
   1515  7736    Andrew 	$$ = $3;
   1516  7736    Andrew 	$$->attr_name = FSA_VALUE;
   1517  9513    Andrew };
   1518  9513    Andrew 
   1519  9513    Andrew fscheck_attr_op: fscheck_attr_name FSK_ASSIGN FSV_STRING
   1520  9513    Andrew {
   1521  9513    Andrew 	if (($$ = alloc_attr()) == NULL)
   1522  9513    Andrew 		YYERROR;
   1523  9513    Andrew 	$$->attr_avd = avd_str_alloc($3);
   1524  9513    Andrew 	$$->attr_name = $1;
   1525  9326    Andrew };
   1526  9801    Andrew 
   1527  9801    Andrew binary_op:
   1528  9801    Andrew    FSK_PLUS {$$ = FSK_PLUS;}
   1529  9801    Andrew  | FSK_MINUS {$$ = FSK_MINUS;}
   1530  9801    Andrew  | FSK_MULTIPLY {$$ = FSK_MULTIPLY;}
   1531  9801    Andrew  | FSK_DIVIDE {$$ = FSK_DIVIDE;};
   1532  6212  aw148015 
   1533  6212  aw148015 files_attr_name: attrs_define_file
   1534  6212  aw148015 |attrs_define_fileset;
   1535  6212  aw148015 
   1536  6212  aw148015 pt_attr_name: attrs_define_thread
   1537  6212  aw148015 |attrs_define_proc;
   1538  6212  aw148015 
   1539  6212  aw148015 fo_attr_name: attrs_flowop;
   1540  6212  aw148015 
   1541  6212  aw148015 ev_attr_name: attrs_eventgen;
   1542  5184  ek110237 
   1543  5184  ek110237 attrs_define_proc:
   1544  6212  aw148015   FSA_NICE { $$ = FSA_NICE;}
   1545  6212  aw148015 | FSA_NAME { $$ = FSA_NAME;}
   1546  6212  aw148015 | FSA_INSTANCES { $$ = FSA_INSTANCES;};
   1547  5184  ek110237 
   1548  5184  ek110237 attrs_define_file:
   1549  6212  aw148015   FSA_SIZE { $$ = FSA_SIZE;}
   1550  6212  aw148015 | FSA_NAME { $$ = FSA_NAME;}
   1551  5184  ek110237 | FSA_PATH { $$ = FSA_PATH;}
   1552  9326    Andrew | FSA_READONLY { $$ = FSA_READONLY;}
   1553  9326    Andrew | FSA_TRUSTTREE { $$ = FSA_TRUSTTREE;}
   1554  5184  ek110237 | FSA_REUSE { $$ = FSA_REUSE;}
   1555  5184  ek110237 | FSA_PREALLOC { $$ = FSA_PREALLOC;}
   1556  5184  ek110237 | FSA_PARALLOC { $$ = FSA_PARALLOC;};
   1557  5184  ek110237 
   1558  5184  ek110237 attrs_define_fileset:
   1559  6212  aw148015   FSA_SIZE { $$ = FSA_SIZE;}
   1560  6212  aw148015 | FSA_NAME { $$ = FSA_NAME;}
   1561  5184  ek110237 | FSA_PATH { $$ = FSA_PATH;}
   1562  5184  ek110237 | FSA_DIRWIDTH { $$ = FSA_DIRWIDTH;}
   1563  6212  aw148015 | FSA_DIRDEPTHRV { $$ = FSA_DIRDEPTHRV;}
   1564  5184  ek110237 | FSA_PREALLOC { $$ = FSA_PREALLOC;}
   1565  8404    Andrew | FSA_PARALLOC { $$ = FSA_PARALLOC;}
   1566  8404    Andrew | FSA_REUSE { $$ = FSA_REUSE;}
   1567  9326    Andrew | FSA_READONLY { $$ = FSA_READONLY;}
   1568  9326    Andrew | FSA_TRUSTTREE { $$ = FSA_TRUSTTREE;}
   1569  5184  ek110237 | FSA_FILESIZEGAMMA { $$ = FSA_FILESIZEGAMMA;}
   1570  5184  ek110237 | FSA_DIRGAMMA { $$ = FSA_DIRGAMMA;}
   1571  5184  ek110237 | FSA_CACHED { $$ = FSA_CACHED;}
   1572  9326    Andrew | FSA_ENTRIES { $$ = FSA_ENTRIES;}
   1573  7946    Andrew | FSA_LEAFDIRS { $$ = FSA_LEAFDIRS;};
   1574  5184  ek110237 
   1575  6212  aw148015 randvar_attr_name:
   1576  6212  aw148015   FSA_NAME { $$ = FSA_NAME;}
   1577  6212  aw148015 | FSA_RANDSEED { $$ = FSA_RANDSEED;}
   1578  6212  aw148015 | FSA_RANDGAMMA { $$ = FSA_RANDGAMMA;}
   1579  6212  aw148015 | FSA_RANDMEAN { $$ = FSA_RANDMEAN;}
   1580  6212  aw148015 | FSA_RANDMIN { $$ = FSA_RANDMIN;}
   1581  6212  aw148015 | FSA_RANDROUND { $$ = FSA_RANDROUND;};
   1582  6212  aw148015 
   1583  6212  aw148015 randvar_attr_tsp:
   1584  6212  aw148015   FSS_TYPE { $$ = FSS_TYPE;}
   1585  6212  aw148015 | FSS_SRC { $$ = FSS_SRC;}
   1586  6212  aw148015 | FSS_SEED { $$ = FSS_SEED;}
   1587  6212  aw148015 | FSS_GAMMA { $$ = FSS_GAMMA;}
   1588  6212  aw148015 | FSS_MEAN { $$ = FSS_MEAN;}
   1589  6212  aw148015 | FSS_MIN { $$ = FSS_MIN;}
   1590  6212  aw148015 | FSS_ROUND { $$ = FSS_ROUND;};
   1591  6212  aw148015 
   1592  6212  aw148015 
   1593  6212  aw148015 randvar_attr_param:
   1594  6212  aw148015   FSS_SEED { $$ = FSS_SEED;}
   1595  6212  aw148015 | FSS_GAMMA { $$ = FSS_GAMMA;}
   1596  6212  aw148015 | FSS_MEAN { $$ = FSS_MEAN;}
   1597  6212  aw148015 | FSS_MIN { $$ = FSS_MIN;}
   1598  6212  aw148015 | FSS_ROUND { $$ = FSS_ROUND;};
   1599  6212  aw148015 
   1600  6212  aw148015 randvar_attr_typop: randtype_name
   1601  6212  aw148015 {
   1602  6212  aw148015 	if (($$ = alloc_attr()) == NULL)
   1603  6212  aw148015 		YYERROR;
   1604  6212  aw148015 	$$->attr_avd = avd_int_alloc($1);
   1605  6212  aw148015 };
   1606  6212  aw148015 
   1607  6212  aw148015 randtype_name:
   1608  6212  aw148015   FSV_RANDUNI { $$ = FSV_RANDUNI;}
   1609  6212  aw148015 | FSV_RANDTAB { $$ = FSV_RANDTAB;}
   1610  6212  aw148015 | FSA_RANDGAMMA { $$ = FSA_RANDGAMMA;};
   1611  6212  aw148015 
   1612  6212  aw148015 randvar_attr_srcop: randsrc_name
   1613  6212  aw148015 {
   1614  6212  aw148015 	if (($$ = alloc_attr()) == NULL)
   1615  6212  aw148015 		YYERROR;
   1616  6212  aw148015 	$$->attr_avd = avd_int_alloc($1);
   1617  6212  aw148015 };
   1618  6212  aw148015 
   1619  6212  aw148015 randsrc_name:
   1620  6212  aw148015   FSV_URAND { $$ = FSV_URAND;}
   1621  6212  aw148015 | FSV_RAND48 { $$ = FSV_RAND48;};
   1622  6212  aw148015 
   1623  5184  ek110237 attrs_define_thread:
   1624  6212  aw148015   FSA_PROCESS { $$ = FSA_PROCESS;}
   1625  6212  aw148015 | FSA_NAME { $$ = FSA_NAME;}
   1626  6212  aw148015 | FSA_MEMSIZE { $$ = FSA_MEMSIZE;}
   1627  6212  aw148015 | FSA_USEISM { $$ = FSA_USEISM;}
   1628  6212  aw148015 | FSA_INSTANCES { $$ = FSA_INSTANCES;};
   1629  5184  ek110237 
   1630  5184  ek110237 attrs_flowop:
   1631  6212  aw148015   FSA_WSS { $$ = FSA_WSS;}
   1632  6212  aw148015 | FSA_FILE { $$ = FSA_FILE;}
   1633  6212  aw148015 | FSA_NAME { $$ = FSA_NAME;}
   1634  6212  aw148015 | FSA_RANDOM { $$ = FSA_RANDOM;}
   1635  6212  aw148015 | FSA_FD { $$ = FSA_FD;}
   1636  6212  aw148015 | FSA_SRCFD { $$ = FSA_SRCFD;}
   1637  6212  aw148015 | FSA_ROTATEFD { $$ = FSA_ROTATEFD;}
   1638  6212  aw148015 | FSA_DSYNC { $$ = FSA_DSYNC;}
   1639  6212  aw148015 | FSA_DIRECTIO { $$ = FSA_DIRECTIO;}
   1640  8404    Andrew | FSA_INDEXED { $$ = FSA_INDEXED;}
   1641  6212  aw148015 | FSA_TARGET { $$ = FSA_TARGET;}
   1642  6212  aw148015 | FSA_ITERS { $$ = FSA_ITERS;}
   1643  6212  aw148015 | FSA_VALUE { $$ = FSA_VALUE;}
   1644  6212  aw148015 | FSA_BLOCKING { $$ = FSA_BLOCKING;}
   1645  6212  aw148015 | FSA_HIGHWATER { $$ = FSA_HIGHWATER;}
   1646  6212  aw148015 | FSA_IOSIZE { $$ = FSA_IOSIZE;};
   1647  5184  ek110237 
   1648  5184  ek110237 attrs_eventgen:
   1649  6212  aw148015   FSA_RATE { $$ = FSA_RATE;};
   1650  7736    Andrew 
   1651  7736    Andrew em_attr_name:
   1652  9326    Andrew   FSA_MASTER { $$ = FSA_MASTER;}
   1653  7736    Andrew | FSA_CLIENT { $$ = FSA_CLIENT;};
   1654  9513    Andrew 
   1655  9513    Andrew fscheck_attr_name:
   1656  9513    Andrew   FSA_PATH { $$ = FSA_PATH;}
   1657  9513    Andrew | FSA_FSTYPE { $$ = FSA_FSTYPE;};
   1658  6550  aw148015 
   1659  6550  aw148015 comp_attr_ops: comp_attr_op
   1660  6550  aw148015 {
   1661  6550  aw148015 	$$ = $1;
   1662  6550  aw148015 }
   1663  6550  aw148015 | comp_attr_ops FSK_SEPLST comp_attr_op
   1664  6550  aw148015 {
   1665  6550  aw148015 	attr_t *attr = NULL;
   1666  6550  aw148015 	attr_t *list_end = NULL;
   1667  6550  aw148015 
   1668  6550  aw148015 	for (attr = $1; attr != NULL;
   1669  6550  aw148015 	    attr = attr->attr_next)
   1670  6550  aw148015 		list_end = attr; /* Find end of list */
   1671  6550  aw148015 
   1672  6550  aw148015 	list_end->attr_next = $3;
   1673  6550  aw148015 
   1674  6550  aw148015 	$$ = $1;
   1675  6550  aw148015 }
   1676  6550  aw148015 | comp_attr_ops FSK_SEPLST comp_lvar_def
   1677  6550  aw148015 {
   1678  6550  aw148015 	attr_t *attr = NULL;
   1679  6550  aw148015 	attr_t *list_end = NULL;
   1680  6550  aw148015 
   1681  6550  aw148015 	for (attr = $1; attr != NULL;
   1682  6550  aw148015 	    attr = attr->attr_next)
   1683  6550  aw148015 		list_end = attr; /* Find end of list */
   1684  6550  aw148015 
   1685  6550  aw148015 	list_end->attr_next = $3;
   1686  6550  aw148015 
   1687  6550  aw148015 	$$ = $1;
   1688  6550  aw148015 };
   1689  6550  aw148015 
   1690  6550  aw148015 comp_attr_op: attrs_define_comp FSK_ASSIGN attr_value
   1691  6550  aw148015 {
   1692  6550  aw148015 	$$ = $3;
   1693  6550  aw148015 	$$->attr_name = $1;
   1694  6550  aw148015 };
   1695  6550  aw148015 
   1696  6550  aw148015 comp_lvar_def: FSV_VARIABLE FSK_ASSIGN FSV_VAL_BOOLEAN
   1697  6550  aw148015 {
   1698  6550  aw148015 	if (($$ = alloc_lvar_attr(var_lvar_assign_boolean($1, $3))) == NULL)
   1699  6550  aw148015 		YYERROR;
   1700  6550  aw148015 }
   1701  6550  aw148015 | FSV_VARIABLE FSK_ASSIGN FSV_VAL_INT
   1702  6550  aw148015 {
   1703  6550  aw148015 	if (($$ = alloc_lvar_attr(var_lvar_assign_integer($1, $3))) == NULL)
   1704  6550  aw148015 		YYERROR;
   1705  6550  aw148015 }
   1706  6550  aw148015 | FSV_VARIABLE FSK_ASSIGN FSK_QUOTE FSV_WHITESTRING FSK_QUOTE
   1707  6550  aw148015 {
   1708  6550  aw148015 	if (($$ = alloc_lvar_attr(var_lvar_assign_string($1, $4))) == NULL)
   1709  6550  aw148015 		YYERROR;
   1710  6550  aw148015 }
   1711  6550  aw148015 | FSV_VARIABLE FSK_ASSIGN FSV_STRING
   1712  6550  aw148015 {
   1713  6550  aw148015 	if (($$ = alloc_lvar_attr(var_lvar_assign_string($1, $3))) == NULL)
   1714  6550  aw148015 		YYERROR;
   1715  6550  aw148015 }
   1716  6550  aw148015 | FSV_VARIABLE FSK_ASSIGN FSV_VARIABLE
   1717  6550  aw148015 {
   1718  6550  aw148015 	if (($$ = alloc_lvar_attr(var_lvar_assign_var($1, $3))) == NULL)
   1719  6550  aw148015 		YYERROR;
   1720  6550  aw148015 }
   1721  6550  aw148015 | FSV_VARIABLE
   1722  6550  aw148015 {
   1723  6550  aw148015 	if (($$ = alloc_lvar_attr(var_lvar_alloc_local($1))) == NULL)
   1724  6550  aw148015 		YYERROR;
   1725  6550  aw148015 };
   1726  6550  aw148015 
   1727  6550  aw148015 
   1728  6550  aw148015 attrs_define_comp:
   1729  6550  aw148015   FSA_NAME { $$ = FSA_NAME;}
   1730  6550  aw148015 | FSA_ITERS { $$ = FSA_ITERS;};
   1731  5184  ek110237 
   1732  6212  aw148015 attr_value: FSV_STRING
   1733  6212  aw148015 {
   1734  6212  aw148015 	if (($$ = alloc_attr()) == NULL)
   1735  6212  aw148015 		YYERROR;
   1736  6212  aw148015 	$$->attr_avd = avd_str_alloc($1);
   1737  6212  aw148015 } | FSV_VAL_INT {
   1738  6212  aw148015 	if (($$ = alloc_attr()) == NULL)
   1739  6212  aw148015 		YYERROR;
   1740  6212  aw148015 	$$->attr_avd = avd_int_alloc($1);
   1741  6212  aw148015 } | FSV_VAL_BOOLEAN {
   1742  6212  aw148015 	if (($$ = alloc_attr()) == NULL)
   1743  6212  aw148015 		YYERROR;
   1744  6212  aw148015 	$$->attr_avd = avd_bool_alloc($1);
   1745  6212  aw148015 } | FSV_VARIABLE {
   1746  6212  aw148015 	if (($$ = alloc_attr()) == NULL)
   1747  6212  aw148015 		YYERROR;
   1748  6212  aw148015 	$$->attr_avd = var_ref_attr($1);
   1749  6212  aw148015 };
   1750  6212  aw148015 
   1751  6212  aw148015 attr_list_value: var_string_list {
   1752  5184  ek110237 	if (($$ = alloc_attr()) == NULL)
   1753  5184  ek110237 		YYERROR;
   1754  5184  ek110237 	$$->attr_param_list = $1;
   1755  8404    Andrew } | FSV_STRING {
   1756  5184  ek110237 	if (($$ = alloc_attr()) == NULL)
   1757  5184  ek110237 		YYERROR;
   1758  6212  aw148015 	$$->attr_avd = avd_str_alloc($1);
   1759  5184  ek110237 } | FSV_VAL_INT {
   1760  5184  ek110237 	if (($$ = alloc_attr()) == NULL)
   1761  5184  ek110237 		YYERROR;
   1762  6212  aw148015 	$$->attr_avd = avd_int_alloc($1);
   1763  6212  aw148015 } | FSV_VAL_BOOLEAN {
   1764  6212  aw148015 	if (($$ = alloc_attr()) == NULL)
   1765  6212  aw148015 		YYERROR;
   1766  6212  aw148015 	$$->attr_avd = avd_bool_alloc($1);
   1767  5184  ek110237 } | FSV_VARIABLE {
   1768  5184  ek110237 	if (($$ = alloc_attr()) == NULL)
   1769  5184  ek110237 		YYERROR;
   1770  6212  aw148015 	$$->attr_avd = var_ref_attr($1);
   1771  6212  aw148015 };
   1772  6212  aw148015 
   1773  6212  aw148015 var_int_val: FSV_VAL_INT
   1774  6212  aw148015 {
   1775  6212  aw148015 	$$ = avd_int_alloc($1);
   1776  6212  aw148015 } | FSV_VARIABLE
   1777  6212  aw148015 {
   1778  6212  aw148015 	$$ = var_ref_attr($1);
   1779  5184  ek110237 };
   1780  5184  ek110237 
   1781  5184  ek110237 %%
   1782  5184  ek110237 
   1783  5184  ek110237 /*
   1784  5184  ek110237  *  The following 'c' routines implement the various commands defined in the
   1785  5184  ek110237  * above yacc parser code. The yacc portion checks the syntax of the commands
   1786  5184  ek110237  * found in a workload file, or typed on interactive command lines, parsing
   1787  5184  ek110237  * the commands' parameters into lists. The lists are then passed in a cmd_t
   1788  5184  ek110237  * struct for each command to its related routine in the following section
   1789  5184  ek110237  * for actual execution. This section also includes a few utility routines
   1790  5184  ek110237  * and the main entry point for the program.
   1791  5184  ek110237  */
   1792  5184  ek110237 
   1793  5184  ek110237 /*
   1794  5184  ek110237  * Entry point for filebench. Processes command line arguements. The -f
   1795  5184  ek110237  * option will read in a workload file (the full name and extension must
   1796  5184  ek110237  * must be given). The -a, -s, -m and -i options are used by worker process
   1797  5184  ek110237  * to receive their name, the base address of shared memory, its path, and
   1798  5184  ek110237  * the process' instance number, respectively. This information is supplied
   1799  5184  ek110237  * by the master process when it execs worker processes under the process
   1800  5184  ek110237  * model of execution. If the worker process arguments are passed then main
   1801  5184  ek110237  * will call the procflow_exec routine which creates worker threadflows and
   1802  5184  ek110237  * flowops and executes the procflow's portion of the workload model until
   1803  5184  ek110237  * completion. If worker process arguments are not passed to the process,
   1804  5184  ek110237  * then it becomes the master process for a filebench run. It initializes
   1805  5184  ek110237  * the various filebench components and either executes the supplied workload
   1806  5184  ek110237  * file, or enters interactive mode.
   1807  5184  ek110237  */
   1808  5184  ek110237 
   1809  5184  ek110237 int
   1810  5184  ek110237 main(int argc, char *argv[])
   1811  5184  ek110237 {
   1812  5184  ek110237 	int opt;
   1813  5184  ek110237 	int docmd = FS_FALSE;
   1814  5184  ek110237 	int instance;
   1815  5184  ek110237 	char procname[128];
   1816  5184  ek110237 	caddr_t shmaddr;
   1817  5184  ek110237 	char dir[MAXPATHLEN];
   1818  5184  ek110237 #ifdef HAVE_SETRLIMIT
   1819  5184  ek110237 	struct rlimit rlp;
   1820  5184  ek110237 #endif
   1821  5184  ek110237 #ifdef HAVE_LIBTECLA
   1822  5184  ek110237 	char *line;
   1823  5184  ek110237 #else
   1824  5184  ek110237 	char line[1024];
   1825  5184  ek110237 #endif
   1826  5184  ek110237 	char shmpathtmp[1024];
   1827  5184  ek110237 
   1828  5184  ek110237 #ifdef HAVE_SETRLIMIT
   1829  5184  ek110237 	/* Set resource limits */
   1830  5184  ek110237 	(void) getrlimit(RLIMIT_NOFILE, &rlp);
   1831  5184  ek110237 	rlp.rlim_cur = rlp.rlim_max;
   1832  5184  ek110237 	setrlimit(RLIMIT_NOFILE, &rlp);
   1833  5184  ek110237 #endif
   1834  5184  ek110237 
   1835  5184  ek110237 	yydebug = 0;
   1836  5184  ek110237 	execname = argv[0];
   1837  5184  ek110237 	*procname = 0;
   1838  5184  ek110237 	cwd = getcwd(dir, MAXPATHLEN);
   1839  5184  ek110237 
   1840  5184  ek110237 	while ((opt = getopt(argc, argv, cmd_options)) != (int)EOF) {
   1841  5184  ek110237 
   1842  5184  ek110237 		switch (opt) {
   1843  5184  ek110237 		case 'h':
   1844  5184  ek110237 			usage(2);
   1845  5184  ek110237 			break;
   1846  5184  ek110237 
   1847  5184  ek110237 		case 'p':
   1848  5184  ek110237 			noproc = 1;
   1849  5184  ek110237 			break;
   1850  5184  ek110237 
   1851  5184  ek110237 		case 'f':
   1852  5184  ek110237 			if (optarg == NULL)
   1853  5184  ek110237 				usage(1);
   1854  5184  ek110237 			if ((yyin = fopen(optarg, "r")) == NULL) {
   1855  5184  ek110237 				(void) fprintf(stderr,
   1856  5184  ek110237 				    "Cannot open file %s", optarg);
   1857  5184  ek110237 				exit(1);
   1858  5184  ek110237 			}
   1859  5184  ek110237 			dofile = FS_TRUE;
   1860  5184  ek110237 			fscriptname = optarg;
   1861  5184  ek110237 
   1862  5184  ek110237 			break;
   1863  5184  ek110237 
   1864  5184  ek110237 		case 'a':
   1865  5184  ek110237 			if (optarg == NULL)
   1866  5184  ek110237 				usage(1);
   1867  5184  ek110237 			sscanf(optarg, "%s", &procname[0]);
   1868  5184  ek110237 			break;
   1869  5184  ek110237 
   1870  5184  ek110237 		case 's':
   1871  5184  ek110237 			if (optarg == NULL)
   1872  5184  ek110237 				usage(1);
   1873  5184  ek110237 #if defined(_LP64) || (__WORDSIZE == 64)
   1874  5184  ek110237 			sscanf(optarg, "%llx", &shmaddr);
   1875  5184  ek110237 #else
   1876  5184  ek110237 			sscanf(optarg, "%x", &shmaddr);
   1877  5184  ek110237 #endif
   1878  5184  ek110237 			break;
   1879  5184  ek110237 
   1880  5184  ek110237 		case 'm':
   1881  5184  ek110237 			if (optarg == NULL)
   1882  5184  ek110237 				usage(1);
   1883  5184  ek110237 			sscanf(optarg, "%s", shmpathtmp);
   1884  5184  ek110237 			shmpath = shmpathtmp;
   1885  5184  ek110237 			break;
   1886  5184  ek110237 
   1887  5184  ek110237 		case 'i':
   1888  5184  ek110237 			if (optarg == NULL)
   1889  5184  ek110237 				usage(1);
   1890  5184  ek110237 			sscanf(optarg, "%d", &instance);
   1891  5184  ek110237 			break;
   1892  5184  ek110237 
   1893  5184  ek110237 		case '?':
   1894  5184  ek110237 		default:
   1895  5184  ek110237 			usage(1);
   1896  5184  ek110237 			break;
   1897  5184  ek110237 		}
   1898  5184  ek110237 	}
   1899  5184  ek110237 
   1900  5184  ek110237 #ifdef USE_PROCESS_MODEL
   1901  5184  ek110237 	if (!(*procname))
   1902  5184  ek110237 #endif
   1903  5184  ek110237 	printf("FileBench Version %s\n", FILEBENCH_VERSION);
   1904  5184  ek110237 	filebench_init();
   1905  5184  ek110237 
   1906  6084  aw148015 	/* get process pid for use with message logging */
   1907  6084  aw148015 	my_pid = getpid();
   1908  6084  aw148015 
   1909  5184  ek110237 #ifdef USE_PROCESS_MODEL
   1910  5184  ek110237 	if (*procname) {
   1911  6084  aw148015 		/* A child FileBench instance */
   1912  5184  ek110237 		if (ipc_attach(shmaddr) < 0) {
   1913  5184  ek110237 			filebench_log(LOG_ERROR, "Cannot attach shm for %s",
   1914  5184  ek110237 			    procname);
   1915  5184  ek110237 			exit(1);
   1916  5184  ek110237 		}
   1917  5184  ek110237 
   1918  8615    Andrew 		/* get correct function pointer for each child process */
   1919  8615    Andrew 		filebench_plugin_funcvecinit();
   1920  8615    Andrew 
   1921  6212  aw148015 		if (procflow_exec(procname, instance) < 0) {
   1922  6212  aw148015 			filebench_log(LOG_ERROR, "Cannot startup process %s",
   1923  6212  aw148015 			    procname);
   1924  5184  ek110237 			exit(1);
   1925  6212  aw148015 		}
   1926  6084  aw148015 
   1927  6084  aw148015 		exit(0);
   1928  5184  ek110237 	}
   1929  5184  ek110237 #endif
   1930  5184  ek110237 
   1931  6084  aw148015 	/* master (or only) process */
   1932  5184  ek110237 	ipc_init();
   1933  5184  ek110237 
   1934  5184  ek110237 	if (fscriptname)
   1935  6391  aw148015 		(void) strcpy(filebench_shm->shm_fscriptname, fscriptname);
   1936  5184  ek110237 
   1937  8615    Andrew 	filebench_plugin_funcvecinit();
   1938  5184  ek110237 	flowop_init();
   1939  5184  ek110237 	stats_init();
   1940  5184  ek110237 	eventgen_init();
   1941  5184  ek110237 
   1942  5184  ek110237 	signal(SIGINT, parser_abort);
   1943  5184  ek110237 
   1944  5184  ek110237 	if (dofile)
   1945  5184  ek110237 		yyparse();
   1946  5184  ek110237 	else {
   1947  5184  ek110237 #ifdef HAVE_LIBTECLA
   1948  5184  ek110237 		if ((gl = new_GetLine(MAX_LINE_LEN, MAX_CMD_HIST)) == NULL) {
   1949  5184  ek110237 			filebench_log(LOG_ERROR,
   1950  5184  ek110237 			    "Failed to create GetLine object");
   1951  5184  ek110237 			filebench_shutdown(1);
   1952  5184  ek110237 		}
   1953  5184  ek110237 
   1954  5184  ek110237 		if (gl_customize_completion(gl, NULL, command_complete)) {
   1955  5184  ek110237 			filebench_log(LOG_ERROR,
   1956  5184  ek110237 			    "Failed to register auto-completion function");
   1957  5184  ek110237 			filebench_shutdown(1);
   1958  5184  ek110237 		}
   1959  5184  ek110237 
   1960  5184  ek110237 		while (line = gl_get_line(gl, FILEBENCH_PROMPT, NULL, -1)) {
   1961  5184  ek110237 			arg_parse(line);
   1962  5184  ek110237 			yyparse();
   1963  5184  ek110237 		}
   1964  5184  ek110237 
   1965  5184  ek110237 		del_GetLine(gl);
   1966  5184  ek110237 #else
   1967  5184  ek110237 		while (!feof(stdin)) {
   1968  5184  ek110237 			printf(FILEBENCH_PROMPT);
   1969  5184  ek110237 			fflush(stdout);
   1970  5184  ek110237 			if (fgets(line, sizeof (line), stdin) == NULL) {
   1971  5184  ek110237 				if (errno == EINTR)
   1972  5184  ek110237 					continue;
   1973  5184  ek110237 				else
   1974  5184  ek110237 					break;
   1975  5184  ek110237 			}
   1976  5184  ek110237 			arg_parse(line);
   1977  5184  ek110237 			yyparse();
   1978  5184  ek110237 		}
   1979  5184  ek110237 		printf("\n");
   1980  5184  ek110237 #endif	/* HAVE_LIBTECLA */
   1981  5184  ek110237 	}
   1982  5184  ek110237 
   1983  5184  ek110237 	parser_filebench_shutdown((cmd_t *)0);
   1984  5184  ek110237 
   1985  5184  ek110237 	return (0);
   1986  5184  ek110237 }
   1987  5184  ek110237 
   1988  5184  ek110237 /*
   1989  5184  ek110237  * arg_parse() puts the parser into command parsing mode. Create a tmpfile
   1990  5184  ek110237  * and instruct the parser to read instructions from this location by setting
   1991  5184  ek110237  * yyin to the value returned by tmpfile. Write the command into the file.
   1992  5184  ek110237  * Then seek back to to the start of the file so that the parser can read
   1993  5184  ek110237  * the instructions.
   1994  5184  ek110237  */
   1995  5184  ek110237 static void
   1996  5184  ek110237 arg_parse(const char *command)
   1997  5184  ek110237 {
   1998  6750  ek110237 	if ((yyin = tmpfile()) == NULL) {
   1999  5184  ek110237 		filebench_log(LOG_FATAL,
   2000  6750  ek110237 		    "Exiting: Cannot create tmpfile: %s", strerror(errno));
   2001  6750  ek110237 		exit(1);
   2002  6750  ek110237 	}
   2003  5184  ek110237 
   2004  5184  ek110237 	if (fwrite(command, strlen(command), 1, yyin) != 1)
   2005  5184  ek110237 		filebench_log(LOG_FATAL,
   2006  5184  ek110237 		    "Cannot write tmpfile: %s", strerror(errno));
   2007  5184  ek110237 
   2008  5184  ek110237 	if (fseek(yyin, 0, SEEK_SET) != 0)
   2009  5184  ek110237 		filebench_log(LOG_FATAL,
   2010  5184  ek110237 		    "Cannot seek tmpfile: %s", strerror(errno));
   2011  5184  ek110237 }
   2012  5184  ek110237 
   2013  5184  ek110237 /*
   2014  5184  ek110237  * Converts a list of var_strings or ordinary strings to a single ordinary
   2015  5184  ek110237  * string. It returns a pointer to the string (in malloc'd memory) if found,
   2016  5184  ek110237  * or NULL otherwise.
   2017  5184  ek110237  */
   2018  5184  ek110237 char *
   2019  5184  ek110237 parser_list2string(list_t *list)
   2020  5184  ek110237 {
   2021  5184  ek110237 	list_t *l;
   2022  5184  ek110237 	char *string;
   2023  5184  ek110237 	char *tmp;
   2024  6212  aw148015 	fbint_t *integer;
   2025  5184  ek110237 	if ((string = malloc(MAXPATHLEN)) == NULL) {
   2026  5184  ek110237 		filebench_log(LOG_ERROR, "Failed to allocate memory");
   2027  5184  ek110237 		return (NULL);
   2028  5184  ek110237 	}
   2029  5184  ek110237 
   2030  5184  ek110237 	*string = 0;
   2031  5184  ek110237 
   2032  8404    Andrew 	/*	printf("parser_list2string: called\n"); */
   2033  5184  ek110237 	/* Format args */
   2034  6212  aw148015 	for (l = list; l != NULL; l = l->list_next) {
   2035  6212  aw148015 		char *lstr = avd_get_str(l->list_string);
   2036  6212  aw148015 
   2037  5184  ek110237 		filebench_log(LOG_DEBUG_SCRIPT,
   2038  6212  aw148015 		    "converting string '%s'", lstr);
   2039  5184  ek110237 
   2040  6212  aw148015 		/* see if it is a random variable */
   2041  6212  aw148015 		if (l->list_integer) {
   2042  6212  aw148015 			fbint_t param_name;
   2043  6212  aw148015 
   2044  6212  aw148015 			tmp = NULL;
   2045  6212  aw148015 			param_name = avd_get_int(l->list_integer);
   2046  6212  aw148015 			switch (param_name) {
   2047  6212  aw148015 			case FSS_TYPE:
   2048  6212  aw148015 				tmp = var_randvar_to_string(lstr,
   2049  6212  aw148015 				    RAND_PARAM_TYPE);
   2050  6212  aw148015 				break;
   2051  6212  aw148015 
   2052  6212  aw148015 			case FSS_SRC:
   2053  6212  aw148015 				tmp = var_randvar_to_string(lstr,
   2054  6212  aw148015 				    RAND_PARAM_SRC);
   2055  6212  aw148015 				break;
   2056  6212  aw148015 
   2057  6212  aw148015 			case FSS_SEED:
   2058  6212  aw148015 				tmp = var_randvar_to_string(lstr,
   2059  6212  aw148015 				    RAND_PARAM_SEED);
   2060  6212  aw148015 				break;
   2061  6212  aw148015 
   2062  6212  aw148015 			case FSS_MIN:
   2063  6212  aw148015 				tmp = var_randvar_to_string(lstr,
   2064  6212  aw148015 				    RAND_PARAM_MIN);
   2065  6212  aw148015 				break;
   2066  6212  aw148015 
   2067  6212  aw148015 			case FSS_MEAN:
   2068  6212  aw148015 				tmp = var_randvar_to_string(lstr,
   2069  6212  aw148015 				    RAND_PARAM_MEAN);
   2070  6212  aw148015 				break;
   2071  6212  aw148015 
   2072  6212  aw148015 			case FSS_GAMMA:
   2073  6212  aw148015 				tmp = var_randvar_to_string(lstr,
   2074  6212  aw148015 				    RAND_PARAM_GAMMA);
   2075  6212  aw148015 				break;
   2076  6212  aw148015 
   2077  6212  aw148015 			case FSS_ROUND:
   2078  6212  aw148015 				tmp = var_randvar_to_string(lstr,
   2079  6212  aw148015 				    RAND_PARAM_ROUND);
   2080  6212  aw148015 				break;
   2081  6212  aw148015 			}
   2082  6212  aw148015 
   2083  6212  aw148015 			if (tmp) {
   2084  6212  aw148015 				(void) strcat(string, tmp);
   2085  6212  aw148015 				free(tmp);
   2086  6212  aw148015 			} else {
   2087  6212  aw148015 				(void) strcat(string, lstr);
   2088  6212  aw148015 			}
   2089  5184  ek110237 		} else {
   2090  6212  aw148015 			/* perhaps a normal variable? */
   2091  6212  aw148015 			if ((tmp = var_to_string(lstr)) != NULL) {
   2092  6212  aw148015 				(void) strcat(string, tmp);
   2093  6212  aw148015 				free(tmp);
   2094  6212  aw148015 			} else {
   2095  6212  aw148015 				(void) strcat(string, lstr);
   2096  6212  aw148015 			}
   2097  5184  ek110237 		}
   2098  5184  ek110237 	}
   2099  5184  ek110237 	return (string);
   2100  5184  ek110237 }
   2101  5184  ek110237 
   2102  5184  ek110237 /*
   2103  5184  ek110237  * If the list just contains a single string starting with '$', then find
   2104  5184  ek110237  * or create the named var and return the var's var_string component.
   2105  5184  ek110237  * Otherwise, convert the list to a string, and allocate a var_string
   2106  5184  ek110237  * containing a copy of that string. On failure either returns NULL
   2107  5184  ek110237  * or shuts down the run.
   2108  5184  ek110237  */
   2109  6212  aw148015 avd_t
   2110  5184  ek110237 parser_list2varstring(list_t *list)
   2111  5184  ek110237 {
   2112  6212  aw148015 	char *lstr = avd_get_str(list->list_string);
   2113  6212  aw148015 
   2114  8404    Andrew 	/*	printf("parser_list2varstring: Called\n"); */
   2115  5184  ek110237 	/* Special case - variable name */
   2116  6212  aw148015 	if ((list->list_next == NULL) && (*lstr == '$'))
   2117  6212  aw148015 		return (var_ref_attr(lstr));
   2118  5184  ek110237 
   2119  6212  aw148015 	return (avd_str_alloc(parser_list2string(list)));
   2120  5184  ek110237 }
   2121  5184  ek110237 
   2122  5184  ek110237 /*
   2123  5184  ek110237  * Looks for the var named in list_string of the first element of the
   2124  6212  aw148015  * supplied list. If found, returns the var_val portion of the var in
   2125  6212  aw148015  * an attribute value descriptor. If the var is not found, cannot be
   2126  6212  aw148015  * allocated, the supplied list is NULL, or the list_string filed is
   2127  6212  aw148015  * empty, returns NULL.
   2128  5184  ek110237  */
   2129  6212  aw148015 avd_t
   2130  6212  aw148015 parser_list2avd(list_t *list)
   2131  5184  ek110237 {
   2132  6212  aw148015 	avd_t avd;
   2133  6212  aw148015 	char *lstr;
   2134  5184  ek110237 
   2135  6212  aw148015 	if (list && ((lstr = avd_get_str(list->list_string)) != NULL)) {
   2136  6212  aw148015 		avd = var_ref_attr(lstr);
   2137  6212  aw148015 		return (avd);
   2138  5184  ek110237 	}
   2139  5184  ek110237 
   2140  5184  ek110237 	return (NULL);
   2141  5184  ek110237 }
   2142  5184  ek110237 
   2143  5184  ek110237 /*
   2144  5184  ek110237  * Sets the event generator rate from the attribute supplied with the
   2145  5184  ek110237  * command. If the attribute doesn't exist the routine does nothing.
   2146  5184  ek110237  */
   2147  5184  ek110237 static void
   2148  5184  ek110237 parser_eventgen(cmd_t *cmd)
   2149  5184  ek110237 {
   2150  5184  ek110237 	attr_t *attr;
   2151  5184  ek110237 
   2152  5184  ek110237 	/* Get the rate from attribute */
   2153  5184  ek110237 	if (attr = get_attr_integer(cmd, FSA_RATE)) {
   2154  6212  aw148015 		if (attr->attr_avd) {
   2155  7946    Andrew 			eventgen_setrate(attr->attr_avd);
   2156  5184  ek110237 		}
   2157  5184  ek110237 	}
   2158  5184  ek110237 }
   2159  5184  ek110237 
   2160  5184  ek110237 /*
   2161  5184  ek110237  * Assigns the designated integer variable successive values from the
   2162  5184  ek110237  * supplied comma seperated integer list. After each successive integer
   2163  5184  ek110237  * assignment, it executes the bracket enclosed list of commands. For
   2164  5184  ek110237  * example, repeated runs of a workload with increasing io sizes can
   2165  5184  ek110237  * be done using the following command line:
   2166  5184  ek110237  * 	foreach $iosize in 2k, 4k, 8k {run 60}
   2167  5184  ek110237  */
   2168  5184  ek110237 static void
   2169  5184  ek110237 parser_foreach_integer(cmd_t *cmd)
   2170  5184  ek110237 {
   2171  5184  ek110237 	list_t *list = cmd->cmd_param_list;
   2172  5184  ek110237 	cmd_t *inner_cmd;
   2173  5184  ek110237 
   2174  5184  ek110237 	for (; list != NULL; list = list->list_next) {
   2175  6212  aw148015 		fbint_t list_int = avd_get_int(list->list_integer);
   2176  6212  aw148015 
   2177  6212  aw148015 		var_assign_integer(cmd->cmd_tgt1, list_int);
   2178  6286  aw148015 		filebench_log(LOG_VERBOSE, "Iterating %s=%llu",
   2179  6286  aw148015 		    cmd->cmd_tgt1, (u_longlong_t)list_int);
   2180  5184  ek110237 		for (inner_cmd = cmd->cmd_list; inner_cmd != NULL;
   2181  5184  ek110237 		    inner_cmd = inner_cmd->cmd_next) {
   2182  5184  ek110237 			inner_cmd->cmd(inner_cmd);
   2183  5184  ek110237 		}
   2184  5184  ek110237 	}
   2185  5184  ek110237 }
   2186  5184  ek110237 
   2187  5184  ek110237 /*
   2188  5184  ek110237  * Similar to parser_foreach_integer(), except takes a list of strings after
   2189  5184  ek110237  * the "in" token. For example, to run twice using a different directory,
   2190  5184  ek110237  * perhaps using a different filesystem, the following command line
   2191  5184  ek110237  * could be used:
   2192  5184  ek110237  * 	foreach $dir in "/ufs_top/fbt", "/zfs_top/fbt" {run 60)
   2193  5184  ek110237  */
   2194  5184  ek110237 static void
   2195  5184  ek110237 parser_foreach_string(cmd_t *cmd)
   2196  5184  ek110237 {
   2197  5184  ek110237 	list_t *list = cmd->cmd_param_list;
   2198  5184  ek110237 
   2199  5184  ek110237 	for (; list != NULL; list = list->list_next) {
   2200  6212  aw148015 		cmd_t *inner_cmd;
   2201  6212  aw148015 		char *lstr = avd_get_str(list->list_string);
   2202  6212  aw148015 		var_assign_string(cmd->cmd_tgt1, lstr);
   2203  5184  ek110237 		filebench_log(LOG_VERBOSE, "Iterating %s=%s",
   2204  6212  aw148015 		    cmd->cmd_tgt1, lstr);
   2205  5184  ek110237 		for (inner_cmd = cmd->cmd_list; inner_cmd != NULL;
   2206  5184  ek110237 		    inner_cmd = inner_cmd->cmd_next) {
   2207  5184  ek110237 			inner_cmd->cmd(inner_cmd);
   2208  5184  ek110237 		}
   2209  5184  ek110237 	}
   2210  5184  ek110237 }
   2211  5184  ek110237 
   2212  5184  ek110237 /*
   2213  5673  aw148015  * Lists the fileset name, path name and average size for all defined
   2214  5673  aw148015  * filesets.
   2215  5184  ek110237  */
   2216  5184  ek110237 static void
   2217  5184  ek110237 parser_list(cmd_t *cmd)
   2218  5184  ek110237 {
   2219  5673  aw148015 	(void) fileset_iter(fileset_print);
   2220  5184  ek110237 }
   2221  5184  ek110237 
   2222  5184  ek110237 /*
   2223  6212  aw148015  * Lists the flowop name and instance number for all flowops.
   2224  6212  aw148015  */
   2225  6212  aw148015 static void
   2226  6212  aw148015 parser_flowop_list(cmd_t *cmd)
   2227  6212  aw148015 {
   2228  6212  aw148015 	flowop_printall();
   2229  6212  aw148015 }
   2230  6212  aw148015 
   2231  6212  aw148015 /*
   2232  5184  ek110237  * Calls procflow_define() to allocate "instances" number of  procflow(s)
   2233  5184  ek110237  * (processes) with the supplied name. The default number of instances is
   2234  5184  ek110237  * one. An optional priority level attribute can be supplied and is stored in
   2235  5184  ek110237  * pf_nice. Finally the routine loops through the list of inner commands, if
   2236  5184  ek110237  * any, which are defines for threadflows, and passes them one at a time to
   2237  5184  ek110237  * parser_thread_define() to allocate threadflow entities for the process(es).
   2238  5184  ek110237  */
   2239  5184  ek110237 static void
   2240  5184  ek110237 parser_proc_define(cmd_t *cmd)
   2241  5184  ek110237 {
   2242  5184  ek110237 	procflow_t *procflow, template;
   2243  5184  ek110237 	char *name;
   2244  5184  ek110237 	attr_t *attr;
   2245  6212  aw148015 	avd_t var_instances;
   2246  6212  aw148015 	fbint_t instances;
   2247  5184  ek110237 	cmd_t *inner_cmd;
   2248  5184  ek110237 
   2249  5184  ek110237 	/* Get the name of the process */
   2250  5184  ek110237 	if (attr = get_attr(cmd, FSA_NAME)) {
   2251  6212  aw148015 		name = avd_get_str(attr->attr_avd);
   2252  5184  ek110237 	} else {
   2253  5184  ek110237 		filebench_log(LOG_ERROR,
   2254  5184  ek110237 		    "define proc: proc specifies no name");
   2255  5184  ek110237 		filebench_shutdown(1);
   2256  5184  ek110237 	}
   2257  5184  ek110237 
   2258  5184  ek110237 	/* Get the memory size from attribute */
   2259  5184  ek110237 	if (attr = get_attr_integer(cmd, FSA_INSTANCES)) {
   2260  6212  aw148015 		if (AVD_IS_RANDOM(attr->attr_avd)) {
   2261  6212  aw148015 			filebench_log(LOG_ERROR,
   2262  6212  aw148015 			    "proc_define: Instances attr cannot be random");
   2263  6212  aw148015 			filebench_shutdown(1);
   2264  6212  aw148015 		}
   2265  6212  aw148015 		var_instances = attr->attr_avd;
   2266  6212  aw148015 		instances = avd_get_int(var_instances);
   2267  5184  ek110237 		filebench_log(LOG_DEBUG_IMPL,
   2268  6286  aw148015 		    "Setting instances = %llu", (u_longlong_t)instances);
   2269  6212  aw148015 	} else {
   2270  6212  aw148015 		filebench_log(LOG_DEBUG_IMPL,
   2271  6212  aw148015 		    "Defaulting to instances = 1");
   2272  6212  aw148015 		var_instances = avd_int_alloc(1);
   2273  6212  aw148015 		instances = 1;
   2274  5184  ek110237 	}
   2275  5184  ek110237 
   2276  6212  aw148015 	if ((procflow = procflow_define(name, NULL, var_instances)) == NULL) {
   2277  5184  ek110237 		filebench_log(LOG_ERROR,
   2278  5184  ek110237 		    "Failed to instantiate %d %s process(es)\n",
   2279  5184  ek110237 		    instances, name);
   2280  5184  ek110237 		filebench_shutdown(1);
   2281  5184  ek110237 	}
   2282  5184  ek110237 
   2283  5184  ek110237 	/* Get the pri from attribute */
   2284  5184  ek110237 	if (attr = get_attr_integer(cmd, FSA_NICE)) {
   2285  6212  aw148015 		if (AVD_IS_RANDOM(attr->attr_avd)) {
   2286  6212  aw148015 			filebench_log(LOG_ERROR,
   2287  6212  aw148015 			    "proc_define: priority cannot be random");
   2288  6212  aw148015 			filebench_shutdown(1);
   2289  6212  aw148015 		}
   2290  6286  aw148015 		filebench_log(LOG_DEBUG_IMPL, "Setting pri = %llu",
   2291  6286  aw148015 		    (u_longlong_t)avd_get_int(attr->attr_avd));
   2292  6212  aw148015 		procflow->pf_nice = attr->attr_avd;
   2293  5184  ek110237 	} else
   2294  6212  aw148015 		procflow->pf_nice = avd_int_alloc(0);
   2295  5184  ek110237 
   2296  5184  ek110237 
   2297  5184  ek110237 	/* Create the list of threads for this process  */
   2298  5184  ek110237 	for (inner_cmd = cmd->cmd_list; inner_cmd != NULL;
   2299  5184  ek110237 	    inner_cmd = inner_cmd->cmd_next) {
   2300  6212  aw148015 		parser_thread_define(inner_cmd, procflow, instances);
   2301  5184  ek110237 	}
   2302  5184  ek110237 }
   2303  5184  ek110237 
   2304  5184  ek110237 /*
   2305  5184  ek110237  * Calls threadflow_define() to allocate "instances" number of  threadflow(s)
   2306  5184  ek110237  * (threads) with the supplied name. The default number of instances is
   2307  5184  ek110237  * one. Two other optional attributes may be supplied, one to set the memory
   2308  5184  ek110237  * size, stored in tf_memsize, and to select the use of Interprocess Shared
   2309  5184  ek110237  * Memory, which sets the THREADFLOW_USEISM flag in tf_attrs. Finally
   2310  5184  ek110237  * the routine loops through the list of inner commands, if any, which are
   2311  5184  ek110237  * defines for flowops, and passes them one at a time to
   2312  5184  ek110237  * parser_flowop_define() to allocate flowop entities for the threadflows.
   2313  5184  ek110237  */
   2314  5184  ek110237 static void
   2315  5184  ek110237 parser_thread_define(cmd_t *cmd, procflow_t *procflow, int procinstances)
   2316  5184  ek110237 {
   2317  5184  ek110237 	threadflow_t *threadflow, template;
   2318  5184  ek110237 	attr_t *attr;
   2319  6212  aw148015 	avd_t instances;
   2320  5184  ek110237 	cmd_t *inner_cmd;
   2321  5184  ek110237 	char *name;
   2322  5184  ek110237 
   2323  5184  ek110237 	memset(&template, 0, sizeof (threadflow_t));
   2324  5184  ek110237 
   2325  5184  ek110237 	/* Get the name of the thread */
   2326  5184  ek110237 	if (attr = get_attr(cmd, FSA_NAME)) {
   2327  6212  aw148015 		name = avd_get_str(attr->attr_avd);
   2328  5184  ek110237 	} else {
   2329  5184  ek110237 		filebench_log(LOG_ERROR,
   2330  5184  ek110237 		    "define thread: thread in process %s specifies no name",
   2331  5184  ek110237 		    procflow->pf_name);
   2332  5184  ek110237 		filebench_shutdown(1);
   2333  5184  ek110237 	}
   2334  5184  ek110237 
   2335  5184  ek110237 	/* Get the number of instances from attribute */
   2336  5184  ek110237 	if (attr = get_attr_integer(cmd, FSA_INSTANCES)) {
   2337  6212  aw148015 		if (AVD_IS_RANDOM(attr->attr_avd)) {
   2338  6212  aw148015 			filebench_log(LOG_ERROR,
   2339  6212  aw148015 			    "define thread: Instances attr cannot be random");
   2340  6212  aw148015 			filebench_shutdown(1);
   2341  6212  aw148015 		}
   2342  5184  ek110237 		filebench_log(LOG_DEBUG_IMPL,
   2343  6286  aw148015 		    "define thread: Setting instances = %llu",
   2344  6286  aw148015 		    (u_longlong_t)avd_get_int(attr->attr_avd));
   2345  6212  aw148015 		instances = attr->attr_avd;
   2346  6212  aw148015 	} else
   2347  6212  aw148015 		instances = avd_int_alloc(1);
   2348  5184  ek110237 
   2349  5184  ek110237 	/* Get the memory size from attribute */
   2350  5184  ek110237 	if (attr = get_attr_integer(cmd, FSA_MEMSIZE)) {
   2351  6212  aw148015 		if (AVD_IS_RANDOM(attr->attr_avd)) {
   2352  6212  aw148015 			filebench_log(LOG_ERROR,
   2353  6212  aw148015 			    "define thread: Memory size cannot be random");
   2354  6212  aw148015 			filebench_shutdown(1);
   2355  6212  aw148015 		}
   2356  5184  ek110237 		filebench_log(LOG_DEBUG_IMPL,
   2357  6286  aw148015 		    "define thread: Setting memsize = %llu",
   2358  6286  aw148015 		    (u_longlong_t)avd_get_int(attr->attr_avd));
   2359  6212  aw148015 		template.tf_memsize = attr->attr_avd;
   2360  5184  ek110237 	} else
   2361  6212  aw148015 		template.tf_memsize = avd_int_alloc(0);
   2362  5184  ek110237 
   2363  5184  ek110237 	if ((threadflow = threadflow_define(procflow, name,
   2364  5184  ek110237 	    &template, instances)) == NULL) {
   2365  5184  ek110237 		filebench_log(LOG_ERROR,
   2366  5184  ek110237 		    "define thread: Failed to instantiate thread\n");
   2367  5184  ek110237 		filebench_shutdown(1);
   2368  5184  ek110237 	}
   2369  5184  ek110237 
   2370  5184  ek110237 	/* Use ISM Memory? */
   2371  5184  ek110237 	if (attr = get_attr(cmd, FSA_USEISM)) {
   2372  5184  ek110237 		threadflow->tf_attrs |= THREADFLOW_USEISM;
   2373  5184  ek110237 	}
   2374  5184  ek110237 
   2375  5184  ek110237 	/* Create the list of flowops */
   2376  5184  ek110237 	for (inner_cmd = cmd->cmd_list; inner_cmd != NULL;
   2377  5184  ek110237 	    inner_cmd = inner_cmd->cmd_next) {
   2378  6212  aw148015 		parser_flowop_define(inner_cmd, threadflow,
   2379  6550  aw148015 		    &threadflow->tf_thrd_fops, FLOW_MASTER);
   2380  5184  ek110237 	}
   2381  5184  ek110237 }
   2382  6212  aw148015 
   2383  6212  aw148015 /*
   2384  8404    Andrew  * Fills in the attributes for a newly allocated flowop
   2385  6212  aw148015  */
   2386  6212  aw148015 static void
   2387  6212  aw148015 parser_flowop_get_attrs(cmd_t *cmd, flowop_t *flowop)
   2388  6212  aw148015 {
   2389  6212  aw148015 	attr_t *attr;
   2390  6212  aw148015 
   2391  6212  aw148015 	/* Get the filename from attribute */
   2392  6212  aw148015 	if (attr = get_attr(cmd, FSA_FILE)) {
   2393  6212  aw148015 		flowop->fo_filename = attr->attr_avd;
   2394  6212  aw148015 		if (flowop->fo_filename == NULL) {
   2395  6212  aw148015 			filebench_log(LOG_ERROR,
   2396  6212  aw148015 			    "define flowop: no filename specfied");
   2397  6212  aw148015 			filebench_shutdown(1);
   2398  6212  aw148015 		}
   2399  9326    Andrew 	} else {
   2400  9326    Andrew 		/* no filename attribute specified */
   2401  9326    Andrew 		flowop->fo_filename = NULL;
   2402  6212  aw148015 	}
   2403  6212  aw148015 
   2404  6212  aw148015 	/* Get the iosize of the op */
   2405  6212  aw148015 	if (attr = get_attr_integer(cmd, FSA_IOSIZE))
   2406  6212  aw148015 		flowop->fo_iosize = attr->attr_avd;
   2407  6212  aw148015 	else
   2408  6212  aw148015 		flowop->fo_iosize = avd_int_alloc(0);
   2409  6212  aw148015 
   2410  6212  aw148015 	/* Get the working set size of the op */
   2411  6212  aw148015 	if (attr = get_attr_integer(cmd, FSA_WSS))
   2412  6212  aw148015 		flowop->fo_wss = attr->attr_avd;
   2413  6212  aw148015 	else
   2414  6212  aw148015 		flowop->fo_wss = avd_int_alloc(0);
   2415  6212  aw148015 
   2416  6212  aw148015 	/* Random I/O? */
   2417  6212  aw148015 	if (attr = get_attr_bool(cmd, FSA_RANDOM))
   2418  6212  aw148015 		flowop->fo_random = attr->attr_avd;
   2419  6212  aw148015 	else
   2420  6212  aw148015 		flowop->fo_random = avd_bool_alloc(FALSE);
   2421  6212  aw148015 
   2422  6212  aw148015 	/* Sync I/O? */
   2423  6212  aw148015 	if (attr = get_attr_bool(cmd, FSA_DSYNC))
   2424  6212  aw148015 		flowop->fo_dsync = attr->attr_avd;
   2425  6212  aw148015 	else
   2426  6212  aw148015 		flowop->fo_dsync = avd_bool_alloc(FALSE);
   2427  6212  aw148015 
   2428  6212  aw148015 	/* Target, for wakeup etc */
   2429  6212  aw148015 	if (attr = get_attr(cmd, FSA_TARGET))
   2430  6212  aw148015 		(void) strcpy(flowop->fo_targetname,
   2431  6212  aw148015 		    avd_get_str(attr->attr_avd));
   2432  6212  aw148015 
   2433  6212  aw148015 	/* Value */
   2434  6212  aw148015 	if (attr = get_attr_integer(cmd, FSA_VALUE))
   2435  6212  aw148015 		flowop->fo_value = attr->attr_avd;
   2436  6212  aw148015 	else
   2437  6212  aw148015 		flowop->fo_value = avd_int_alloc(0);
   2438  6212  aw148015 
   2439  6212  aw148015 	/* FD */
   2440  9326    Andrew 	if (attr = get_attr_integer(cmd, FSA_FD)) {
   2441  6212  aw148015 		flowop->fo_fdnumber = avd_get_int(attr->attr_avd);
   2442  9326    Andrew 		if (flowop->fo_filename != NULL)
   2443  9326    Andrew 			filebench_log(LOG_DEBUG_SCRIPT, "It is not "
   2444  9326    Andrew 			    "advisable to supply both an fd number "
   2445  9326    Andrew 			    "and a fileset name in most cases");
   2446  9326    Andrew 	}
   2447  6212  aw148015 
   2448  6212  aw148015 	/* Rotatefd? */
   2449  6212  aw148015 	if (attr = get_attr_bool(cmd, FSA_ROTATEFD))
   2450  6212  aw148015 		flowop->fo_rotatefd = attr->attr_avd;
   2451  6212  aw148015 	else
   2452  6212  aw148015 		flowop->fo_rotatefd = avd_bool_alloc(FALSE);
   2453  6212  aw148015 
   2454  6212  aw148015 	/* SRC FD, for copies etc... */
   2455  6212  aw148015 	if (attr = get_attr_integer(cmd, FSA_SRCFD))
   2456  6212  aw148015 		flowop->fo_srcfdnumber = avd_get_int(attr->attr_avd);
   2457  6212  aw148015 
   2458  6212  aw148015 	/* Blocking operation? */
   2459  6212  aw148015 	if (attr = get_attr_bool(cmd, FSA_BLOCKING))
   2460  6212  aw148015 		flowop->fo_blocking = attr->attr_avd;
   2461  6212  aw148015 	else
   2462  6212  aw148015 		flowop->fo_blocking = avd_bool_alloc(FALSE);
   2463  6212  aw148015 
   2464  6212  aw148015 	/* Direct I/O Operation */
   2465  6212  aw148015 	if (attr = get_attr_bool(cmd, FSA_DIRECTIO))
   2466  6212  aw148015 		flowop->fo_directio = attr->attr_avd;
   2467  6212  aw148015 	else
   2468  6212  aw148015 		flowop->fo_directio = avd_bool_alloc(FALSE);
   2469  6212  aw148015 
   2470  6212  aw148015 	/* Highwater mark */
   2471  6212  aw148015 	if (attr = get_attr_integer(cmd, FSA_HIGHWATER)) {
   2472  6212  aw148015 		flowop->fo_highwater = attr->attr_avd;
   2473  6212  aw148015 		if (AVD_IS_RANDOM(attr->attr_avd)) {
   2474  6212  aw148015 			filebench_log(LOG_ERROR,
   2475  6212  aw148015 			    "define flowop: Highwater attr cannot be random");
   2476  6212  aw148015 			filebench_shutdown(1);
   2477  6212  aw148015 		}
   2478  6212  aw148015 	} else {
   2479  6212  aw148015 		flowop->fo_highwater = avd_int_alloc(1);
   2480  6212  aw148015 	}
   2481  8404    Andrew 
   2482  8404    Andrew 	/* find file or leaf directory by index number */
   2483  8404    Andrew 	if (attr = get_attr_integer(cmd, FSA_INDEXED))
   2484  8404    Andrew 		flowop->fo_fileindex = attr->attr_avd;
   2485  8404    Andrew 	else
   2486  8404    Andrew 		flowop->fo_fileindex = NULL;
   2487  6212  aw148015 }
   2488  6212  aw148015 
   2489  6550  aw148015 /*
   2490  6550  aw148015  * defines the FLOW_MASTER flowops within a FLOW_MASTER instance of
   2491  6550  aw148015  * a composit flowop. Default attributes from the FLOW_INNER_DEF instances
   2492  6550  aw148015  * of the composit flowop's inner flowops are used if set. Otherwise
   2493  6550  aw148015  * default attributes from the FLOW_MASTER instance of the composit flowop
   2494  6550  aw148015  * are used, which may include defaults from the original FLOW_DEFINITION
   2495  6550  aw148015  * of the composit flowop.
   2496  6550  aw148015  */
   2497  6550  aw148015 static void
   2498  6550  aw148015 parser_inner_flowop_define(threadflow_t *thread, flowop_t *comp0_flow,
   2499  6550  aw148015 			   flowop_t *comp_mstr_flow)
   2500  6550  aw148015 {
   2501  6550  aw148015 	flowop_t *inner_flowtype, *inner_flowop;
   2502  6550  aw148015 
   2503  6550  aw148015 	/* follow flowop list, creating composit names */
   2504  6550  aw148015 	inner_flowtype = comp0_flow->fo_comp_fops;
   2505  6550  aw148015 	comp_mstr_flow->fo_comp_fops = NULL;
   2506  6550  aw148015 
   2507  6550  aw148015 	while (inner_flowtype) {
   2508  6550  aw148015 		char fullname[MAXPATHLEN];
   2509  6550  aw148015 
   2510  6550  aw148015 		/* create composite_name.name for new flowop */
   2511  6613  ek110237 		snprintf(fullname, MAXPATHLEN, "%s.%s",
   2512  6613  ek110237 		    comp_mstr_flow->fo_name, inner_flowtype->fo_name);
   2513  6550  aw148015 
   2514  6550  aw148015 		if ((inner_flowop = flowop_define(thread, fullname,
   2515  6550  aw148015 		    inner_flowtype, &comp_mstr_flow->fo_comp_fops,
   2516  6550  aw148015 		    FLOW_MASTER, 0)) == NULL) {
   2517  6550  aw148015 			filebench_log(LOG_ERROR,
   2518  6550  aw148015 			    "define flowop: Failed to instantiate flowop %s\n",
   2519  6550  aw148015 			    fullname);
   2520  6550  aw148015 			filebench_shutdown(1);
   2521  6550  aw148015 		}
   2522  6550  aw148015 
   2523  6550  aw148015 		/* if applicable, update filename attribute */
   2524  6550  aw148015 		if (inner_flowop->fo_filename) {
   2525  6550  aw148015 			char *name;
   2526  6550  aw148015 
   2527  6550  aw148015 			/* fix up avd_t */
   2528  6550  aw148015 			avd_update(&inner_flowop->fo_filename,
   2529  6550  aw148015 			    comp_mstr_flow->fo_lvar_list);
   2530  6550  aw148015 
   2531  6550  aw148015 			/* see if ready to get the file or fileset */
   2532  6550  aw148015 			name = avd_get_str(inner_flowop->fo_filename);
   2533  6550  aw148015 			if (name) {
   2534  6550  aw148015 
   2535  6550  aw148015 				inner_flowop->fo_fileset = fileset_find(name);
   2536  6550  aw148015 
   2537  6550  aw148015 				if (inner_flowop->fo_fileset == NULL) {
   2538  6550  aw148015 					filebench_log(LOG_ERROR,
   2539  6550  aw148015 					    "inr flowop %s: file %s not found",
   2540  6550  aw148015 					    inner_flowop->fo_name, name);
   2541  6550  aw148015 					filebench_shutdown(1);
   2542  6550  aw148015 				}
   2543  6550  aw148015 			}
   2544  6550  aw148015 		}
   2545  6550  aw148015 
   2546  6550  aw148015 		/* update attributes from local variables */
   2547  6550  aw148015 		avd_update(&inner_flowop->fo_iters,
   2548  6550  aw148015 		    comp_mstr_flow->fo_lvar_list);
   2549  6550  aw148015 
   2550  6550  aw148015 		/* if the inner flowop is a composit flowop, recurse */
   2551  6550  aw148015 		if (inner_flowtype->fo_type == FLOW_TYPE_COMPOSITE) {
   2552  6550  aw148015 			var_t *newlvar, *proto_lvars, *lvar_ptr;
   2553  6550  aw148015 
   2554  6550  aw148015 			proto_lvars = inner_flowop->fo_lvar_list;
   2555  6550  aw148015 			inner_flowop->fo_lvar_list = 0;
   2556  6550  aw148015 
   2557  6550  aw148015 			for (lvar_ptr = inner_flowtype->fo_lvar_list; lvar_ptr;
   2558  6550  aw148015 			    lvar_ptr = lvar_ptr->var_next) {
   2559  6550  aw148015 
   2560  6550  aw148015 				if ((newlvar = var_lvar_alloc_local(
   2561  6550  aw148015 				    lvar_ptr->var_name)) != NULL) {
   2562  6550  aw148015 
   2563  6550  aw148015 					add_lvar_to_list(newlvar,
   2564  6550  aw148015 					    &inner_flowop->fo_lvar_list);
   2565  6550  aw148015 
   2566  6550  aw148015 					var_update_comp_lvars(newlvar,
   2567  6550  aw148015 					    proto_lvars,
   2568  6550  aw148015 					    comp_mstr_flow->fo_lvar_list);
   2569  6550  aw148015 				}
   2570  6550  aw148015 			}
   2571  6550  aw148015 
   2572  6550  aw148015 			parser_inner_flowop_define(thread,
   2573  6550  aw148015 			    inner_flowtype,
   2574  6550  aw148015 			    inner_flowop);
   2575  6550  aw148015 
   2576  6550  aw148015 			inner_flowtype = inner_flowtype->fo_exec_next;
   2577  6550  aw148015 			continue;
   2578  6550  aw148015 		}
   2579  6550  aw148015 
   2580  6550  aw148015 		avd_update(&inner_flowop->fo_iosize,
   2581  6550  aw148015 		    comp_mstr_flow->fo_lvar_list);
   2582  6550  aw148015 		avd_update(&inner_flowop->fo_wss,
   2583  6550  aw148015 		    comp_mstr_flow->fo_lvar_list);
   2584  6550  aw148015 		avd_update(&inner_flowop->fo_iters,
   2585  6550  aw148015 		    comp_mstr_flow->fo_lvar_list);
   2586  6550  aw148015 		avd_update(&inner_flowop->fo_value,
   2587  6550  aw148015 		    comp_mstr_flow->fo_lvar_list);
   2588  6550  aw148015 		avd_update(&inner_flowop->fo_random,
   2589  6550  aw148015 		    comp_mstr_flow->fo_lvar_list);
   2590  6550  aw148015 		avd_update(&inner_flowop->fo_dsync,
   2591  6550  aw148015 		    comp_mstr_flow->fo_lvar_list);
   2592  6550  aw148015 		avd_update(&inner_flowop->fo_rotatefd,
   2593  6550  aw148015 		    comp_mstr_flow->fo_lvar_list);
   2594  6550  aw148015 		avd_update(&inner_flowop->fo_blocking,
   2595  6550  aw148015 		    comp_mstr_flow->fo_lvar_list);
   2596  6550  aw148015 		avd_update(&inner_flowop->fo_directio,
   2597  6550  aw148015 		    comp_mstr_flow->fo_lvar_list);
   2598  6550  aw148015 		avd_update(&inner_flowop->fo_highwater,
   2599  6550  aw148015 		    comp_mstr_flow->fo_lvar_list);
   2600  6550  aw148015 
   2601  6550  aw148015 		inner_flowtype = inner_flowtype->fo_exec_next;
   2602  6550  aw148015 	}
   2603  6550  aw148015 }
   2604  5184  ek110237 
   2605  5184  ek110237 /*
   2606  5184  ek110237  * Calls flowop_define() to allocate a flowop with the supplied name.
   2607  5184  ek110237  * The allocated flowop inherits attributes from a base flowop of the
   2608  5184  ek110237  * same type.  If the new flowop has a file or fileset attribute specified,
   2609  5184  ek110237  * it must specify a defined fileobj or fileset or an error will be logged.
   2610  5184  ek110237  * The new flowop may  also have the following attributes set by
   2611  5184  ek110237  * the program:
   2612  5184  ek110237  *  - file size (fo_iosize)
   2613  5184  ek110237  *  - working set size (fo_wss)
   2614  5184  ek110237  *  - do random io (fo_random)
   2615  5184  ek110237  *  - do synchronous io (fo_dsync)
   2616  5184  ek110237  *  - perform each operation multiple times before advancing (fo_iter)
   2617  5184  ek110237  *  - target name (fo_targetname)
   2618  5184  ek110237  *  - An integer value (fo_value)
   2619  5184  ek110237  *  - a file descriptor (fo_fd)
   2620  5184  ek110237  *  - specify to rotate file descriptors (fo_rotatefd)
   2621  5184  ek110237  *  - a source fd (fo_srcfdnumber)
   2622  5184  ek110237  *  - specify a blocking operation (fo_blocking)
   2623  5184  ek110237  *  - specify a highwater mark (fo_highwater)
   2624  5184  ek110237  *
   2625  5184  ek110237  * After all the supplied attributes are stored in their respective locations
   2626  5184  ek110237  * in the flowop object, the flowop's init function is called. No errors are
   2627  5184  ek110237  * returned, but the filebench run will be terminated if the flowtype is not
   2628  5184  ek110237  * specified, a name for the new flowop is not supplied, the flowop_define
   2629  5184  ek110237  * call fails, or a file or fileset name is supplied but the corresponding
   2630  5184  ek110237  * fileobj or fileset cannot be located.
   2631  5184  ek110237  */
   2632  5184  ek110237 static void
   2633  6212  aw148015 parser_flowop_define(cmd_t *cmd, threadflow_t *thread,
   2634  6212  aw148015     flowop_t **flowoplist_hdp, int category)
   2635  5184  ek110237 {
   2636  5184  ek110237 	flowop_t *flowop, *flowop_type;
   2637  5184  ek110237 	char *type = (char *)cmd->cmd_name;
   2638  5184  ek110237 	char *name;
   2639  5184  ek110237 	attr_t *attr;
   2640  5184  ek110237 
   2641  5184  ek110237 	/* Get the inherited flowop */
   2642  5184  ek110237 	flowop_type = flowop_find(type);
   2643  5184  ek110237 	if (flowop_type == NULL) {
   2644  5184  ek110237 		filebench_log(LOG_ERROR,
   2645  5184  ek110237 		    "define flowop: flowop type %s not found",
   2646  5184  ek110237 		    type);
   2647  5184  ek110237 		filebench_shutdown(1);
   2648  5184  ek110237 	}
   2649  5184  ek110237 
   2650  5184  ek110237 	/* Get the name of the flowop */
   2651  5184  ek110237 	if (attr = get_attr(cmd, FSA_NAME)) {
   2652  6212  aw148015 		name = avd_get_str(attr->attr_avd);
   2653  5184  ek110237 	} else {
   2654  5184  ek110237 		filebench_log(LOG_ERROR,
   2655  5184  ek110237 		    "define flowop: flowop %s specifies no name",
   2656  5184  ek110237 		    flowop_type->fo_name);
   2657  5184  ek110237 		filebench_shutdown(1);
   2658  5184  ek110237 	}
   2659  5184  ek110237 
   2660  5184  ek110237 	if ((flowop = flowop_define(thread, name,
   2661  6550  aw148015 	    flowop_type, flowoplist_hdp, category, 0)) == NULL) {
   2662  5184  ek110237 		filebench_log(LOG_ERROR,
   2663  5184  ek110237 		    "define flowop: Failed to instantiate flowop %s\n",
   2664  5184  ek110237 		    cmd->cmd_name);
   2665  5184  ek110237 		filebench_shutdown(1);
   2666  5184  ek110237 	}
   2667  5184  ek110237 
   2668  5184  ek110237 	/* Iterations */
   2669  5184  ek110237 	if (attr = get_attr_integer(cmd, FSA_ITERS))
   2670  6212  aw148015 		flowop->fo_iters = attr->attr_avd;
   2671  5184  ek110237 	else
   2672  6212  aw148015 		flowop->fo_iters = avd_int_alloc(1);
   2673  5184  ek110237 
   2674  6550  aw148015 
   2675  6550  aw148015 	/* if this is a use of a composit flowop, create inner FLOW MASTERS */
   2676  6550  aw148015 	if (flowop_type->fo_type == FLOW_TYPE_COMPOSITE) {
   2677  6550  aw148015 		get_attr_lvars(cmd, flowop);
   2678  6550  aw148015 		if (category == FLOW_MASTER)
   2679  6550  aw148015 			parser_inner_flowop_define(thread,
   2680  6550  aw148015 			    flowop_type, flowop);
   2681  6550  aw148015 	}
   2682  6550  aw148015 	else {
   2683  6550  aw148015 		parser_flowop_get_attrs(cmd, flowop);
   2684  6550  aw148015 	}
   2685  5184  ek110237 }
   2686  6550  aw148015 
   2687  6550  aw148015 static void
   2688  6550  aw148015 parser_composite_flowop_define(cmd_t *cmd)
   2689  6550  aw148015 {
   2690  6550  aw148015 	flowop_t *flowop;
   2691  6550  aw148015 	cmd_t *inner_cmd;
   2692  6550  aw148015 	char *name;
   2693  6550  aw148015 	attr_t *attr;
   2694  6550  aw148015 
   2695  6550  aw148015 	/* Get the name of the flowop */
   2696  6550  aw148015 	if (attr = get_attr(cmd, FSA_NAME)) {
   2697  6550  aw148015 		name = avd_get_str(attr->attr_avd);
   2698  6550  aw148015 	} else {
   2699  6550  aw148015 		filebench_log(LOG_ERROR,
   2700  6550  aw148015 		    "define flowop: Composit flowop specifies no name");
   2701  6550  aw148015 
   2702  6550  aw148015 		filebench_shutdown(1);
   2703  6550  aw148015 	}
   2704  6550  aw148015 
   2705  6550  aw148015 	if ((flowop = flowop_new_composite_define(name)) == NULL) {
   2706  6550  aw148015 		filebench_log(LOG_ERROR,
   2707  6550  aw148015 		    "define flowop: Failed to instantiate flowop %s\n",
   2708  6550  aw148015 		    cmd->cmd_name);
   2709  6550  aw148015 		filebench_shutdown(1);
   2710  6550  aw148015 	}
   2711  6550  aw148015 
   2712  6550  aw148015 	/* place any local var_t variables on the flowop's local list */
   2713  6550  aw148015 	get_attr_lvars(cmd, flowop);
   2714  6550  aw148015 
   2715  6550  aw148015 	/* Iterations */
   2716  6550  aw148015 	if (attr = get_attr_integer(cmd, FSA_ITERS))
   2717  6550  aw148015 		flowop->fo_iters = attr->attr_avd;
   2718  6550  aw148015 	else
   2719  6550  aw148015 		flowop->fo_iters = avd_int_alloc(1);
   2720  6550  aw148015 
   2721  6550  aw148015 	/* define inner flowops */
   2722  6550  aw148015 	for (inner_cmd = cmd->cmd_list; inner_cmd != NULL;
   2723  6550  aw148015 	    inner_cmd = inner_cmd->cmd_next) {
   2724  6550  aw148015 		parser_flowop_define(inner_cmd, NULL,
   2725  6550  aw148015 		    &flowop->fo_comp_fops, FLOW_INNER_DEF);
   2726  6550  aw148015 	}
   2727  6550  aw148015 }
   2728  6550  aw148015 
   2729  5184  ek110237 
   2730  5184  ek110237 /*
   2731  5184  ek110237  * Calls fileset_define() to allocate a fileset with the supplied name and
   2732  6212  aw148015  * initializes the fileset's pathname attribute, and optionally the
   2733  6212  aw148015  * fileset_cached, fileset_reuse, fileset_prealloc and fileset_size attributes.
   2734  5673  aw148015  *
   2735  5184  ek110237  */
   2736  5673  aw148015 static fileset_t *
   2737  5673  aw148015 parser_fileset_define_common(cmd_t *cmd)
   2738  5184  ek110237 {
   2739  5184  ek110237 	fileset_t *fileset;
   2740  6212  aw148015 	avd_t name;
   2741  5184  ek110237 	attr_t *attr;
   2742  6212  aw148015 	avd_t pathname;
   2743  5184  ek110237 
   2744  8615    Andrew 	/*
   2745  8615    Andrew 	 * Make sure all plugin flowops are initialized.
   2746  8615    Andrew 	 * Defaults to local fs for now
   2747  8615    Andrew 	 */
   2748  8615    Andrew 	flowop_plugin_flowinit();
   2749  8615    Andrew 
   2750  5184  ek110237 	/* Get the name of the file */
   2751  8404    Andrew 	if (attr = get_attr_fileset(cmd, FSA_NAME)) {
   2752  6212  aw148015 		name = attr->attr_avd;
   2753  5184  ek110237 	} else {
   2754  5184  ek110237 		filebench_log(LOG_ERROR,
   2755  5673  aw148015 		    "define fileset: file or fileset specifies no name");
   2756  5673  aw148015 		return (NULL);
   2757  5184  ek110237 	}
   2758  5184  ek110237 
   2759  5184  ek110237 	if ((fileset = fileset_define(name)) == NULL) {
   2760  5184  ek110237 		filebench_log(LOG_ERROR,
   2761  5184  ek110237 		    "define file: failed to instantiate file %s\n",
   2762  6212  aw148015 		    avd_get_str(name));
   2763  5673  aw148015 		return (NULL);
   2764  5184  ek110237 	}
   2765  5184  ek110237 
   2766  5184  ek110237 	/* Get the pathname from attribute */
   2767  5184  ek110237 	if ((attr = get_attr(cmd, FSA_PATH)) == NULL) {
   2768  5184  ek110237 		filebench_log(LOG_ERROR, "define file: no pathname specified");
   2769  5673  aw148015 		return (NULL);
   2770  5184  ek110237 	}
   2771  5184  ek110237 
   2772  5184  ek110237 	/* Expand variables in pathname */
   2773  5673  aw148015 	if ((pathname = parser_list2varstring(attr->attr_param_list))
   2774  5673  aw148015 	    == NULL) {
   2775  5184  ek110237 		filebench_log(LOG_ERROR, "Cannot interpret path");
   2776  5673  aw148015 		return (NULL);
   2777  5184  ek110237 	}
   2778  5184  ek110237 
   2779  5184  ek110237 	fileset->fs_path = pathname;
   2780  5673  aw148015 
   2781  7736    Andrew 	/* How much should we preallocate? */
   2782  7736    Andrew 	if ((attr = get_attr_integer(cmd, FSA_PREALLOC)) &&
   2783  7736    Andrew 	    attr->attr_avd) {
   2784  7736    Andrew 		if (AVD_IS_RANDOM(attr->attr_avd)) {
   2785  7736    Andrew 			filebench_log(LOG_ERROR,
   2786  7736    Andrew 			    "define fileset: Prealloc attr cannot be random");
   2787  7736    Andrew 			filebench_shutdown(1);
   2788  7736    Andrew 		}
   2789  7736    Andrew 		fileset->fs_preallocpercent = attr->attr_avd;
   2790  7736    Andrew 	} else if (attr && !attr->attr_avd) {
   2791  7736    Andrew 		fileset->fs_preallocpercent = avd_int_alloc(100);
   2792  7736    Andrew 	} else {
   2793  7736    Andrew 		fileset->fs_preallocpercent = avd_int_alloc(0);
   2794  7736    Andrew 	}
   2795  7736    Andrew 
   2796  7736    Andrew 	/* Should we preallocate? */
   2797  7736    Andrew 	if (attr = get_attr_bool(cmd, FSA_PREALLOC))
   2798  7736    Andrew 		fileset->fs_prealloc = attr->attr_avd;
   2799  7736    Andrew 	else
   2800  7736    Andrew 		fileset->fs_prealloc = avd_bool_alloc(FALSE);
   2801  7736    Andrew 
   2802  5673  aw148015 	/* Should we prealloc in parallel? */
   2803  6212  aw148015 	if (attr = get_attr_bool(cmd, FSA_PARALLOC))
   2804  6212  aw148015 		fileset->fs_paralloc = attr->attr_avd;
   2805  6212  aw148015 	else
   2806  6212  aw148015 		fileset->fs_paralloc = avd_bool_alloc(FALSE);
   2807  5673  aw148015 
   2808  9326    Andrew 	/* Should we allow writes to the file? */
   2809  9326    Andrew 	if (attr = get_attr_bool(cmd, FSA_READONLY))
   2810  9326    Andrew 		fileset->fs_readonly = attr->attr_avd;
   2811  9326    Andrew 	else
   2812  9326    Andrew 		fileset->fs_readonly = avd_bool_alloc(FALSE);
   2813  9326    Andrew 
   2814  5673  aw148015 	/* Should we reuse the existing file? */
   2815  7736    Andrew 	if (attr = get_attr_bool(cmd, FSA_REUSE))
   2816  6212  aw148015 		fileset->fs_reuse = attr->attr_avd;
   2817  7736    Andrew 	else
   2818  6212  aw148015 		fileset->fs_reuse = avd_bool_alloc(FALSE);
   2819  9326    Andrew 
   2820  9326    Andrew 	/* Should we check for files actual existance? */
   2821  9326    Andrew 	if (attr = get_attr_bool(cmd, FSA_TRUSTTREE))
   2822  9326    Andrew 		fileset->fs_trust_tree = attr->attr_avd;
   2823  9326    Andrew 	else
   2824  9326    Andrew 		fileset->fs_trust_tree = avd_bool_alloc(FALSE);
   2825  5184  ek110237 
   2826  5184  ek110237 	/* Should we leave in cache? */
   2827  7736    Andrew 	if (attr = get_attr_bool(cmd, FSA_CACHED))
   2828  6212  aw148015 		fileset->fs_cached = attr->attr_avd;
   2829  7736    Andrew 	else
   2830  6212  aw148015 		fileset->fs_cached = avd_bool_alloc(FALSE);
   2831  5184  ek110237 
   2832  5673  aw148015 	/* Get the mean or absolute size of the file */
   2833  7736    Andrew 	if (attr = get_attr_integer(cmd, FSA_SIZE))
   2834  6212  aw148015 		fileset->fs_size = attr->attr_avd;
   2835  7736    Andrew 	else
   2836  6212  aw148015 		fileset->fs_size = avd_int_alloc(0);
   2837  5184  ek110237 
   2838  5673  aw148015 	return (fileset);
   2839  5673  aw148015 }
   2840  5673  aw148015 
   2841  5673  aw148015 /*
   2842  5673  aw148015  * Calls parser_fileset_define_common() to allocate a fileset with
   2843  7736    Andrew  * one entry and optionally the fileset_prealloc. sets the fileset_entries,
   2844  7736    Andrew  * fileset_dirwidth, fileset_dirgamma, and fileset_sizegamma attributes
   2845  5673  aw148015  * to appropriate values for emulating the old "fileobj" entity
   2846  5673  aw148015  */
   2847  5673  aw148015 static void
   2848  5673  aw148015 parser_file_define(cmd_t *cmd)
   2849  5673  aw148015 {
   2850  5673  aw148015 	fileset_t *fileset;
   2851  5673  aw148015 	attr_t *attr;
   2852  5673  aw148015 
   2853  5673  aw148015 	if ((fileset = parser_fileset_define_common(cmd)) == NULL) {
   2854  5673  aw148015 		filebench_log(LOG_ERROR,
   2855  5673  aw148015 		    "define file: failed to instantiate file");
   2856  5673  aw148015 		filebench_shutdown(1);
   2857  5673  aw148015 		return;
   2858  5673  aw148015 	}
   2859  5673  aw148015 
   2860  5673  aw148015 	/* fileset is emulating a single file */
   2861  5673  aw148015 	fileset->fs_attrs = FILESET_IS_FILE;
   2862  5673  aw148015 
   2863  5673  aw148015 	/* Set the size of the fileset to 1 */
   2864  6212  aw148015 	fileset->fs_entries = avd_int_alloc(1);
   2865  5673  aw148015 
   2866  5673  aw148015 	/* Set the mean dir width to more than 1 */
   2867  6212  aw148015 	fileset->fs_dirwidth = avd_int_alloc(10);
   2868  5673  aw148015 
   2869  5673  aw148015 	/* Set the dir and size gammas to 0 */
   2870  6212  aw148015 	fileset->fs_dirgamma = avd_int_alloc(0);
   2871  6212  aw148015 	fileset->fs_sizegamma = avd_int_alloc(0);
   2872  5673  aw148015 }
   2873  5673  aw148015 
   2874  5673  aw148015 /*
   2875  5673  aw148015  * Calls parser_fileset_define_common() to allocate a fileset with the
   2876  6212  aw148015  * supplied name and initializes the fileset's fileset_preallocpercent,
   2877  6212  aw148015  * fileset_prealloc, fileset_entries, fileset_dirwidth, fileset_dirgamma,
   2878  6212  aw148015  * and fileset_sizegamma attributes.
   2879  5673  aw148015  */
   2880  5673  aw148015 static void
   2881  5673  aw148015 parser_fileset_define(cmd_t *cmd)
   2882  5673  aw148015 {
   2883  5673  aw148015 	fileset_t *fileset;
   2884  5673  aw148015 	attr_t *attr;
   2885  5673  aw148015 
   2886  5673  aw148015 	if ((fileset = parser_fileset_define_common(cmd)) == NULL) {
   2887  5673  aw148015 		filebench_log(LOG_ERROR,
   2888  5673  aw148015 		    "define fileset: failed to instantiate fileset");
   2889  5673  aw148015 		filebench_shutdown(1);
   2890  5673  aw148015 		return;
   2891  5673  aw148015 	}
   2892  5673  aw148015 	/* Get the number of files in the fileset */
   2893  5184  ek110237 	if (attr = get_attr_integer(cmd, FSA_ENTRIES)) {
   2894  6212  aw148015 		fileset->fs_entries = attr->attr_avd;
   2895  5184  ek110237 	} else {
   2896  6212  aw148015 		fileset->fs_entries = avd_int_alloc(0);
   2897  7946    Andrew 	}
   2898  7946    Andrew 
   2899  7946    Andrew 	/* Get the number of leafdirs in the fileset */
   2900  7946    Andrew 	if (attr = get_attr_integer(cmd, FSA_LEAFDIRS)) {
   2901  7946    Andrew 		fileset->fs_leafdirs = attr->attr_avd;
   2902  7946    Andrew 	} else {
   2903  7946    Andrew 		fileset->fs_leafdirs = avd_int_alloc(0);
   2904  7946    Andrew 	}
   2905  7946    Andrew 
   2906  7946    Andrew 	if ((avd_get_int(fileset->fs_entries) == 0) &&
   2907  7946    Andrew 	    (avd_get_int(fileset->fs_leafdirs) == 0)) {
   2908  7946    Andrew 		filebench_log(LOG_ERROR, "Fileset has no files or leafdirs");
   2909  5184  ek110237 	}
   2910  5184  ek110237 
   2911  5184  ek110237 	/* Get the mean dir width of the fileset */
   2912  5184  ek110237 	if (attr = get_attr_integer(cmd, FSA_DIRWIDTH)) {
   2913  6212  aw148015 		fileset->fs_dirwidth = attr->attr_avd;
   2914  5184  ek110237 	} else {
   2915  5184  ek110237 		filebench_log(LOG_ERROR, "Fileset has zero directory width");
   2916  6212  aw148015 		fileset->fs_dirwidth = avd_int_alloc(0);
   2917  5184  ek110237 	}
   2918  5184  ek110237 
   2919  6212  aw148015 	/* Get the random variable for dir depth, if supplied */
   2920  6212  aw148015 	if (attr = get_attr_integer(cmd, FSA_DIRDEPTHRV)) {
   2921  6212  aw148015 		if (!AVD_IS_RANDOM(attr->attr_avd)) {
   2922  6212  aw148015 			filebench_log(LOG_ERROR,
   2923  6212  aw148015 			    "Define fileset: dirdepthrv must be random var");
   2924  6212  aw148015 			filebench_shutdown(1);
   2925  6212  aw148015 		}
   2926  6212  aw148015 		fileset->fs_dirdepthrv = attr->attr_avd;
   2927  6212  aw148015 	} else {
   2928  6212  aw148015 		fileset->fs_dirdepthrv = NULL;
   2929  6212  aw148015 	}
   2930  6212  aw148015 
   2931  6212  aw148015 	/* Get the gamma value for dir depth distributions */
   2932  5184  ek110237 	if (attr = get_attr_integer(cmd, FSA_DIRGAMMA)) {
   2933  6212  aw148015 		if (AVD_IS_RANDOM(attr->attr_avd)) {
   2934  6212  aw148015 			filebench_log(LOG_ERROR,
   2935  6212  aw148015 			    "Define fileset: dirgamma attr cannot be random");
   2936  6212  aw148015 			filebench_shutdown(1);
   2937  6212  aw148015 		}
   2938  6212  aw148015 		fileset->fs_dirgamma = attr->attr_avd;
   2939  5184  ek110237 	} else
   2940  6212  aw148015 		fileset->fs_dirgamma = avd_int_alloc(1500);
   2941  5184  ek110237 
   2942  5184  ek110237 	/* Get the gamma value for dir width distributions */
   2943  5184  ek110237 	if (attr = get_attr_integer(cmd, FSA_FILESIZEGAMMA)) {
   2944  6212  aw148015 		if (AVD_IS_RANDOM(attr->attr_avd)) {
   2945  6212  aw148015 			filebench_log(LOG_ERROR,
   2946  6212  aw148015 			    "Define fileset: filesizegamma cannot be random");
   2947  6212  aw148015 			filebench_shutdown(1);
   2948  6212  aw148015 		}
   2949  6212  aw148015 		fileset->fs_sizegamma = attr->attr_avd;
   2950  5184  ek110237 	} else
   2951  6212  aw148015 		fileset->fs_sizegamma = avd_int_alloc(1500);
   2952  5184  ek110237 }
   2953  5184  ek110237 
   2954  5184  ek110237 /*
   2955  5184  ek110237  * Creates and starts all defined procflow processes. The call to
   2956  5184  ek110237  * procflow_init() results in creation of the requested number of
   2957  5184  ek110237  * process instances for each previously defined procflow. The
   2958  5184  ek110237  * child processes exec() a new instance of filebench, passing it
   2959  5184  ek110237  * the instance number and address of the shared memory region.
   2960  5184  ek110237  * The child processes will then create their threads and flowops.
   2961  5184  ek110237  * The routine then unlocks the run_lock to allow all the processes'
   2962  5184  ek110237  * threads to start and  waits for all of them to begin execution.
   2963  5184  ek110237  * Finally, it records the start time and resets the event generation
   2964  5184  ek110237  * system.
   2965  5184  ek110237  */
   2966  5184  ek110237 static void
   2967  5184  ek110237 parser_proc_create(cmd_t *cmd)
   2968  5184  ek110237 {
   2969  6084  aw148015 	filebench_shm->shm_1st_err = 0;
   2970  9326    Andrew 	filebench_shm->shm_f_abort = FILEBENCH_OK;
   2971  9326    Andrew 
   2972  5184  ek110237 	if (procflow_init() != 0) {
   2973  5184  ek110237 		filebench_log(LOG_ERROR, "Failed to create processes\n");
   2974  5184  ek110237 		filebench_shutdown(1);
   2975  5184  ek110237 	}
   2976  5184  ek110237 
   2977  5184  ek110237 	/* Release the read lock, allowing threads to start */
   2978  6391  aw148015 	(void) pthread_rwlock_unlock(&filebench_shm->shm_run_lock);
   2979  5184  ek110237 
   2980  5184  ek110237 	/* Wait for all threads to start */
   2981  5184  ek110237 	if (procflow_allstarted() != 0) {
   2982  5184  ek110237 		filebench_log(LOG_ERROR, "Could not start run");
   2983  5184  ek110237 		return;
   2984  5184  ek110237 	}
   2985  5184  ek110237 
   2986  5184  ek110237 
   2987  5184  ek110237 	if (filebench_shm->shm_required &&
   2988  5184  ek110237 	    (ipc_ismcreate(filebench_shm->shm_required) < 0)) {
   2989  5184  ek110237 		filebench_log(LOG_ERROR, "Could not allocate shared memory");
   2990  5184  ek110237 		return;
   2991  5184  ek110237 	}
   2992  5184  ek110237 
   2993  6305  aw148015 	filebench_shm->shm_starttime = gethrtime();
   2994  5184  ek110237 	eventgen_reset();
   2995  5184  ek110237 }
   2996  5184  ek110237 
   2997  5184  ek110237 /*
   2998  5673  aw148015  * Calls fileset_createset() to populate all files and filesets and
   2999  5673  aw148015  * create all associated, initially existant,  files and subdirectories.
   3000  5184  ek110237  * If errors are encountered, calls filebench_shutdown()
   3001  5184  ek110237  * to exit filebench.
   3002  5184  ek110237  */
   3003  5184  ek110237 static void
   3004  5184  ek110237 parser_fileset_create(cmd_t *cmd)
   3005  5184  ek110237 {
   3006  5673  aw148015 	if (!filecreate_done) {
   3007  5673  aw148015 		filecreate_done = 1;
   3008  6212  aw148015 
   3009  6212  aw148015 		/* initialize the random number system first */
   3010  6212  aw148015 		randdist_init();
   3011  6212  aw148015 
   3012  6212  aw148015 		/* create all the filesets */
   3013  5673  aw148015 		if (fileset_createset(NULL) != 0) {
   3014  5673  aw148015 			filebench_log(LOG_ERROR, "Failed to create filesets");
   3015  5673  aw148015 			filebench_shutdown(1);
   3016  5673  aw148015 		}
   3017  5673  aw148015 	} else {
   3018  5673  aw148015 		filebench_log(LOG_INFO,
   3019  5673  aw148015 		    "Attempting to create fileset more than once, ignoring");
   3020  5673  aw148015 	}
   3021  5184  ek110237 
   3022  5184  ek110237 }
   3023  5184  ek110237 
   3024  5184  ek110237 /*
   3025  9356    Andrew  * Deletes the files and directories that represent files and filesets on the
   3026  9356    Andrew  * storage medium.
   3027  9356    Andrew  */
   3028  9356    Andrew static void
   3029  9356    Andrew parser_fileset_shutdown(cmd_t *cmd)
   3030  9356    Andrew {
   3031  9356    Andrew 	filebench_log(LOG_INFO, "Shutting down filesets");
   3032  9356    Andrew 	fileset_delete_all_filesets();
   3033  9356    Andrew }
   3034  9356    Andrew 
   3035  9356    Andrew /*
   3036  5184  ek110237  * Shuts down all processes and their associated threads. When finished
   3037  5184  ek110237  * it deletes interprocess shared memory and resets the event generator.
   3038  5184  ek110237  * It does not exit the filebench program though.
   3039  5184  ek110237  */
   3040  5184  ek110237 static void
   3041  5184  ek110237 parser_proc_shutdown(cmd_t *cmd)
   3042  5184  ek110237 {
   3043  5184  ek110237 	filebench_log(LOG_INFO, "Shutting down processes");
   3044  5673  aw148015 	filecreate_done = 0;
   3045  5184  ek110237 	procflow_shutdown();
   3046  5184