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

📄 queue.c

📁 h内核
💻 C
字号:
/****************************************************************************** * *	(C)Copyright 1998,1999 SysKonnect, *	a business unit of Schneider & Koch & Co. Datensysteme GmbH. * *	See the file "skfddi.c" for further information. * *	This program is free software; you can redistribute it and/or modify *	it under the terms of the GNU General Public License as published by *	the Free Software Foundation; either version 2 of the License, or *	(at your option) any later version. * *	The information in this file is provided "AS IS" without warranty. * ******************************************************************************//*	SMT Event Queue Management*/#include "h/types.h"#include "h/fddi.h"#include "h/smc.h"#ifndef	lintstatic const char ID_sccs[] = "@(#)queue.c	2.9 97/08/04 (C) SK " ;#endif#define PRINTF(a,b,c)/* * init event queue management */void ev_init(struct s_smc *smc){	smc->q.ev_put = smc->q.ev_get = smc->q.ev_queue ;}/* * add event to queue */void queue_event(struct s_smc *smc, int class, int event){	PRINTF("queue class %d event %d\n",class,event) ;	smc->q.ev_put->class = class ;	smc->q.ev_put->event = event ;	if (++smc->q.ev_put == &smc->q.ev_queue[MAX_EVENT])		smc->q.ev_put = smc->q.ev_queue ;	if (smc->q.ev_put == smc->q.ev_get) {		SMT_ERR_LOG(smc,SMT_E0137, SMT_E0137_MSG) ;	}}/* * timer_event is called from HW timer package. */void timer_event(struct s_smc *smc, u_long token){	PRINTF("timer event class %d token %d\n",		EV_T_CLASS(token),		EV_T_EVENT(token)) ;	queue_event(smc,EV_T_CLASS(token),EV_T_EVENT(token));}/* * event dispatcher *	while event queue is not empty *		get event from queue *		send command to state machine *	end */void ev_dispatcher(struct s_smc *smc){	struct event_queue *ev ;	/* pointer into queue */	int		class ;	ev = smc->q.ev_get ;	PRINTF("dispatch get %x put %x\n",ev,smc->q.ev_put) ;	while (ev != smc->q.ev_put) {		PRINTF("dispatch class %d event %d\n",ev->class,ev->event) ;		switch(class = ev->class) {		case EVENT_ECM :		/* Entity Corordination  Man. */			ecm(smc,(int)ev->event) ;			break ;		case EVENT_CFM :		/* Configuration Man. */			cfm(smc,(int)ev->event) ;			break ;		case EVENT_RMT :		/* Ring Man. */			rmt(smc,(int)ev->event) ;			break ;		case EVENT_SMT :			smt_event(smc,(int)ev->event) ;			break ;#ifdef	CONCENTRATOR		case 99 :			timer_test_event(smc,(int)ev->event) ;			break ;#endif		case EVENT_PCMA :		/* PHY A */		case EVENT_PCMB :		/* PHY B */		default :			if (class >= EVENT_PCMA &&			    class < EVENT_PCMA + NUMPHYS) {				pcm(smc,class - EVENT_PCMA,(int)ev->event) ;				break ;			}			SMT_PANIC(smc,SMT_E0121, SMT_E0121_MSG) ;			return ;		}		if (++ev == &smc->q.ev_queue[MAX_EVENT])			ev = smc->q.ev_queue ;		/* Renew get: it is used in queue_events to detect overruns */		smc->q.ev_get = ev;	}}/* * smt_online connects to or disconnects from the ring * MUST be called to initiate connection establishment * *	on	0	disconnect *	on	1	connect */u_short smt_online(struct s_smc *smc, int on){	queue_event(smc,EVENT_ECM,on ? EC_CONNECT : EC_DISCONNECT) ;	ev_dispatcher(smc) ;	return(smc->mib.fddiSMTCF_State) ;}/* * set SMT flag to value *	flag		flag name *	value		flag value * dump current flag setting */#ifdef	CONCENTRATORvoid do_smt_flag(struct s_smc *smc, char *flag, int value){#ifdef	DEBUG	struct smt_debug	*deb;	SK_UNUSED(smc) ;#ifdef	DEBUG_BRD	deb = &smc->debug;#else	deb = &debug;#endif	if (!strcmp(flag,"smt"))		deb->d_smt = value ;	else if (!strcmp(flag,"smtf"))		deb->d_smtf = value ;	else if (!strcmp(flag,"pcm"))		deb->d_pcm = value ;	else if (!strcmp(flag,"rmt"))		deb->d_rmt = value ;	else if (!strcmp(flag,"cfm"))		deb->d_cfm = value ;	else if (!strcmp(flag,"ecm"))		deb->d_ecm = value ;	printf("smt	%d\n",deb->d_smt) ;	printf("smtf	%d\n",deb->d_smtf) ;	printf("pcm	%d\n",deb->d_pcm) ;	printf("rmt	%d\n",deb->d_rmt) ;	printf("cfm	%d\n",deb->d_cfm) ;	printf("ecm	%d\n",deb->d_ecm) ;#endif	/* DEBUG */}#endif

⌨️ 快捷键说明

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