⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gen_rec.awk

📁 这是国外的resip协议栈
💻 AWK
📖 第 1 页 / 共 3 页
字号:
		    funcname) >> CFILE;	} else {		printf("int\n%s_buf(buf, max, lenp", funcname) >> CFILE;	}	for (i = 0; i < nvars; i++) {		if (modes[i] == "DB") {			# We pass in fileids on the dbp, so if this is one,			# skip it.			continue;		}		printf(",") >> CFILE;		if ((i % 6) == 0)			printf("\n    ") >> CFILE;		else			printf(" ") >> CFILE;		printf("%s", vars[i]) >> CFILE;	}	printf(")\n") >> CFILE;	# Now print the parameters	if (not_buf) {		if (has_dbp == 1) {			printf("\tDB *dbp;\n") >> CFILE;		} else {			printf("\tDB_ENV *dbenv;\n") >> CFILE;		}		printf("\tDB_TXN *txnid;\n\tDB_LSN *ret_lsnp;\n") >> CFILE;		printf("\tu_int32_t flags;\n") >> CFILE;	} else {		printf("\tu_int8_t *buf;\n") >> CFILE;		printf("\tsize_t max, *lenp;\n") >> CFILE;	}	for (i = 0; i < nvars; i++) {		# We just skip for modes == DB.		if (modes[i] == "DBT" ||		     modes[i] == "LOCKS" || modes[i] == "PGDBT")			printf("\tconst %s *%s;\n", types[i], vars[i]) >> CFILE;		else if (modes[i] != "DB")			printf("\t%s %s;\n", types[i], vars[i]) >> CFILE;	}	# Function body and local decls	printf("{\n") >> CFILE;	if (not_buf) {		printf("\tDBT logrec;\n") >> CFILE;		if (has_dbp == 1)			printf("\tDB_ENV *dbenv;\n") >> CFILE;		if (dbprivate)			printf("\tDB_TXNLOGREC *lr;\n") >> CFILE;		printf("\tDB_LSN *lsnp, null_lsn, *rlsnp;\n") >> CFILE;		printf("\tu_int32_t ") >> CFILE;		if (is_dbt == 1)			printf("zero, ") >> CFILE;		if (is_uint == 1)			printf("uinttmp, ") >> CFILE;		printf("rectype, txn_num;\n") >> CFILE;		printf("\tu_int npad;\n") >> CFILE;	} else {		if (is_dbt == 1)			printf("\tu_int32_t zero;\n") >> CFILE;		if (is_uint == 1)			printf("\tu_int32_t uinttmp;\n") >> CFILE;		printf("\tu_int8_t *endbuf;\n") >> CFILE;	}	printf("\tu_int8_t *bp;\n") >> CFILE;	printf("\tint ") >> CFILE;	if (dbprivate && not_buf) {		printf("is_durable, ") >> CFILE;	}	printf("ret;\n\n") >> CFILE;	# Initialization	if (not_buf) {		if (has_dbp == 1)			printf("\tdbenv = dbp->dbenv;\n") >> CFILE;		if (dbprivate)			printf("\tCOMPQUIET(lr, NULL);\n\n") >> CFILE;		printf("\trectype = DB_%s;\n", funcname) >> CFILE;		printf("\tnpad = 0;\n") >> CFILE;		printf("\trlsnp = ret_lsnp;\n\n") >> CFILE;	}	printf("\tret = 0;\n\n") >> CFILE;	if (not_buf) {		if (dbprivate) {			printf("\tif (LF_ISSET(DB_LOG_NOT_DURABLE)") \			    >> CFILE;			if (has_dbp == 1) {				printf(" ||\n\t    ") >> CFILE;				printf("F_ISSET(dbp, DB_AM_NOT_DURABLE)) {\n") \				    >> CFILE;			} else {				printf(") {\n") >> CFILE;				printf("\t\tif (txnid == NULL)\n") >> CFILE;				printf("\t\t\treturn (0);\n") >> CFILE;			}			printf("\t\tis_durable = 0;\n") >> CFILE;			printf("\t} else\n") >> CFILE;			printf("\t\tis_durable = 1;\n\n") >> CFILE;		}		printf("\tif (txnid == NULL) {\n") >> CFILE;		printf("\t\ttxn_num = 0;\n") >> CFILE;		printf("\t\tlsnp = &null_lsn;\n") >> CFILE;		printf("\t\tnull_lsn.file = null_lsn.offset = 0;\n") >> CFILE;		printf("\t} else {\n") >> CFILE;		if (dbprivate && funcname != "__db_debug") {			printf(\    "\t\tif (TAILQ_FIRST(&txnid->kids) != NULL &&\n") >> CFILE;			printf("\t\t    (ret = __txn_activekids(") >> CFILE;			printf("dbenv, rectype, txnid)) != 0)\n") >> CFILE;			printf("\t\t\treturn (ret);\n") >> CFILE;		}		printf("\t\t/*\n\t\t * We need to assign begin_lsn while ") \		    >> CFILE;		printf("holding region mutex.\n") >> CFILE;		printf("\t\t * That assignment is done inside the ") >> CFILE;		printf("DbEnv->log_put call,\n\t\t * ") >> CFILE;		printf("so pass in the appropriate memory location to be ") \		    >> CFILE;		printf("filled\n\t\t * in by the log_put code.\n\t\t*/\n") \		    >> CFILE;		printf("\t\tDB_SET_BEGIN_LSNP(txnid, &rlsnp);\n") >> CFILE;		printf("\t\ttxn_num = txnid->txnid;\n") >> CFILE;		printf("\t\tlsnp = &txnid->last_lsn;\n") >> CFILE;		printf("\t}\n\n") >> CFILE;		# If we're logging a DB handle, make sure we have a log		# file ID for it.		db_handle_id_function(modes, nvars);		# Malloc		printf("\tlogrec.size = ") >> CFILE;		printf("sizeof(rectype) + ") >> CFILE;		printf("sizeof(txn_num) + sizeof(DB_LSN)") >> CFILE;		for (i = 0; i < nvars; i++)			printf("\n\t    + %s", sizes[i]) >> CFILE;		printf(";\n") >> CFILE		if (dbprivate) {			printf("\tif (CRYPTO_ON(dbenv)) {\n") >> CFILE;			printf("\t\tnpad =\n") >> CFILE;			printf("\t\t    ((DB_CIPHER *)dbenv->crypto_handle)") \			    >> CFILE;			printf("->adj_size(logrec.size);\n") >> CFILE;			printf("\t\tlogrec.size += npad;\n\t}\n\n") >> CFILE			printf("\tif (is_durable || txnid == NULL) {\n") \			    >> CFILE;			printf("\t\tif ((ret =\n\t\t    __os_malloc(dbenv, ") \			    >> CFILE;			printf("logrec.size, &logrec.data)) != 0)\n") >> CFILE;			printf("\t\t\treturn (ret);\n") >> CFILE;			printf("\t} else {\n") >> CFILE;			write_malloc("\t\t",			    "lr", "logrec.size + sizeof(DB_TXNLOGREC)", CFILE)			printf("#ifdef DIAGNOSTIC\n") >> CFILE;			printf("\t\tif ((ret =\n\t\t    __os_malloc(dbenv, ") \			    >> CFILE;			printf("logrec.size, &logrec.data)) != 0) {\n") \			    >> CFILE;			printf("\t\t\t__os_free(dbenv, lr);\n") >> CFILE;			printf("\t\t\treturn (ret);\n") >> CFILE;			printf("\t\t}\n") >> CFILE;			printf("#else\n") >> CFILE;			printf("\t\tlogrec.data = lr->data;\n") >> CFILE;			printf("#endif\n") >> CFILE;			printf("\t}\n") >> CFILE;		} else {			write_malloc("\t", "logrec.data", "logrec.size", CFILE)			printf("\tbp = logrec.data;\n\n") >> CFILE;		}		printf("\tif (npad > 0)\n") >> CFILE;		printf("\t\tmemset((u_int8_t *)logrec.data + logrec.size ") \		    >> CFILE;		printf("- npad, 0, npad);\n\n") >> CFILE;		printf("\tbp = logrec.data;\n\n") >> CFILE;		# Copy args into buffer		printf("\tmemcpy(bp, &rectype, sizeof(rectype));\n") >> CFILE;		printf("\tbp += sizeof(rectype);\n\n") >> CFILE;		printf("\tmemcpy(bp, &txn_num, sizeof(txn_num));\n") >> CFILE;		printf("\tbp += sizeof(txn_num);\n\n") >> CFILE;		printf("\tmemcpy(bp, lsnp, sizeof(DB_LSN));\n") >> CFILE;		printf("\tbp += sizeof(DB_LSN);\n\n") >> CFILE;	} else {		# If we're logging a DB handle, make sure we have a log		# file ID for it.		db_handle_id_function(modes, nvars);		printf("\tbp = buf;\n") >> CFILE;		printf("\tendbuf = bp + max;\n\n") >> CFILE	}	for (i = 0; i < nvars; i++) {		if (modes[i] == "ARG" || modes[i] == "TIME") {			printf("\tuinttmp = (u_int32_t)%s;\n", \			    vars[i]) >> CFILE;			if (!not_buf) {				printf(\				    "\tif (bp + sizeof(uinttmp) > endbuf)\n") \				    >> CFILE;				printf("\t\treturn (ENOMEM);\n") >> CFILE;			}			printf("\tmemcpy(bp, &uinttmp, sizeof(uinttmp));\n") \			    >> CFILE;			printf("\tbp += sizeof(uinttmp);\n\n") >> CFILE;		} else if (modes[i] == "DBT" ||  \		     modes[i] == "LOCKS" || modes[i] == "PGDBT") {			printf("\tif (%s == NULL) {\n", vars[i]) >> CFILE;			printf("\t\tzero = 0;\n") >> CFILE;			if (!not_buf) {				printf(\			    "\t\tif (bp + sizeof(u_int32_t) > endbuf)\n") \				    >> CFILE;				printf("\t\t\treturn (ENOMEM);\n") >> CFILE;			}			printf("\t\tmemcpy(bp, &zero, sizeof(u_int32_t));\n") \				>> CFILE;			printf("\t\tbp += sizeof(u_int32_t);\n") >> CFILE;			printf("\t} else {\n") >> CFILE;			if (!not_buf) {				printf(\			    "\t\tif (bp + sizeof(%s->size) > endbuf)\n", \				    vars[i]) >> CFILE;				printf("\t\t\treturn (ENOMEM);\n") >> CFILE;			}			printf("\t\tmemcpy(bp, &%s->size, ", vars[i]) >> CFILE;			printf("sizeof(%s->size));\n", vars[i]) >> CFILE;			printf("\t\tbp += sizeof(%s->size);\n", vars[i]) \			    >> CFILE;			if (!not_buf) {				printf("\t\tif (bp + %s->size > endbuf)\n", \				    vars[i]) >> CFILE;				printf("\t\t\treturn (ENOMEM);\n") >> CFILE;			}			printf("\t\tmemcpy(bp, %s->data, %s->size);\n", \			    vars[i], vars[i]) >> CFILE;			printf("\t\tbp += %s->size;\n\t}\n\n", \			    vars[i]) >> CFILE;		} else if (modes[i] == "DB") {			printf("\tuinttmp = ") >> CFILE;			printf("(u_int32_t)dbp->log_filename->id;\n") >> CFILE;			printf("\tmemcpy(bp, &uinttmp, sizeof(uinttmp));\n") \			    >> CFILE;			printf("\tbp += sizeof(uinttmp);\n\n") >> CFILE;		} else { # POINTER			if (!not_buf) {				printf("\tif (bp + %s > endbuf)\n", \				    sizes[i]) >> CFILE;				printf("\t\treturn (ENOMEM);\n") >> CFILE;			}			printf("\tif (%s != NULL)\n", vars[i]) >> CFILE;			printf("\t\tmemcpy(bp, %s, %s);\n", vars[i], \			    sizes[i]) >> CFILE;			printf("\telse\n") >> CFILE;			printf("\t\tmemset(bp, 0, %s);\n", sizes[i]) >> CFILE;			printf("\tbp += %s;\n\n", sizes[i]) >> CFILE;		}	}	# Error checking.  User code won't have DB_ASSERT available, but	# this is a pretty unlikely assertion anyway, so we just leave it out	# rather than requiring assert.h.	if (not_buf) {		if (dbprivate) {			printf("\tDB_ASSERT((u_int32_t)") >> CFILE;			printf("(bp - (u_int8_t *)logrec.data) ") >> CFILE;			printf("<= logrec.size);\n\n") >> CFILE;			# Save the log record off in the txn's linked list,			# or do log call.			# We didn't call the crypto alignment function when			# we created this log record (because we don't have			# the right header files to find the function), so			# we have to copy the log record to make sure the			# alignment is correct.			printf("\tif (is_durable || txnid == NULL) {\n") \			    >> CFILE;			# Output the log record and update the return LSN.			printf("\t\tif ((ret = __log_put(dbenv, rlsnp,") \			    >> CFILE;			printf("(DBT *)&logrec,\n") >> CFILE;			printf("\t\t    flags | DB_LOG_NOCOPY)) == 0") >> CFILE;			printf(" && txnid != NULL) {\n") >> CFILE;			printf("\t\t\ttxnid->last_lsn = *rlsnp;\n") >> CFILE;			printf("\t\t\tif (rlsnp != ret_lsnp)\n") >> CFILE;			printf("\t\t\t\t *ret_lsnp = *rlsnp;\n") >> CFILE;			printf("\t\t}\n\t} else {\n") >> CFILE;			printf("#ifdef DIAGNOSTIC\n") >> CFILE;			# Add the debug bit if we are logging a ND record.			printf("\t\t/*\n") >> CFILE;			printf("\t\t * Set the debug bit if we are") >> CFILE;			printf(" going to log non-durable\n") >> CFILE;			printf("\t\t * transactions so they will be ignored") \			    >> CFILE;			printf(" by recovery.\n") >> CFILE;			printf("\t\t */\n") >> CFILE;			printf("\t\tmemcpy(lr->data, logrec.data, ") >> CFILE			printf("logrec.size);\n") >> CFILE;			printf("\t\trectype |= DB_debug_FLAG;\n") >> CFILE;			printf("\t\tmemcpy(") >> CFILE			printf("logrec.data, &rectype, sizeof(rectype));\n\n") \			    >> CFILE;			# Output the log record.			printf("\t\tret = __log_put(dbenv,\n") >> CFILE;			printf("\t\t    rlsnp, (DBT *)&logrec, ") >> CFILE;			printf("flags | DB_LOG_NOCOPY);\n") >> CFILE;			printf("#else\n") >> CFILE;			printf("\t\tret = 0;\n") >> CFILE;			printf("#endif\n") >> CFILE;			# Add a ND record to the txn list.			printf("\t\tSTAILQ_INSERT_HEAD(&txnid") >> CFILE;			printf("->logs, lr, links);\n") >> CFILE;			# Update the return LSN.			printf("\t\tLSN_NOT_LOGGED(*ret_lsnp);\n") >> CFILE;			printf("\t}\n\n") >> CFILE;		} else {			printf("\tif ((ret = dbenv->log_put(dbenv, rlsnp,") >> CFILE;			printf(" (DBT *)&logrec,\n") >> CFILE;			printf("\t    flags | DB_LOG_NOCOPY)) == 0") >> CFILE;			printf(" && txnid != NULL) {\n") >> CFILE;                	# Update the transactions last_lsn.			printf("\t\ttxnid->last_lsn = *rlsnp;\n") >> CFILE;			printf("\t\tif (rlsnp != ret_lsnp)\n") >> CFILE;			printf("\t\t\t *ret_lsnp = *rlsnp;\n") >> CFILE;			printf("\t}\n") >> CFILE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -