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 + -
显示快捷键?