📄 evtmsg.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 + -