int PackageIndex = -1;
int PerProcCounter = 0;
int Multi_Init = 0;
+int StatIndex = -1;
/*
* Character arrays to keep list of function names as we process the file
/* static prototypes */
static void isdefined(definition * defp);
static void def_struct(definition * defp);
-static void def_program(definition * defp);
static void def_enum(definition * defp);
static void def_const(definition * defp);
static void def_union(definition * defp);
static void cs_ProcSendPacket_setup(definition * defp, int split_flag);
static void cs_ProcUnmarshallOutParams_setup(definition * defp);
static void cs_ProcTail_setup(definition * defp, int split_flag);
+static void ucs_ProcCallback_setup(definition * defp, char *cbheader);
static void ucs_ProcName_setup(definition * defp, char *procheader,
int split_flag);
static void ucs_ProcParams_setup(definition * defp, int split_flag);
-static void ucs_ProcTail_setup(definition * defp, int split_flag);
+static void ucs_ProcTail_setup(definition * defp, char *cbheader,
+ int split_flag);
static void ss_Proc_CodeGeneration(definition * defp);
static void ss_ProcName_setup(definition * defp);
-static void ss_ProcParams_setup(definition * defp, int *somefrees);
-static void ss_ProcSpecial_setup(definition * defp, int *somefrees);
+static void ss_ProcParams_setup(definition * defp);
+static void ss_ProcSpecial_setup(definition * defp);
static void ss_ProcUnmarshallInParams_setup(definition * defp);
static void ss_ProcCallRealProc_setup(definition * defp);
static void ss_ProcMarshallOutParams_setup(definition * defp);
-static void ss_ProcTail_setup(definition * defp, int somefrees);
+static void ss_ProcTail_setup(definition * defp);
static int opcode_holes_exist(void);
static void er_ProcDeclExterns_setup(void);
static void er_ProcProcsArray_setup(void);
static void er_ProcMainBody_setup(void);
static void er_HeadofOldStyleProc_setup(void);
+static void er_HeadofOldStyleProc_setup2(void);
static void er_BodyofOldStyleProc_setup(void);
+static void er_BodyofOldStyleProc_setup2(void);
static void proc_er_case(definition * defp);
static void er_TailofOldStyleProc_setup(void);
+static void er_TailofOldStyleProc_setup2(void);
case TOK_ENUM:
def_enum(defp);
break;
- case TOK_PROGRAM:
- def_program(defp);
- break;
case TOK_CONST:
def_const(defp);
break;
case TOK_EOF:
- return (NULL);
+ free(defp);
+ return NULL;
case TOK_PACKAGE:
def_package(defp);
break;
}
static void
-def_program(definition * defp)
-{
- token tok;
- version_list *vlist;
- version_list **vtailp;
- proc_list *plist;
- proc_list **ptailp;
-
- defp->def_kind = DEF_PROGRAM;
- scan(TOK_IDENT, &tok);
- defp->def_name = tok.str;
- scan(TOK_LBRACE, &tok);
- vtailp = &defp->def.pr.versions;
- scan(TOK_VERSION, &tok);
- do {
- scan(TOK_IDENT, &tok);
- vlist = ALLOC(version_list);
- vlist->vers_name = tok.str;
- scan(TOK_LBRACE, &tok);
- ptailp = &vlist->procs;
- do {
- plist = ALLOC(proc_list);
- get_type(&plist->res_prefix, &plist->res_type, DEF_PROGRAM);
- if (streq(plist->res_type, "opaque")) {
- error("illegal result type");
- }
- scan(TOK_IDENT, &tok);
- plist->proc_name = tok.str;
- scan(TOK_LPAREN, &tok);
- get_type(&plist->arg_prefix, &plist->arg_type, DEF_PROGRAM);
- if (streq(plist->arg_type, "opaque")) {
- error("illegal argument type");
- }
- scan(TOK_RPAREN, &tok);
- scan(TOK_EQUAL, &tok);
- scan_num(&tok);
- scan(TOK_SEMICOLON, &tok);
- plist->proc_num = tok.str;
- *ptailp = plist;
- ptailp = &plist->next;
- peek(&tok);
- } while (tok.kind != TOK_RBRACE);
- *vtailp = vlist;
- vtailp = &vlist->next;
- scan(TOK_RBRACE, &tok);
- scan(TOK_EQUAL, &tok);
- scan_num(&tok);
- vlist->vers_num = tok.str;
- scan(TOK_SEMICOLON, &tok);
- scan2(TOK_VERSION, TOK_RBRACE, &tok);
- } while (tok.kind == TOK_VERSION);
- scan(TOK_EQUAL, &tok);
- scan_num(&tok);
- defp->def.pr.prog_num = tok.str;
- *vtailp = NULL;
-}
-
-static void
def_enum(definition * defp)
{
token tok;
{
declaration dec;
+ memset(&dec, 0, sizeof(dec));
+
defp->def_kind = DEF_TYPEDEF;
get_declaration(&dec, DEF_TYPEDEF);
defp->def_name = dec.name;
}
dec->rel = REL_ARRAY;
if (peekscan(TOK_RANGLE, &tok)) {
- dec->array_max = "~0"; /* unspecified size, use max */
+ if ((dkind == DEF_INPARAM) || (dkind == DEF_INOUTPARAM)) {
+ error("input arrays must specify a max size");
+ }
+ dec->array_max = "~0u"; /* unspecified size, use max */
} else {
scan_num(&tok);
dec->array_max = tok.str;
(void)peekscan(TOK_INT, &tok);
break;
case TOK_VOID:
- if (dkind != DEF_UNION && dkind != DEF_PROGRAM) {
- error("voids allowed only inside union and program definitions");
+ if (dkind != DEF_UNION) {
+ error("voids allowed only inside union definitions");
}
*typep = tok.str;
break;
scan(TOK_IDENT, &tok);
defp->def_name = tok.str;
no_of_stat_funcs = 0;
- if (PackageIndex++ >= MAX_PACKAGES)
+
+ PackageIndex++;
+ if (PackageIndex >= MAX_PACKAGES)
error("Exceeded upper limit of package statements\n");
+
function_list_index = 0;
PackagePrefix[PackageIndex] = tok.str;
if (MasterPrefix == NULL)
defp->def_name = name;
defp->def.co = tok.str;
PackageStatIndex[PackageIndex] = name;
+ StatIndex = atoi(tok.str);
}
static void
prefix, PackagePrefix[PackageIndex], defp->pc.proc_name);
function_list_index++;
+ defp->statindex = no_of_stat_funcs;
no_of_stat_funcs_header[PackageIndex]++;
no_of_stat_funcs++;
*Proc_listp = NULL;
Proc_listp = &Proc_list->next;
decls = ALLOC(decl_list);
memset(decls, 0, sizeof(decl_list));
- if (tokp->kind != TOK_RPAREN)
- decls->decl = dec;
+ if (tokp->kind != TOK_RPAREN)
+ decls->decl = dec;
*tailp = decls;
tailp = &decls->next;
} while (tokp->kind != TOK_RPAREN);
if (Sflag || cflag)
ss_Proc_CodeGeneration(defp);
}
- if (Sflag || (cflag && xflag && !proc_split_flag))
+ if (Sflag || (cflag && xflag && !proc_split_flag) || hflag)
STOREVAL(&proc_defined[PackageIndex], defp);
}
Proc_list->component_kind = DEF_PARAM;
Proc_list->code = alloc(250);
Proc_list->scode = alloc(250);
- get_declaration(dec, DEF_PARAM);
+ get_declaration(dec, par_kind);
Proc_list->pl.param_name = dec->name;
get1_param_type(defp, dec, &Proc_list->pl.param_type);
print_param(dec);
}
if (!kflag && !split_flag && uflag) {
+ if (!cflag) {
+ ucs_ProcCallback_setup(defp, "ubik_call_");
+ }
ucs_ProcName_setup(defp, "ubik_", split_flag);
if (!cflag) {
ucs_ProcParams_setup(defp, split_flag);
- ucs_ProcTail_setup(defp, split_flag);
+ ucs_ProcTail_setup(defp, "ubik_call_", split_flag);
}
}
}
if (!cflag) {
for (plist = defp->pc.plists; plist; plist = plist->next) {
if (plist->component_kind == DEF_PARAM) {
+ f_print(fout, ",");
if (ansic_flag) {
+ if (plist->pl.param_kind == DEF_INPARAM &&
+ strcmp(plist->pl.param_type, "char *") == 0) {
+ f_print(fout, "const ");
+ }
if (plist->pl.param_flag & OUT_STRING) {
- f_print(fout, ",%s *%s", plist->pl.param_type,
+ f_print(fout, "%s *%s", plist->pl.param_type,
plist->pl.param_name);
} else {
- f_print(fout, ",%s %s", plist->pl.param_type,
+ f_print(fout, "%s %s", plist->pl.param_type,
plist->pl.param_name);
}
} else {
- f_print(fout, ", %s", plist->pl.param_name);
+ f_print(fout, " %s", plist->pl.param_name);
plist->pl.param_flag &= ~PROCESSED_PARAM;
}
}
if (!(split_flag > 1) || (noofallparams != 0)) {
f_print(fout, "\tXDR z_xdrs;\n");
}
- /*
- * Print out client side stat gathering call
- */
- if (xflag && split_flag != 1) {
- f_print(fout, "\tstruct clock __QUEUE, __EXEC;\n");
- }
if ((!split_flag) || (split_flag == 1)) {
f_print(fout, "\txdrrx_create(&z_xdrs, z_call, XDR_ENCODE);\n");
}
if (xflag && split_flag != 1) {
f_print(fout, "\tif (rx_enable_stats) {\n");
- f_print(fout, "\t clock_GetTime(&__EXEC);\n");
- f_print(fout, "\t clock_Sub(&__EXEC, &z_call->startTime);\n");
- f_print(fout, "\t __QUEUE = z_call->startTime;\n");
- f_print(fout, "\t clock_Sub(&__QUEUE, &z_call->queueTime);\n");
if (PackageStatIndex[PackageIndex]) {
- if (!split_flag) {
- f_print(fout,
- "\t rx_IncrementTimeAndCount(z_conn->peer, %s,\n",
- PackageStatIndex[PackageIndex]);
- } else {
- f_print(fout,
- "\t rx_IncrementTimeAndCount(z_call->conn->peer, %s,\n",
- PackageStatIndex[PackageIndex]);
- }
+ f_print(fout,
+ "\t rx_RecordCallStatistics(z_call, %s,\n",
+ PackageStatIndex[PackageIndex]);
} else {
- if (!split_flag) {
- f_print(fout,
- "\t rx_IncrementTimeAndCount(z_conn->peer,\n"
- "\t\t(((afs_uint32)(ntohs(z_conn->serviceId) << 16)) \n"
- "\t\t| ((afs_uint32)ntohs(z_conn->peer->port))),\n");
- } else {
- f_print(fout,
- "\t rx_IncrementTimeAndCount(z_call->conn->peer,\n"
- "\t\t(((afs_uint32)(ntohs(z_call->conn->serviceId) << 16)) |\n"
- "\t\t((afs_uint32)ntohs(z_call->conn->peer->port))),\n");
- }
- }
- if (xflag) {
- f_print(fout, "\t\t%d, %sNO_OF_STAT_FUNCS, &__QUEUE, &__EXEC,\n",
- no_of_stat_funcs, PackagePrefix[PackageIndex]);
f_print(fout,
- "\t\t&z_call->bytesSent, &z_call->bytesRcvd, 1);\n");
+ "\t rx_RecordCallStatistics(z_call, \n"
+ "\t\t(((afs_uint32)(ntohs(rx_ServiceIdOf(rx_ConnectionOf(z_call))) << 16)) |\n"
+ "\t\t((afs_uint32)ntohs(rx_PortOf(rx_PeerOf(rx_ConnectionOf(z_call)))))),\n");
}
+ f_print(fout, "\t\t%d, %sNO_OF_STAT_FUNCS, 1);\n",
+ no_of_stat_funcs, PackagePrefix[PackageIndex]);
f_print(fout, "\t}\n\n");
}
f_print(fout, "\treturn z_result;\n}\n\n");
static void
ss_Proc_CodeGeneration(definition * defp)
{
- int somefrees = 0;
+ extern char zflag;
- defp->can_fail = 0;
+ if (zflag)
+ defp->can_fail = 0;
+ else
+ defp->can_fail = 1;
ss_ProcName_setup(defp);
if (!cflag) {
- ss_ProcParams_setup(defp, &somefrees);
- ss_ProcSpecial_setup(defp, &somefrees);
+ ss_ProcParams_setup(defp);
+ ss_ProcSpecial_setup(defp);
ss_ProcUnmarshallInParams_setup(defp);
ss_ProcCallRealProc_setup(defp);
ss_ProcMarshallOutParams_setup(defp);
- ss_ProcTail_setup(defp, somefrees);
+ ss_ProcTail_setup(defp);
}
}
PackagePrefix[PackageIndex], defp->pc.proc_name);
f_print(fout, "struct rx_call *z_call, XDR *z_xdrs)\n{\n");
f_print(fout, "\t" "afs_int32 z_result;\n");
- if (xflag) {
- f_print(fout, "\tstruct clock __QUEUE, __EXEC;\n");
- }
for (plist = defp->pc.plists; plist; plist = plist->next)
if (plist->component_kind == DEF_PARAM) {
static void
-ss_ProcParams_setup(definition * defp, int *somefrees)
+ss_ProcParams_setup(definition * defp)
{
proc1_list *plist, *plist1;
list *listp;
}
f_print(fout, "\t%s %s", plist->pl.param_type,
plist->pl.param_name);
- *pntr = pres;
+ if (pntr)
+ *pntr = pres;
} else if (strchr(plist->pl.param_type, '*') == 0) {
f_print(fout, "\t%s %s", plist->pl.param_type,
plist->pl.param_name);
} else {
plist->pl.param_flag |= FREETHIS_PARAM;
- *somefrees = 1;
f_print(fout, "\t%s %s=(%s)0", plist->pl.param_type,
plist->pl.param_name, plist->pl.param_type);
}
f_print(fout, ", %s", plist1->pl.param_name);
} else {
plist1->pl.param_flag |= FREETHIS_PARAM;
- *somefrees = 1;
f_print(fout, ", *%s=(%s)0", plist1->pl.param_name,
plist1->pl.param_type);
}
static void
-ss_ProcSpecial_setup(definition * defp, int *somefrees)
+ss_ProcSpecial_setup(definition * defp)
{
proc1_list *plist;
definition *defp1;
if (streq(string, structname(plist->pl.param_type))) {
plist->pl.string_name = spec->sdef.string_name;
plist->pl.param_flag |= FREETHIS_PARAM;
- *somefrees = 1;
- fprintf(fout, "\n\t%s.%s = 0;", plist->pl.param_name,
- spec->sdef.string_name);
}
}
}
}
- if (!*somefrees)
- fprintf(fout, "\n");
for (listp = typedef_defined; listp != NULL; listp = listp->next) {
defp1 = (definition *) listp->val;
for (plist = defp->pc.plists; plist; plist = plist->next) {
if (plist->component_kind == DEF_PARAM) {
if (streq(defp1->def_name, structname(plist->pl.param_type))) {
plist->pl.param_flag |= FREETHIS_PARAM;
- *somefrees = 1;
switch (defp1->pc.rel) {
case REL_ARRAY:
plist->pl.string_name = alloc(40);
if (brief_flag) {
- f_print(fout, "\n\t%s.val = 0;",
- plist->pl.param_name);
- f_print(fout, "\n\t%s.len = 0;",
- plist->pl.param_name);
s_print(plist->pl.string_name, "val");
} else {
- f_print(fout, "\n\t%s.%s_val = 0;",
- plist->pl.param_name, defp1->def_name);
- f_print(fout, "\n\t%s.%s_len = 0;",
- plist->pl.param_name, defp1->def_name);
s_print(plist->pl.string_name, "%s_val",
defp1->def_name);
}
break;
case REL_POINTER:
- f_print(fout, "\n\t%s = 0;", plist->pl.param_name);
plist->pl.string_name = NULL;
break;
default:
if (plist->component_kind == DEF_PARAM) {
if (streq(defp1->def_name, structname(plist->pl.param_type))) {
plist->pl.param_flag |= FREETHIS_PARAM;
- *somefrees = 1;
- fprintf(fout, "\n\tmemset(&%s, 0, sizeof(%s));",
- plist->pl.param_name, defp1->def_name);
}
}
}
}
+ for (plist = defp->pc.plists; plist; plist = plist->next) {
+ if (plist->component_kind == DEF_PARAM) {
+ fprintf(fout, "\n\tmemset(&%s, 0, sizeof(%s));",
+ plist->pl.param_name,
+ plist->pl.param_name);
+ }
+ }
+
f_print(fout, "\n");
}
f_print(fout, ");\n");
if (zflag) {
f_print(fout, "\tif (z_result)\n\t\treturn z_result;\n");
+ } else {
+ f_print(fout, "\tif (z_result)\n\t\tgoto fail;\n");
}
}
}
}
+static void
+ss_ProcTail_frees(char *xdrfunc, int *somefrees) {
+ if (!*somefrees) {
+ f_print(fout, "\tz_xdrs->x_op = XDR_FREE;\n");
+ f_print(fout, "\tif ((!%s)", xdrfunc);
+ *somefrees = 1;
+ } else {
+ f_print(fout, "\n\t || (!%s)", xdrfunc);
+ }
+}
+
static void
-ss_ProcTail_setup(definition * defp, int somefrees)
+ss_ProcTail_setup(definition * defp)
{
proc1_list *plist;
definition *defp1;
list *listp;
- int firsttime = 0;
+ int somefrees = 0;
if (defp->can_fail) {
f_print(fout, "fail:\n");
}
- for (plist = defp->pc.plists; plist; plist = plist->next) {
- if (plist->component_kind == DEF_PARAM
- && (plist->pl.param_flag & FREETHIS_PARAM))
- somefrees = 1;
- }
- if (somefrees)
- f_print(fout, "\tz_xdrs->x_op = XDR_FREE;\n");
+
for (plist = defp->pc.plists; plist; plist = plist->next) {
if (plist->component_kind == DEF_PARAM
&& (plist->pl.param_flag & FREETHIS_PARAM))
- f_print(fout, "\tif (!%s) goto fail1;\n", plist->scode);
+ ss_ProcTail_frees(plist->scode, &somefrees);
}
+
for (listp = typedef_defined; listp != NULL; listp = listp->next) {
defp1 = (definition *) listp->val;
for (plist = defp->pc.plists; plist; plist = plist->next) {
switch (defp1->pc.rel) {
case REL_ARRAY:
case REL_POINTER:
- if (!somefrees && !firsttime) {
- firsttime = 1;
- f_print(fout, "\tz_xdrs->x_op = XDR_FREE;\n");
- }
- somefrees = 1;
- f_print(fout, "\tif (!%s) goto fail1;\n",
- plist->scode);
+ ss_ProcTail_frees(plist->scode, &somefrees);
break;
default:
break;
}
}
}
+
for (listp = uniondef_defined; listp != NULL; listp = listp->next) {
defp1 = (definition *) listp->val;
for (plist = defp->pc.plists; plist; plist = plist->next) {
&& !(plist->pl.param_flag & FREETHIS_PARAM)) {
if (streq(defp1->def_name, structname(plist->pl.param_type))) {
if (plist->pl.param_flag & INDIRECT_PARAM) {
- if (!somefrees && !firsttime) {
- firsttime = 1;
- f_print(fout, "\tz_xdrs->x_op = XDR_FREE;\n");
- }
- somefrees = 1;
- f_print(fout, "\tif (!%s) goto fail1;\n",
- plist->scode);
+ ss_ProcTail_frees(plist->scode, &somefrees);
}
}
}
}
}
+ if (somefrees) {
+ f_print(fout, ")\n");
+ f_print(fout, "\t\tz_result = RXGEN_SS_XDRFREE;\n\n");
+ }
+
if (xflag) {
f_print(fout, "\tif (rx_enable_stats) {\n");
- f_print(fout, "\t clock_GetTime(&__EXEC);\n");
- f_print(fout, "\t clock_Sub(&__EXEC, &z_call->startTime);\n");
- f_print(fout, "\t __QUEUE = z_call->startTime;\n");
- f_print(fout, "\t clock_Sub(&__QUEUE, &z_call->queueTime);\n");
- f_print(fout, "\t rx_IncrementTimeAndCount(z_call->conn->peer,");
+ f_print(fout, "\t rx_RecordCallStatistics(z_call,");
if (PackageStatIndex[PackageIndex]) {
f_print(fout, " %s,\n", PackageStatIndex[PackageIndex]);
} else {
f_print(fout,
- "\n\t\t(((afs_uint32)(ntohs(z_call->conn->serviceId) << 16)) |\n"
- "\t\t((afs_uint32)ntohs(z_call->conn->service->servicePort))),\n");
+ "\n\t\t(((afs_uint32)(ntohs(rx_ServiceIdOf(rx_ConnectionOf(z_call))) << 16)) |\n"
+ "\t\t((afs_uint32)ntohs(rx_ServiceOf(rx_ConnectionOf(z_call))->servicePort))),\n");
}
- f_print(fout, "\t\t%d, %sNO_OF_STAT_FUNCS, &__QUEUE, &__EXEC,\n",
+ f_print(fout, "\t\t%d, %sNO_OF_STAT_FUNCS, 0);\n",
no_of_stat_funcs, PackagePrefix[PackageIndex]);
- f_print(fout, "\t\t&z_call->bytesSent, &z_call->bytesRcvd, 0);\n");
f_print(fout, "\t}\n\n");
}
f_print(fout, "\treturn z_result;\n");
- if (somefrees) {
- f_print(fout, "fail1:\n");
-
- if (xflag) {
- f_print(fout, "\tif (rx_enable_stats) {\n");
- f_print(fout, "\t clock_GetTime(&__EXEC);\n");
- f_print(fout, "\t clock_Sub(&__EXEC, &z_call->startTime);\n");
- f_print(fout, "\t __QUEUE = z_call->startTime;\n");
- f_print(fout, "\t clock_Sub(&__QUEUE, &z_call->queueTime);\n");
- f_print(fout,
- "\t rx_IncrementTimeAndCount(z_call->conn->peer,");
- if (PackageStatIndex[PackageIndex]) {
- f_print(fout, " %s,\n", PackageStatIndex[PackageIndex]);
- } else {
- f_print(fout,
- "\n\t\t(((afs_uint32)(ntohs(z_call->conn->serviceId) << 16)) |\n"
- "\t\t((afs_uint32)ntohs(z_call->conn->service->servicePort))),\n");
+ f_print(fout, "}\n\n");
+}
+
+static void
+ucs_ProcCallback_setup(definition * defp, char *cbheader)
+{
+ proc1_list *plist;
+ int any_params = 0;
+
+ for (plist = defp->pc.plists; plist; plist = plist->next) {
+ if (plist->component_kind == DEF_PARAM) {
+ any_params = 1;
+ break;
+ }
+ }
+
+ if (any_params) {
+ f_print(fout, "struct args_%s%s%s {\n", prefix,
+ PackagePrefix[PackageIndex], defp->pc.proc_name);
+
+ for (plist = defp->pc.plists; plist; plist = plist->next) {
+ if (plist->component_kind == DEF_PARAM) {
+ f_print(fout, "\t");
+ if (plist->pl.param_kind == DEF_INPARAM &&
+ strcmp(plist->pl.param_type, "char *") == 0) {
+ f_print(fout, "const ");
+ }
+ if ((plist->pl.param_flag & OUT_STRING) != 0) {
+ f_print(fout, "%s *%s", plist->pl.param_type,
+ plist->pl.param_name);
+ } else {
+ f_print(fout, "%s %s", plist->pl.param_type,
+ plist->pl.param_name);
+ }
+ f_print(fout, ";\n");
}
- f_print(fout, "\t\t%d, %sNO_OF_STAT_FUNCS, &__QUEUE, &__EXEC,\n",
- no_of_stat_funcs, PackagePrefix[PackageIndex]);
- f_print(fout,
- "\t\t&z_call->bytesSent, &z_call->bytesRcvd, 0);\n");
- f_print(fout, "\t}\n\n");
}
- f_print(fout, "\treturn RXGEN_SS_XDRFREE;\n}\n\n");
- } else {
- f_print(fout, "}\n\n");
+ f_print(fout, "};\n");
}
-}
+ f_print(fout, "static int\n"
+ "%s%s%s%s(struct ubik_callrock_info *info, void *z_rock)\n"
+ "{\n",
+ cbheader, prefix, PackagePrefix[PackageIndex],
+ defp->pc.proc_name);
+
+ if (any_params) {
+ f_print(fout, "\tstruct args_%s%s%s *z_args = z_rock;\n", prefix,
+ PackagePrefix[PackageIndex], defp->pc.proc_name);
+ }
+
+ f_print(fout, "\treturn %s%s%s(info->conn", prefix, PackagePrefix[PackageIndex],
+ defp->pc.proc_name);
+
+ for (plist = defp->pc.plists; plist; plist = plist->next) {
+ if (plist->component_kind == DEF_PARAM) {
+ f_print(fout, ",\n\t\t\tz_args->%s", plist->pl.param_name);
+ }
+ }
+
+ f_print(fout, ");\n"
+ "}\n");
+
+}
static void
ucs_ProcName_setup(definition * defp, char *procheader, int split_flag)
if (!cflag) {
for (plist = defp->pc.plists; plist; plist = plist->next) {
if (plist->component_kind == DEF_PARAM) {
+ f_print(fout, ",");
if (ansic_flag) {
+ if (plist->pl.param_kind == DEF_INPARAM &&
+ strcmp(plist->pl.param_type, "char *") == 0) {
+ f_print(fout, "const ");
+ }
if (plist->pl.param_flag & OUT_STRING) {
- f_print(fout, ",%s *%s", plist->pl.param_type,
+ f_print(fout, "%s *%s", plist->pl.param_type,
plist->pl.param_name);
} else {
- f_print(fout, ",%s %s", plist->pl.param_type,
+ f_print(fout, "%s %s", plist->pl.param_type,
plist->pl.param_name);
}
} else {
plist->pl.param_flag &= ~PROCESSED_PARAM;
- f_print(fout, ", %s", plist->pl.param_name);
+ f_print(fout, " %s", plist->pl.param_name);
}
}
}
}
static void
-ucs_ProcTail_setup(definition * defp, int split_flag)
+ucs_ProcTail_setup(definition * defp, char *cbheader, int split_flag)
{
proc1_list *plist;
+ int any_params = 0;
+
+ f_print(fout, "{\n");
- f_print(fout, "{\tafs_int32 rcode, code, newHost, thisHost, i, _ucount;\n");
- f_print(fout, "\tint chaseCount, pass, needsync;\n");
-#if 0 /* goes with block below */
- f_print(fout, "\tint j, inlist;\n");
-#endif
- f_print(fout, "\tstruct rx_connection *tc;\n");
- f_print(fout, "\tstruct rx_peer *rxp;\n");
- f_print(fout, "\tshort origLevel;\n\n");
- f_print(fout, "\tif (!aclient)\n");
- f_print(fout, "\t\treturn UNOENT;\n");
- f_print(fout, "\tLOCK_UBIK_CLIENT(aclient);\n\n");
- f_print(fout, "\t restart:\n");
- f_print(fout, "\torigLevel = aclient->initializationState;\n");
- f_print(fout, "\trcode = UNOSERVERS;\n");
- f_print(fout, "\tchaseCount = needsync = 0;\n\n");
-#if 0 /* We should do some sort of caching algorithm for this, but I need to think about it - shadow 26 jun 06 */
- f_print(fout, "\tinlist = 0;\n");
- f_print(fout, "\tLOCK_UCLNT_CACHE;\n");
- f_print(fout, "\tfor (j = 0; ((j < SYNCCOUNT) && calls_needsync[j]); j++) {\n");
- f_print(fout, "\t\tif (calls_needsync[j] == (int *)%s%s%s) {\n", prefix, PackagePrefix[PackageIndex], defp->pc.proc_name);
- f_print(fout, "\t\t\tinlist = needsync = 1;\n");
- f_print(fout, "\t\t\tbreak;\n");
- f_print(fout, "\t\t}\n");
- f_print(fout, "\t}\n");
- f_print(fout, "\tUNLOCK_UCLNT_CACHE;\n");
-#endif
- f_print(fout, "\t/* \n\t* First pass, we try all servers that are up.\n\t* Second pass, we try all servers.\n\t*/\n");
- f_print(fout, "\tfor (pass = 0; pass < 2; pass++) { /*p */\n");
- f_print(fout, "\t\t/* For each entry in our servers list */\n");
- f_print(fout, "\t\tfor (_ucount = 0;; _ucount++) { /*s */\n\n");
- f_print(fout, "\t\tif (needsync) {\n");
- f_print(fout, "\t\t\t/* Need a sync site. Lets try to quickly find it */\n");
- f_print(fout, "\t\t\tif (aclient->syncSite) {\n");
- f_print(fout, "\t\t\t\tnewHost = aclient->syncSite; /* already in network order */\n");
- f_print(fout, "\t\t\t\taclient->syncSite = 0; /* Will reset if it works */\n");
- f_print(fout, "\t\t\t} else if (aclient->conns[3]) {\n");
- f_print(fout, "\t\t\t\t/* If there are fewer than four db servers in a cell,\n");
- f_print(fout, "\t\t\t\t* there's no point in making the GetSyncSite call.\n");
- f_print(fout, "\t\t\t\t* At best, it's a wash. At worst, it results in more\n");
- f_print(fout, "\t\t\t\t* RPCs than you would otherwise make.\n");
- f_print(fout, "\t\t\t\t*/\n");
- f_print(fout, "\t\t\t\ttc = aclient->conns[_ucount];\n");
- f_print(fout, "\t\t\t\tif (tc && rx_ConnError(tc)) {\n");
- f_print(fout, "\t\t\t\t\taclient->conns[_ucount] = tc = ubik_RefreshConn(tc);\n");
- f_print(fout, "\t\t\t\t}\n");
- f_print(fout, "\t\t\t\tif (!tc)\n");
- f_print(fout, "\t\t\t\t\tbreak;\n");
- f_print(fout, "\t\t\t\tcode = VOTE_GetSyncSite(tc, &newHost);\n");
- f_print(fout, "\t\t\t\tif (aclient->initializationState != origLevel)\n");
- f_print(fout, "\t\t\t\t\tgoto restart; /* somebody did a ubik_ClientInit */\n");
- f_print(fout, "\t\t\t\tif (code)\n");
- f_print(fout, "\t\t\t\t\tnewHost = 0;\n");
- f_print(fout, "\t\t\t\tnewHost = htonl(newHost); /* convert to network order */\n");
- f_print(fout, "\t\t\t} else {\n");
- f_print(fout, "\t\t\t\tnewHost = 0;\n");
- f_print(fout, "\t\t\t}\n");
- f_print(fout, "\t\t\tif (newHost) {\n");
- f_print(fout, "\t\t\t\t/* position count at the appropriate slot in the client\n");
- f_print(fout, "\t\t\t\t* structure and retry. If we can't find in slot, we'll\n");
- f_print(fout, "\t\t\t\t* just continue through the whole list \n");
- f_print(fout, "\t\t\t\t*/\n");
- f_print(fout, "\t\t\t\tfor (i = 0; i < MAXSERVERS && aclient->conns[i]; i++) {\n");
- f_print(fout, "\t\t\t\t\trxp = rx_PeerOf(aclient->conns[i]);\n");
- f_print(fout, "\t\t\t\t\tthisHost = rx_HostOf(rxp);\n");
- f_print(fout, "\t\t\t\t\tif (!thisHost)\n");
- f_print(fout, "\t\t\t\t\t\tbreak;\n");
- f_print(fout, "\t\t\t\t\tif (thisHost == newHost) {\n");
- f_print(fout, "\t\t\t\t\t\tif (chaseCount++ > 2)\n");
- f_print(fout, "\t\t\t\t\t\t\tbreak; /* avoid loop asking */\n");
- f_print(fout, "\t\t\t\t\t\t_ucount = i; /* this index is the sync site */\n");
- f_print(fout, "\t\t\t\t\t\tbreak;\n");
- f_print(fout, "\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n");
- f_print(fout, "\t\t/*needsync */\n");
- f_print(fout, "\t\ttc = aclient->conns[_ucount];\n");
- f_print(fout, "\t\tif (tc && rx_ConnError(tc)) {\n");
- f_print(fout, "\t\t\taclient->conns[_ucount] = tc = ubik_RefreshConn(tc);\n");
- f_print(fout, "\t\t}\n");
- f_print(fout, "\t\tif (!tc)\n");
- f_print(fout, "\t\t\tbreak;\n\n");
- f_print(fout, "\t\tif ((pass == 0) && (aclient->states[_ucount] & CFLastFailed)) {\n");
- f_print(fout, "\t\t\tcontinue; /* this guy's down */\n");
- f_print(fout, "\t\t}\n");
-
- f_print(fout, "\t\trcode = %s%s%s(tc\n", prefix, PackagePrefix[PackageIndex], defp->pc.proc_name);
for (plist = defp->pc.plists; plist; plist = plist->next) {
if (plist->component_kind == DEF_PARAM) {
- plist->pl.param_flag &= ~PROCESSED_PARAM;
- f_print(fout, ", %s", plist->pl.param_name);
+ any_params = 1;
+ break;
}
}
- f_print(fout, ");\n");
- f_print(fout, "\t\tif (aclient->initializationState != origLevel) {\n");
- f_print(fout, "\t\t\t/* somebody did a ubik_ClientInit */\n");
- f_print(fout, "\t\t\tif (rcode)\n");
- f_print(fout, "\t\t\t\tgoto restart; /* call failed */\n");
- f_print(fout, "\t\t\telse\n");
- f_print(fout, "\t\t\t\tgoto done; /* call suceeded */\n");
- f_print(fout, "\t\t}\n");
- f_print(fout, "\t\tif (rcode < 0) { /* network errors */\n");
- f_print(fout, "\t\t\taclient->states[_ucount] |= CFLastFailed; /* Mark server down */\n");
- f_print(fout, "\t\t} else if (rcode == UNOTSYNC) {\n");
- f_print(fout, "\t\t\tneedsync = 1;\n");
- f_print(fout, "\t\t} else if (rcode != UNOQUORUM) {\n");
- f_print(fout, "\t\t\t/* either misc ubik code, or misc appl code, or success. */\n");
- f_print(fout, "\t\t\taclient->states[_ucount] &= ~CFLastFailed; /* mark server up*/\n");
- f_print(fout, "\t\t\tgoto done; /* all done */\n");
- f_print(fout, "\t\t}\n");
- f_print(fout, "\t\t} /*s */\n");
- f_print(fout, "\t} /*p */\n\n");
- f_print(fout, "\tdone:\n");
- f_print(fout, "\tif (needsync) {\n");
-
-#if 0 /* We should do some sort of caching algorithm for this, but I need to think about it - shadow 26 jun 06 */
- f_print(fout, "\t\tif (!inlist) { /* Remember proc call that needs sync site */\n");
- f_print(fout, "\t\t\tLOCK_UCLNT_CACHE;\n");
- f_print(fout, "\t\t\tcalls_needsync[synccount % SYNCCOUNT] = (int *)%s%s%s;\n", prefix, PackagePrefix[PackageIndex], defp->pc.proc_name);
- f_print(fout, "\t\t\tsynccount++;\n");
- f_print(fout, "\t\t\tUNLOCK_UCLNT_CACHE;\n");
- f_print(fout, "\t\t\tinlist = 1;\n");
- f_print(fout, "\t\t}\n");
-#endif
- f_print(fout, "\t\tif (!rcode) { /* Remember the sync site - cmd successful */\n");
- f_print(fout, "\t\t\trxp = rx_PeerOf(aclient->conns[_ucount]);\n");
- f_print(fout, "\t\t\taclient->syncSite = rx_HostOf(rxp);\n");
- f_print(fout, "\t\t}\n");
- f_print(fout, "\t}\n");
- f_print(fout, "\tUNLOCK_UBIK_CLIENT(aclient);\n");
- f_print(fout, "\treturn rcode;\n}\n\n");
+
+ if (any_params) {
+ f_print(fout, "\tstruct args_%s%s%s args;\n", prefix,
+ PackagePrefix[PackageIndex], defp->pc.proc_name);
+ f_print(fout, "\tmemset(&args, 0, sizeof(args));\n\n");
+
+ for (plist = defp->pc.plists; plist; plist = plist->next) {
+ if (plist->component_kind == DEF_PARAM) {
+ plist->pl.param_flag &= ~PROCESSED_PARAM;
+ f_print(fout, "\targs.%s = %s;\n", plist->pl.param_name,
+ plist->pl.param_name);
+ }
+ }
+
+ f_print(fout, "\n\treturn ubik_CallRock(aclient, aflags, %s%s%s%s, &args);\n",
+ cbheader, prefix, PackagePrefix[PackageIndex], defp->pc.proc_name);
+ } else {
+ f_print(fout, "\treturn ubik_CallRock(aclient, aflags, %s%s%s%s, NULL);\n",
+ cbheader, prefix, PackagePrefix[PackageIndex], defp->pc.proc_name);
+ }
+
+ f_print(fout, "}\n\n");
}
er_HeadofOldStyleProc_setup();
er_BodyofOldStyleProc_setup();
er_TailofOldStyleProc_setup();
+ er_HeadofOldStyleProc_setup2();
+ er_BodyofOldStyleProc_setup2();
+ er_TailofOldStyleProc_setup2();
} else {
er_ProcDeclExterns_setup();
er_ProcProcsArray_setup();
"\nstatic afs_int32 (*StubProcsArray%d[])(struct rx_call *z_call, XDR *z_xdrs) = {_%s%s%s",
PackageIndex, prefix, defp->pc.proc_prefix,
((definition *) listp->val)->pc.proc_name);
- defp = (definition *) listp->val;
}
}
listp = listp->next;
PackagePrefix[PackageIndex], PackagePrefix[PackageIndex]);
f_print(fout, "\treturn opnames%d[op - %sLOWEST_OPCODE];\n}\n",
PackageIndex, PackagePrefix[PackageIndex]);
+ f_print(fout, "struct %sstats *%sOpCodeStats(int op)\n{\n",
+ PackagePrefix[PackageIndex], PackagePrefix[PackageIndex]);
+ f_print(fout, "\tif (op < %sLOWEST_OPCODE || op > %sHIGHEST_OPCODE)\n\t\treturn NULL;\n",
+ PackagePrefix[PackageIndex], PackagePrefix[PackageIndex]);
+ f_print(fout, "\treturn NULL;/*%d %s*/\n}\n",
+ PackageIndex, PackagePrefix[PackageIndex]);
+
return;
}
f_print(fout, "int %s%sExecuteRequest(struct rx_call *z_call)\n",
f_print(fout, "\treturn hton_syserr_conv(z_result);\n}\n");
}
+static void
+er_HeadofOldStyleProc_setup2(void)
+{
+ if ( cflag ) {
+ f_print(fout, "int %sOpCodeIndex(int op)\n{\n", (combinepackages ? MasterPrefix : PackagePrefix[PackageIndex]));
+ f_print(fout, "\tswitch (op) {\n");
+ }
+}
static void
er_HeadofOldStyleProc_setup(void)
f_print(fout, "\t\t\tbreak;\n");
}
+static void
+proc_op_case(definition * defp)
+{
+ f_print(fout, "\t\tcase %d:", defp->pc.proc_opcodenum);
+ f_print(fout, "\treturn %d;\n",
+ defp->statindex);
+}
+
+static void
+er_BodyofOldStyleProc_setup2(void)
+{
+ list *listp;
+
+ if (!cflag)
+ return;
+ if (combinepackages) {
+ int temp = PackageIndex;
+ for (PackageIndex = 0; PackageIndex <= temp; PackageIndex++) {
+ for (listp = proc_defined[PackageIndex]; listp != NULL;
+ listp = listp->next)
+ proc_op_case((definition *) listp->val);
+ }
+ PackageIndex = temp;
+ } else {
+ for (listp = proc_defined[PackageIndex]; listp != NULL;
+ listp = listp->next)
+ proc_op_case((definition *) listp->val);
+ }
+}
+
+static void
+er_TailofOldStyleProc_setup2(void)
+{
+ if ( cflag ) {
+ f_print(fout, "\t\tdefault:\n");
+ f_print(fout, "\t\t\treturn -1;\n\t}\n}\n");
+ }
+}
static void
er_TailofOldStyleProc_setup(void)
static void
h_HeadofOldStyleProc_setup(void)
{
+ char *pprefix = (combinepackages ? MasterPrefix :
+ PackagePrefix[PackageIndex]);
+ f_print(fout,"\nstruct %sstats{\n\tint statsver;\n};", pprefix);
f_print(fout,"\nextern int %s%sExecuteRequest(struct rx_call *);\n",
- prefix,
- (combinepackages ? MasterPrefix : PackagePrefix[PackageIndex]));
+ prefix, pprefix);
+ f_print(fout,"\nextern int %sOpCodeIndex(int op);\n", PackagePrefix[PackageIndex]);
}
void
PackageIndex = temp;
}
+static void
+proc_h_case(definition * defp)
+{
+ f_print(fout, "#define opcode_%s%s \t((afs_uint64)((%uLL << 32) + %sOpCodeIndex(%u)))\n",
+ defp->pc.proc_prefix, defp->pc.proc_name, StatIndex,
+ defp->pc.proc_prefix, defp->pc.proc_opcodenum);
+}
+
+void
+h_opcode_stats_pkg(char *pprefix, int lowest, int highest, int nops,
+ int statfuncs, char *ptype, list *proclist)
+{
+ list *listp;
+
+ if (!pprefix)
+ return;
+
+ f_print(fout,
+ "\n/* Opcode-related useful stats for %spackage: %s */\n",
+ ptype, pprefix);
+ f_print(fout, "#define %sLOWEST_OPCODE %d\n", pprefix, lowest);
+ f_print(fout, "#define %sHIGHEST_OPCODE %d\n", pprefix, highest);
+ f_print(fout, "#define %sNUMBER_OPCODES %d\n\n", pprefix, nops);
+
+ for (listp = proclist; listp != NULL;
+ listp = listp->next)
+ proc_h_case((definition *) listp->val);
+
+ if (xflag) {
+ f_print(fout, "#define %sNO_OF_STAT_FUNCS\t%d\n\n",
+ pprefix, statfuncs);
+ f_print(fout, "AFS_RXGEN_EXPORT\n");
+ f_print(fout, "extern const char *%sfunction_names[];\n\n",
+ pprefix);
+ }
+}
+
void
h_opcode_stats(void)
{
if (combinepackages) {
- f_print(fout,
- "\n/* Opcode-related useful stats for Master package: %s */\n",
- MasterPrefix);
- f_print(fout, "#define %sLOWEST_OPCODE %d\n", MasterPrefix,
- master_lowest_opcode);
- f_print(fout, "#define %sHIGHEST_OPCODE %d\n", MasterPrefix,
- master_highest_opcode);
- f_print(fout, "#define %sNUMBER_OPCODES %d\n\n", MasterPrefix,
- master_no_of_opcodes);
- if (xflag) {
- f_print(fout, "#define %sNO_OF_STAT_FUNCS\t%d\n\n", MasterPrefix,
- no_of_stat_funcs_header[0]);
- f_print(fout, "AFS_RXGEN_EXPORT\n");
- f_print(fout, "extern const char *%sfunction_names[];\n\n",
- MasterPrefix);
- }
+ h_opcode_stats_pkg(MasterPrefix, master_lowest_opcode, master_highest_opcode, master_no_of_opcodes, no_of_stat_funcs_header[0], "Master ", proc_defined[0]);
} else {
int i;
for (i = 0; i <= PackageIndex; i++) {
- f_print(fout,
- "\n/* Opcode-related useful stats for package: %s */\n",
- PackagePrefix[i]);
- f_print(fout, "#define %sLOWEST_OPCODE %d\n", PackagePrefix[i],
- lowest_opcode[i]);
- f_print(fout, "#define %sHIGHEST_OPCODE %d\n",
- PackagePrefix[i], highest_opcode[i]);
- f_print(fout, "#define %sNUMBER_OPCODES %d\n\n",
- PackagePrefix[i], no_of_opcodes[i]);
- if (xflag) {
- f_print(fout, "#define %sNO_OF_STAT_FUNCS\t%d\n\n",
- PackagePrefix[i], no_of_stat_funcs_header[i]);
- f_print(fout, "AFS_RXGEN_EXPORT\n");
- f_print(fout, "extern const char *%sfunction_names[];\n\n",
- PackagePrefix[i]);
- }
+ h_opcode_stats_pkg(PackagePrefix[i], lowest_opcode[i], highest_opcode[i], no_of_opcodes[i], no_of_stat_funcs_header[i], "", proc_defined[i]);
}
}
}