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

📄 obj.c

📁 cfront是最开始c++语言到C语言的转换工具
💻 C
字号:
/*ident	"@(#)cls4:lib/task/task/obj.c	1.1" *//******************************************************************************* C++ source for the C++ Language System, Release 3.0.  This productis a new release of the original cfront developed in the computerscience research center of AT&T Bell Laboratories.Copyright (c) 1991 AT&T and UNIX System Laboratories, Inc.Copyright (c) 1984, 1989, 1990 AT&T.  All Rights Reserved.THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE of AT&T and UNIX SystemLaboratories, Inc.  The copyright notice above does not evidenceany actual or intended publication of such source code.*******************************************************************************/#include <task.h>#include <stdlib.h>object::~object(){	if (o_next) task_error(E_ONEXT, this);	register olink* ol = o_link;	// Don't give error when this is remembering a TERMINATED task	while (ol) {		if (ol->l_task->s_state == sched::TERMINATED) {			ol = ol->l_next;		} else {			task_error(E_OLINK, this);			break;		}	}} /* delete *//*	note that a task can be on a chain in several places*/voidobject::remember(task* t){	if (t->s_state != sched::TERMINATED) {		o_link = new olink(t, o_link);	}}voidobject::forget(register task* p)/* remove all occurrences of task* p from this object's task list */{	register olink* ll;	register olink* l;	if (o_link == 0) return;	while (o_link->l_task == p) {		ll = o_link;		o_link = ll->l_next;		delete ll;		if (o_link == 0) return;	};	l = o_link;	while (ll = l->l_next) {		if (ll->l_task == p) {			l->l_next = ll->l_next;			delete ll;		}		else l = ll;	};}/* * prepare IDLE tasks on this object for scheduling * also flush the remember chain */voidobject::alert(){	register olink* l;	register olink* ll;	for (l=o_link; ll = l; l=l->l_next, delete ll) {		register task* p = l->l_task;		if (p->s_state == sched::IDLE) p->insert(0,this);	}	o_link = 0;}/* * virtual int object::pending() returns 1 if the object should be waited for. * By default say yes and assume that alert() will be called somehow. */intobject::pending(){	return 1;}/* * object::print() is a virtual function.  In each derived class, * derived::print() will print the derived information, * then call its immediate base::print(), with second argument non-zero.  * The original virtual call will have the second argument 0. * The first arg is meant to be CHAIN, VERBOSE, or STACK, or several combined * with | (e.g., CHAIN|STACK) */voidobject::print(int n, int baseClass){	if (!baseClass)		printf("Unidentified object ");	if (n&VERBOSE) {		olink* l;		printf("\tobject:  this=%x\n", this);		if (!o_link)			printf("\tNo tasks remembered\n");		for (l=o_link; l; l=l->l_next) {			printf("\tNext task on this=%x remember chain is:\n",				this);			l->l_task->print(n & ~CHAIN);		}	}	if (n&CHAIN) {		if (o_next) o_next->print(n);	}	printf("\n");}#define macro_start static char* error_name[] = {#define macro(num,name,string) string,#define macro_end(last_name) };task_error_messages#undef macro_start#undef macro#undef macro_endstatic int in_error = 0;void_print_error(int n){	register i = (n<1 || MAXERR<n) ? 0 : n;	printf("\n\n***** task_error(%d) %s\n",n,error_name[i]);	if (object::this_task()) { 		printf("thistask: ");		thistask->print(VERBOSE|STACK);	}	if (sched::runchain) {		printf("runchain:\n");		sched::runchain->print(CHAIN);	}} /* _print_error */// Obsolete version, remains for compatibility, use 2-argument static version// insteadintobject::task_error(int n){	if (in_error)		exit(in_error);	else		in_error = n;	if (error_fct) {		n = (*error_fct)(n,this);		if (n) exit(n);	}	else {		_print_error(n);		exit(n);	}	in_error = 0;	return 0;}//The second, static, version of the task_error function is usable by//both member functions and non-member functions.intobject::task_error(int n, object* th){	if (in_error)		exit(in_error);	else		in_error = n;	if (error_fct) {		n = (*error_fct)(n, th);					//th is really a "this" pointer for real					//objects, and is 0 for non-members		if (n) exit(n);	}	else {		_print_error(n);		exit(n);	}	in_error = 0;	return 0;}

⌨️ 快捷键说明

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