[EMAIL PROTECTED] wrote on Mon, 29 May 2006 10:33 -0400:
> Pete Wyckoff wrote:
>
> >Another possible way to fix this is by using named initializers,
> >like
> >
> > static union PINT_state_array_values ST_setup_msgpairs[] = {
> > { .state_name = "setup_msgpairs" },
> > { .parent_machine = &pvfs2_client_small_io_sm },
> > { .flag = SM_NONE },
> > ...
> >
> >which would be just dandy, but not all compilers have caught up with
> >this nice C99-ism. I didn't want to exclude old compilers, or
> >support two versions and add a configure check, so rejected this
> >idea.
> >
>
> I wondered when this became legal -- I love it! It is already being
> used in the distribution code (that is where I learned about it), so I
> guess it is okay to begin using everywhere.
Right you are, I had totally forgotten about that usage. Thus it
seems we have implicitly decided that this feature in a compiler is
mandatory. I think that rules out ancient things like gcc 2.95 and
some vendor compilers, but that's fine by me.
This new version has my vote:
struct PINT_state_machine_s pvfs2_client_small_io_sm = {
.name = "pvfs2_client_small_io_sm",
.state_machine = ST_setup_msgpairs
};
static union PINT_state_array_values ST_setup_msgpairs[] = {
{ .state_name = "setup_msgpairs" },
{ .parent_machine = &pvfs2_client_small_io_sm },
{ .flag = SM_NONE },
{ .state_action = small_io_setup_msgpairs },
{ .return_value = 0 },
{ .next_state = ST_xfer_msgpairs },
{ .return_value = -1 },
{ .flag = SM_RETURN }
};
Thanks for pointing this out Brad. I'll commit it in a day or so
unless there are any strong objections. Diff attached.
-- Pete
Index: src/common/misc/state-machine-fns.h
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/common/misc/state-machine-fns.h,v
retrieving revision 1.18
diff -u -p -r1.18 state-machine-fns.h
--- src/common/misc/state-machine-fns.h 14 Dec 2005 21:50:19 -0000 1.18
+++ src/common/misc/state-machine-fns.h 29 May 2006 15:16:30 -0000
@@ -78,8 +78,8 @@ static inline int PINT_state_machine_nex
int code_val = r->error_code; /* temp to hold the return code */
int retval; /* temp to hold return value of state action */
union PINT_state_array_values *loc; /* temp pointer into state memory */
- char * state_name;
- char * machine_name;
+ const char * state_name;
+ const char * machine_name;
do {
/* skip over the current state action to get to the return code list */
@@ -135,10 +135,7 @@ static inline int PINT_state_machine_nex
s->current_state += 1; /* skip state flag; now we point to the state
* machine */
- /* NOTE: nested_machine is defined as a void * to eliminate a nasty
- * cross-structure dependency that I couldn't handle any more. -- Rob
- */
- s->current_state = ((struct PINT_state_machine_s *)
s->current_state->nested_machine)->state_machine;
+ s->current_state = s->current_state->nested_machine->state_machine;
s->current_state += 2;
}
@@ -170,8 +167,8 @@ static inline int PINT_state_machine_inv
struct PINT_OP_STATE *s, job_status_s *r)
{
int retval;
- char * state_name;
- char * machine_name;
+ const char * state_name;
+ const char * machine_name;
state_name = PINT_state_machine_current_state_name(s);
machine_name = PINT_state_machine_current_machine_name(s);
Index: src/common/misc/state-machine.h
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/common/misc/state-machine.h,v
retrieving revision 1.11
diff -u -p -r1.11 state-machine.h
--- src/common/misc/state-machine.h 14 Dec 2005 21:50:19 -0000 1.11
+++ src/common/misc/state-machine.h 29 May 2006 15:16:30 -0000
@@ -45,19 +45,19 @@
union PINT_state_array_values
{
- char *state_name;
+ const char *state_name;
struct PINT_state_machine_s *parent_machine;
int (*state_action)(struct PINT_OP_STATE *, job_status_s *);
int return_value;
int flag;
- struct PINT_state_machine_s *nested_machine; /* NOTE: this is really a
PINT_state_machine * (void *)*/
+ struct PINT_state_machine_s *nested_machine;
union PINT_state_array_values *next_state;
};
struct PINT_state_machine_s
{
+ const char *name;
union PINT_state_array_values *state_machine;
- char *name;
};
enum {
Index: src/common/statecomp/codegen.c
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/common/statecomp/codegen.c,v
retrieving revision 1.19
diff -u -p -r1.19 codegen.c
--- src/common/statecomp/codegen.c 14 Dec 2005 21:50:20 -0000 1.19
+++ src/common/statecomp/codegen.c 29 May 2006 15:16:30 -0000
@@ -17,7 +17,7 @@
extern FILE *out_file;
extern int terminate_path_flag;
-static char * current_machine;
+static char *current_machine;
void gen_init(void);
void gen_state_decl(char *state_name);
@@ -35,24 +35,26 @@ void gen_init(void)
void gen_state_decl(char *state_name)
{
- fprintf(out_file,"static union PINT_state_array_values ST_%s[];\n",
state_name);
+ fprintf(out_file, "static union PINT_state_array_values ST_%s[];\n",
+ state_name);
}
void gen_machine(char *machine_name,
char *first_state_name)
{
current_machine = machine_name;
- fprintf(out_file, "\nstruct PINT_state_machine_s %s =\n{\n\t",
machine_name);
- fprintf(out_file, "ST_%s,\n\t\"%s\"\n", first_state_name, machine_name);
- fprintf(out_file, "};\n");
+ fprintf(out_file, "\nstruct PINT_state_machine_s %s = {\n", machine_name);
+ fprintf(out_file, "\t.name = \"%s\",\n", machine_name);
+ fprintf(out_file, "\t.state_machine = ST_%s\n", first_state_name);
+ fprintf(out_file, "};\n\n");
}
void gen_state_start(char *state_name)
{
fprintf(out_file,
"static union PINT_state_array_values ST_%s[] = {\n"
- "(union PINT_state_array_values) \"%s\",\n"
- "(union PINT_state_array_values) &%s,\n",
+ "\t{ .state_name = \"%s\" },\n"
+ "\t{ .parent_machine = &%s },\n",
state_name, state_name, current_machine);
}
@@ -65,20 +67,12 @@ void gen_state_action(char *run_func, in
{
switch (flag) {
case SM_NONE:
- fprintf(out_file,
- "(union PINT_state_array_values) %d",
- flag);
- fprintf(out_file,
- ",\n(union PINT_state_array_values) %s",
- run_func);
+ fprintf(out_file, "\t{ .flag = SM_NONE },\n");
+ fprintf(out_file, "\t{ .state_action = %s }", run_func);
break;
case SM_JUMP:
- fprintf(out_file,
- "(union PINT_state_array_values) %d",
- flag);
- fprintf(out_file,
- ",\n(union PINT_state_array_values) &%s",
- run_func);
+ fprintf(out_file, "\t{ .flag = SM_JUMP },\n");
+ fprintf(out_file, "\t{ .nested_machine = &%s }", run_func);
break;
default:
fprintf(stderr,
@@ -90,30 +84,22 @@ void gen_state_action(char *run_func, in
void gen_return_code(char *return_code)
{
- fprintf(out_file,
- ",\n(union PINT_state_array_values) %s",
- return_code);
+ fprintf(out_file, ",\n\t{ .return_value = %s }", return_code);
}
void gen_next_state(int flag, char *new_state)
{
switch (flag) {
case SM_NEXT:
- fprintf(out_file,
- ",\n(union PINT_state_array_values) ST_%s",
- new_state);
+ fprintf(out_file, ",\n\t{ .next_state = ST_%s }", new_state);
break;
case SM_RETURN:
terminate_path_flag = 1;
- fprintf(out_file,
- ",\n(union PINT_state_array_values) %d",
- flag);
+ fprintf(out_file, ",\n\t{ .flag = SM_RETURN }");
break;
case SM_TERMINATE:
terminate_path_flag = 1;
- fprintf(out_file,
- ",\n(union PINT_state_array_values) %d",
- flag);
+ fprintf(out_file, ",\n\t{ .flag = SM_TERMINATE }");
break;
default:
fprintf(stderr,
_______________________________________________
Pvfs2-developers mailing list
[email protected]
http://www.beowulf-underground.org/mailman/listinfo/pvfs2-developers