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

📄 evtmsg.c

📁 T-kernel 的extension源代码
💻 C
字号:
/* *---------------------------------------------------------------------- *    T-Kernel / Standard Extension * *    Copyright (C) 2006 by Ken Sakamura. All rights reserved. *    T-Kernel / Standard Extension is distributed  *      under the T-License for T-Kernel / Standard Extension. *---------------------------------------------------------------------- * *    Version:   1.00.00 *    Released by T-Engine Forum(http://www.t-engine.org) at 2006/8/11. * *---------------------------------------------------------------------- *//* *	evtmsg.c (event) * *	Event management *	Event message */#include "evtmgr.h"#include <extension/message.h>#include <sys/pinfo.h>/* * Event message */typedef struct {	W		type;	/* Message type (MS_SYS5) */	W		size;	/* Message body size */	EVENT		evt;	/* Event  */	EmDevEvt	dev;	/* Event notification from devices */} EvtMsg;/* * Send the event message. *	Call the EmInfo with it locked. */EXPORT ER emSendEvtMsg( EVENT *evt, EmDevEvt *dev, W devsz ){	EvtMsg		msg;	W		t_mask = (W)toEvtMsk(evt->type);	EvtMsgEntry	*p, *end = &emInfo.evtMsgEntry[emInfo.maxEvtMsg];	ER		err, error = E_OK;	if ( (t_mask & emInfo.evtMsgMask) == 0 ) {			return E_OK;  /* No event message request */	}	/* Outgoing message */	msg.type = MS_SYS5;	msg.size = (W)sizeof(EVENT) + devsz;	msg.evt  = *evt;	if ( devsz > 0 ) {		memcpy(&msg.dev, dev, (size_t)devsz);	}	/* Find a registered request. */	for ( p = emInfo.evtMsgEntry; p < end; ++p ) {		if ( (p->t_mask & t_mask) == 0 ) {			continue;		}		/* Send the event message. */		err = tkse_snd_msg(p->req_pid, (MESSAGE*)&msg, NOWAIT);		if ( err < E_OK ) {			error = err;		}	}DO_DEBUG(	if ( error < E_OK ) {		DEBUG_PRINT(("emSendEvtMsg err = %d\n", error));	})	return error;}/* * Register in the request list. */EXPORT ER emRegistEvtMsg( W t_mask, W pid ){	EvtMsgEntry	*end = &emInfo.evtMsgEntry[emInfo.maxEvtMsg];	EvtMsgEntry	*p, *free, *reg;	W		mask;	ER		err;	Enter;	/* Retrieve the registration position. */	free = reg = NULL;	mask = EM_NULL;	for ( p = emInfo.evtMsgEntry; p < end; ++p ) {		if ( p->t_mask == EM_NULL ) {			free = p;		/* Free entry */		} else {			if ( p->req_pid == pid ) {				reg = p;	/* Registered entry */			} else {				mask |= p->t_mask;			}		}	}	if ( reg != NULL ) {		/* Reregistration/deregistration */		reg->t_mask = t_mask;	} else {		if ( t_mask != EM_NULL ) {			if ( free == NULL ) {				err = E_LIMIT;				goto err_ret;			}			/* New registration */			free->t_mask = t_mask;			free->req_pid = pid;		}	}	/* Update the request event mask */	emInfo.evtMsgMask = mask | t_mask;	Return (E_OK);err_ret:	DEBUG_PRINT(("registEvtMsg err = %d\n", err));	Return (err);}/* * Register the event message request. */EXPORT ER _tkse_req_evt( W t_mask ){	PINFO	*pinfo;	ER	err;	/* Parameter check */	if ( t_mask < 0 ) {		err = E_PAR;		goto err_ret;	}	pinfo = GetPinfo(TSK_SELF);	if ( pinfo == NULL ) {		err = E_CTX;		goto err_ret;	}	/* Registration */	err = emRegistEvtMsg(t_mask, pinfo->procid);	if ( err < E_OK ) {		goto err_ret;	}	return E_OK;err_ret:	DEBUG_PRINT(("_tkse_req_evt err = %d\n", err));	return err;}

⌨️ 快捷键说明

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