pangen2.c
来自「这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易」· C语言 代码 · 共 2,554 行 · 第 1/5 页
C
2,554 行
fatal("claim %s, (not runnable)", claimproc); if (eventmap && strcmp(now->sym->name, eventmap) == 0) fatal("eventmap %s, (not runnable)", eventmap); if (GenCode) fatal("'run' in d_step sequence (use atomic)", (char *)0); fprintf(fd,"addproc(%d", fproc(now->sym->name)); for (v = now->lft, i = 0; v; v = v->rgt, i++) { cat2(", ", v->lft); } if (i > Npars) { printf(" %d parameters used, %d expected\n", i, Npars); fatal("too many parameters in run %s(...)", now->sym->name); } for ( ; i < Npars; i++) fprintf(fd, ", 0"); fprintf(fd, ")"); break; case ENABLED: cat3("enabled(II, ", now->lft, ")"); break; case NONPROGRESS: /* o_pm&4=progress, tau&128=claim stutter */ if (separate == 2) fprintf(fd, "(!(o_pm&4) && !(tau&128))"); else fprintf(fd, "(!(trpt->o_pm&4) && !(trpt->tau&128))"); break; case PC_VAL: cat3("((P0 *) Pptr(", now->lft, "+BASE))->_p"); break; case LEN: if (!terse && !TestOnly && has_xu) { fprintf(fd, "\n#ifndef XUSAFE\n\t\t"); putname(fd, "(!(q_claim[", now->lft, m, "]&1) || "); putname(fd, "q_R_check(", now->lft, m, ""); fprintf(fd, ", II)) &&\n\t\t"); putname(fd, "(!(q_claim[", now->lft, m, "]&2) || "); putname(fd, "q_S_check(", now->lft, m, ", II)) &&"); fprintf(fd, "\n#endif\n\t\t"); } putname(fd, "q_len(", now->lft, m, ")"); break; case FULL: if (!terse && !TestOnly && has_xu) { fprintf(fd, "\n#ifndef XUSAFE\n\t\t"); putname(fd, "(!(q_claim[", now->lft, m, "]&1) || "); putname(fd, "q_R_check(", now->lft, m, ""); fprintf(fd, ", II)) &&\n\t\t"); putname(fd, "(!(q_claim[", now->lft, m, "]&2) || "); putname(fd, "q_S_check(", now->lft, m, ", II)) &&"); fprintf(fd, "\n#endif\n\t\t"); } putname(fd, "q_full(", now->lft, m, ")"); break; case EMPTY: if (!terse && !TestOnly && has_xu) { fprintf(fd, "\n#ifndef XUSAFE\n\t\t"); putname(fd, "(!(q_claim[", now->lft, m, "]&1) || "); putname(fd, "q_R_check(", now->lft, m, ""); fprintf(fd, ", II)) &&\n\t\t"); putname(fd, "(!(q_claim[", now->lft, m, "]&2) || "); putname(fd, "q_S_check(", now->lft, m, ", II)) &&"); fprintf(fd, "\n#endif\n\t\t"); } putname(fd, "(q_len(", now->lft, m, ")==0)"); break; case NFULL: if (!terse && !TestOnly && has_xu) { fprintf(fd, "\n#ifndef XUSAFE\n\t\t"); putname(fd, "(!(q_claim[", now->lft, m, "]&2) || "); putname(fd, "q_S_check(", now->lft, m, ", II)) &&"); fprintf(fd, "\n#endif\n\t\t"); } putname(fd, "(!q_full(", now->lft, m, "))"); break; case NEMPTY: if (!terse && !TestOnly && has_xu) { fprintf(fd, "\n#ifndef XUSAFE\n\t\t"); putname(fd, "(!(q_claim[", now->lft, m, "]&1) || "); putname(fd, "q_R_check(", now->lft, m, ", II)) &&"); fprintf(fd, "\n#endif\n\t\t"); } putname(fd, "(q_len(", now->lft, m, ")>0)"); break; case 's': if (Pid == eventmapnr) { fprintf(fd, "if ((ot == EVENT_TRACE && _tp != 's') "); putname(fd, "|| _qid+1 != ", now->lft, m, ""); for (v = now->rgt, i=0; v; v = v->rgt, i++) { if (v->lft->ntyp != CONST && v->lft->ntyp != EVAL) continue; fprintf(fd, " \\\n\t\t|| qrecv("); putname(fd, "", now->lft, m, ", "); putname(fd, "q_len(", now->lft, m, ")-1, "); fprintf(fd, "%d, 0) != ", i); if (v->lft->ntyp == CONST) putstmnt(fd, v->lft, m); else /* EVAL */ putstmnt(fd, v->lft->lft, m); } fprintf(fd, ")\n"); fprintf(fd, "\t\t continue"); putname(th, " || (x_y3_ == ", now->lft, m, ")"); break; } if (TestOnly) { if (m_loss) fprintf(fd, "1"); else putname(fd, "!q_full(", now->lft, m, ")"); break; } if (has_xu) { fprintf(fd, "\n#ifndef XUSAFE\n\t\t"); putname(fd, "if (q_claim[", now->lft, m, "]&2) "); putname(fd, "q_S_check(", now->lft, m, ", II);"); fprintf(fd, "\n#endif\n\t\t"); } fprintf(fd, "if (q_%s", (u_sync > 0 && u_async == 0)?"len":"full"); putname(fd, "(", now->lft, m, "))\n"); if (m_loss) fprintf(fd, "\t\t{ nlost++; delta_m = 1; } else {"); else { fprintf(fd, "\t\t\t"); Bailout(fd, ";"); } if (has_enabled) fprintf(fd, "\n\t\tif (TstOnly) return 1;"); if (u_sync && !u_async && rvopt) fprintf(fd, "\n\n\t\tif (no_recvs(II)) continue;\n"); fprintf(fd, "\n#ifdef HAS_CODE\n"); fprintf(fd, "\t\tif (readtrail && gui) {\n"); fprintf(fd, "\t\t\tchar simtmp[32];\n"); putname(fd, "\t\t\tsprintf(simvals, \"%%d!\", ", now->lft, m, ");\n"); _isok++; for (v = now->rgt, i = 0; v; v = v->rgt, i++) { cat3("\t\tsprintf(simtmp, \"%%d\", ", v->lft, "); strcat(simvals, simtmp);"); if (v->rgt) fprintf(fd, "\t\tstrcat(simvals, \",\");\n"); } _isok--; fprintf(fd, "\t\t}\n"); fprintf(fd, "#endif\n\t\t"); putname(fd, "\n\t\tqsend(", now->lft, m, ""); fprintf(fd, ", %d", now->val); for (v = now->rgt, i = 0; v; v = v->rgt, i++) { cat2(", ", v->lft); } if (i > Mpars) { terse++; putname(stdout, "channel name: ", now->lft, m, "\n"); terse--; printf(" %d msg parameters sent, %d expected\n", i, Mpars); fatal("too many pars in send", ""); } for ( ; i < Mpars; i++) fprintf(fd, ", 0"); fprintf(fd, ")"); if (u_sync) { fprintf(fd, ";\n\t\t"); if (u_async) putname(fd, "if (q_zero(", now->lft, m, ")) "); putname(fd, "{ boq = ", now->lft, m, ""); if (GenCode) fprintf(fd, "; Uerror(\"rv-attempt in d_step\")"); fprintf(fd, "; }"); } if (m_loss) fprintf(fd, ";\n\t\t}\n\t\t"); /* end of m_loss else */ break; case 'r': if (Pid == eventmapnr) { fprintf(fd, "if ((ot == EVENT_TRACE && _tp != 'r') "); putname(fd, "|| _qid+1 != ", now->lft, m, ""); for (v = now->rgt, i=0; v; v = v->rgt, i++) { if (v->lft->ntyp != CONST && v->lft->ntyp != EVAL) continue; fprintf(fd, " \\\n\t\t|| qrecv("); putname(fd, "", now->lft, m, ", "); fprintf(fd, "0, %d, 0) != ", i); if (v->lft->ntyp == CONST) putstmnt(fd, v->lft, m); else /* EVAL */ putstmnt(fd, v->lft->lft, m); } fprintf(fd, ")\n"); fprintf(fd, "\t\t continue"); putname(tc, " || (x_y3_ == ", now->lft, m, ")"); break; } if (TestOnly) { fprintf(fd, "(("); if (u_sync) fprintf(fd, "(boq == -1 && "); putname(fd, "q_len(", now->lft, m, ")"); if (u_sync && now->val <= 1) { putname(fd, ") || (boq == ", now->lft,m," && "); putname(fd, "q_zero(", now->lft,m,"))"); } fprintf(fd, ")"); if (now->val == 0 || now->val == 2) { for (v = now->rgt, i=j=0; v; v = v->rgt, i++) { if (v->lft->ntyp == CONST) { cat3("\n\t\t&& (", v->lft, " == "); putname(fd, "qrecv(", now->lft, m, ", "); fprintf(fd, "0, %d, 0))", i); } else if (v->lft->ntyp == EVAL) { cat3("\n\t\t&& (", v->lft->lft, " == "); putname(fd, "qrecv(", now->lft, m, ", "); fprintf(fd, "0, %d, 0))", i); } else { j++; continue; } } } else { fprintf(fd, "\n\t\t&& Q_has("); putname(fd, "", now->lft, m, ""); for (v = now->rgt, i=0; v; v = v->rgt, i++) { if (v->lft->ntyp == CONST) { fprintf(fd, ", 1, "); putstmnt(fd, v->lft, m); } else if (v->lft->ntyp == EVAL) { fprintf(fd, ", 1, "); putstmnt(fd, v->lft->lft, m); } else { fprintf(fd, ", 0, 0"); } } for ( ; i < Mpars; i++) fprintf(fd, ", 0, 0"); fprintf(fd, ")"); } fprintf(fd, ")"); break; } if (has_xu) { fprintf(fd, "\n#ifndef XUSAFE\n\t\t"); putname(fd, "if (q_claim[", now->lft, m, "]&1) "); putname(fd, "q_R_check(", now->lft, m, ", II);"); fprintf(fd, "\n#endif\n\t\t"); } if (u_sync) { if (now->val >= 2) { if (u_async) { fprintf(fd, "if ("); putname(fd, "q_zero(", now->lft,m,"))"); fprintf(fd, "\n\t\t{\t"); } fprintf(fd, "uerror(\"polling "); fprintf(fd, "rv chan\");\n\t\t"); if (u_async) fprintf(fd, " continue;\n\t\t}\n\t\t"); fprintf(fd, "IfNotBlocked\n\t\t"); } else { fprintf(fd, "if ("); if (u_async == 0) putname(fd, "boq != ", now->lft,m,") "); else { putname(fd, "q_zero(", now->lft,m,"))"); fprintf(fd, "\n\t\t{\tif (boq != "); putname(fd, "", now->lft,m,") "); Bailout(fd, ";\n\t\t} else\n\t\t"); fprintf(fd, "{\tif (boq != -1) "); } Bailout(fd, ";\n\t\t"); if (u_async) fprintf(fd, "}\n\t\t"); } } putname(fd, "if (q_len(", now->lft, m, ") == 0) "); Bailout(fd, ""); for (v = now->rgt, j=0; v; v = v->rgt) { if (v->lft->ntyp != CONST && v->lft->ntyp != EVAL) j++; /* count settables */ } fprintf(fd, ";\n\n\t\tXX=1");/* test */ if (now->val == 0 || now->val == 2) { for (v = now->rgt, i=0; v; v = v->rgt, i++) { if (v->lft->ntyp == CONST) { fprintf(fd, ";\n\t\t"); cat3("if (", v->lft, " != "); putname(fd, "qrecv(", now->lft, m, ", "); fprintf(fd, "0, %d, 0)) ", i); Bailout(fd, ""); } else if (v->lft->ntyp == EVAL) { fprintf(fd, ";\n\t\t"); cat3("if (", v->lft->lft, " != "); putname(fd, "qrecv(", now->lft, m, ", "); fprintf(fd, "0, %d, 0)) ", i); Bailout(fd, ""); } } } else /* random receive: val 1 or 3 */ { fprintf(fd, ";\n\t\tif (!(XX = Q_has("); putname(fd, "", now->lft, m, ""); for (v = now->rgt, i=0; v; v = v->rgt, i++) { if (v->lft->ntyp == CONST) { fprintf(fd, ", 1, "); putstmnt(fd, v->lft, m); } else if (v->lft->ntyp == EVAL) { fprintf(fd, ", 1, "); putstmnt(fd, v->lft->lft, m); } else { fprintf(fd, ", 0, 0"); } } for ( ; i < Mpars; i++) fprintf(fd, ", 0, 0"); fprintf(fd, "))) "); Bailout(fd, ""); fprintf(fd, ";\n\t\t"); if (multi_oval) { check_needed(); fprintf(fd, "(trpt+1)->bup.ovals[%d] = ", multi_oval-1); multi_oval++; } else fprintf(fd, "(trpt+1)->bup.oval = "); fprintf(fd, "XX"); } if (has_enabled) fprintf(fd, ";\n\t\tif (TstOnly) return 1"); if (j == 0 && now->val >= 2) { fprintf(fd, ";\n\t\t"); break; /* poll without side-effect */ } if (!GenCode) { int jj = 0; fprintf(fd, ";\n\t\t"); /* no variables modified */ if (j == 0 && now->val == 0) { fprintf(fd, "if (q_flds[((Q0 *)qptr("); putname(fd, "", now->lft, m, "-1))->_t]"); fprintf(fd, " != %d)\n\t", i); fprintf(fd, "\t\tUerror(\"wrong nr of msg fields in rcv\");\n\t\t"); } for (v = now->rgt; v; v = v->rgt) if ((v->lft->ntyp != CONST && v->lft->ntyp != EVAL)) jj++; /* nr of vars needing bup */ if (jj) for (v = now->rgt, i = 0; v; v = v->rgt, i++) { char tempbuf[64]; if ((v->lft->ntyp == CONST || v->lft->ntyp == EVAL)) continue; if (multi_oval) { check_needed(); sprintf(tempbuf, "(trpt+1)->bup.ovals[%d] = ", multi_oval-1); multi_oval++; } else sprintf(tempbuf, "(trpt+1)->bup.oval = "); if (v->lft->sym && !strcmp(v->lft->sym->name, "_")) { fprintf(fd, tempbuf); putname(fd, "qrecv(", now->lft, m, ""); fprintf(fd, ", XX-1, %d, 0);\n\t\t", i); } else { _isok++; cat3(tempbuf, v->lft, ";\n\t\t"); _isok--; } } if (jj) /* check for double entries q?x,x */ { Lextok *w; for (v = now->rgt; v; v = v->rgt) { if (v->lft->ntyp != CONST && v->lft->ntyp != EVAL && v->lft->sym && v->lft->sym->type != STRUCT /* not a struct */ && v->lft->sym->nel == 1 /* not an array */ && strcmp(v->lft->sym->name, "_") != 0) for (w = v->rgt; w; w = w->rgt) if (v->lft->sym == w->lft->sym) { fatal("cannot use var ('%s') in multiple msg fields", v->lft->sym->name); } } } }/* set */ for (v = now->rgt, i = 0; v; v = v->rgt, i++) { if ((v->lft->ntyp == CONST || v->lft->ntyp == EVAL) && v->rgt) continue; fprintf(fd, ";\n\t\t"); if (v->lft->ntyp != CONST && v->lft->ntyp != EVAL && strcmp(v->lft->sym->name, "_") != 0) { nocast=1; _isok++; putstmnt(fd, v->lft, m); _isok--; nocast=0; fprintf(fd, " = "); } putname(fd, "qrecv(", now->lft, m, ", "); fprintf(fd, "XX-1, %d, ", i); fprintf(fd, "%d)", (v->rgt || now->val >= 2)?0:1); if (v->lft->ntyp != CONST && v->lft->ntyp != EVAL && strcmp(v->lft->sym->name, "_") != 0 && (v->lft->ntyp != NAME || v->lft->sym->type != CHAN)) { fprintf(fd, ";\n#ifdef VAR_RANGES"); fprintf(fd, "\n\t\tlogval(\""); withprocname = terse = nocast = 1; _isok++; putstmnt(fd,v->lft,m); withprocname = terse = nocast = 0; fprintf(fd, "\", "); putstmnt(fd,v->lft,m); _isok--; fprintf(fd, ");\n#endif\n"); fprintf(fd, "\t\t"); } } fprintf(fd, ";\n\t\t"); fprintf(fd, "\n#ifdef HAS_CODE\n"); fprintf(fd, "\t\tif (readtrail && gui) {\n"); fprintf(fd, "\t\t\tchar simtmp[32];\n"); putname(fd, "\t\t\tsprintf(simvals, \"%%d?\", ", now->lft, m, ");\n"); _isok++; for (v = now->rgt, i = 0; v; v = v->rgt, i++) { if (v->lft->ntyp != EVAL) { cat3("\t\tsprintf(simtmp, \"%%d\", ", v->lft, "); strcat(simvals, simtmp);"); } else { cat3("\t\tsprintf(simtmp, \"%%d\", ", v->lft->lft, "); strcat(simvals, simtmp);"); } if (v->rgt) fprintf(fd, "\t\tstrcat(simvals, \",\");\n"); } _isok--; fprintf(fd, "\t\t}\n"); fprintf(fd, "#endif\n\t\t"); if (u_sync) { putname(fd, "if (q_zero(", now->lft, m, "))"); fprintf(fd, "\n\t\t{ boq = -1;\n"); fprintf(fd, "#ifndef NOFAIR\n"); /* NEW 3.0.8 */ fprintf(fd, "\t\t\tif (fairness\n"); fprintf(fd, "\t\t\t&& !(trpt->o_pm&32)\n"); fprintf(fd, "\t\t\t&& (now._a_t&2)\n"); fprintf(fd, "\t\t\t&& now._cnt[now._a_t&1] == II+2)\n"); fprintf(fd, "\t\t\t{ now._cnt[now._a_t&1] -= 1;\n"); fprintf(fd, "#ifdef VERI\n"); fprintf(fd, "\t\t\t if (II == 1)\n"); fprintf(fd, "\t\t\t now._cnt[now._a_t&1] = 1;\n"); fprintf(fd, "#endif\n"); fprintf(fd, "#ifdef DEBUG\n"); fprintf(fd, "\t\t\tprintf(\"%%3d: proc %%d fairness \", depth, II);\n"); fprintf(fd, "\t\t\tprintf(\"Rule 2: --cnt to %%d (%%d)\\n\",\n"); fprintf(fd, "\t\t\t now._cnt[now._a_t&1], now._a_t);\n"); fprintf(fd, "#endif\n"); fprintf(fd, "\t\t\t trpt->o_pm |= (32|64);\n"); fprintf(fd, "\t\t\t}\n"); fprintf(fd, "#endif\n"); fprintf(fd, "\n\t\t}"); } break; case 'R': if (!terse && !TestOnly && has_xu) { fprintf(fd, "\n#ifndef XUSAFE\n\t\t"); putname(fd, "(!(q_claim[", now->lft, m, "]&1) || "); fprintf(fd, "q_R_check("); putname(fd, "", now->lft, m, ", II)) &&\n\t\t"); putname(fd, "(!(q_claim[", now->lft, m, "]&2) || "); putname(fd, "q_S_check(", now->lft, m, ", II)) &&"); fprintf(fd, "\n#endif\n\t\t"); } if (u_sync>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?