ACE之ACE_Event_Handler

简介

ACE_Event_Handler是事件处理器,包含处理网络io,定时器以及信号,异常

结构

ACE_Event_Handler
+ACE_HANDLE get_handle(void)
+void set_handle(ACE_HANDLE)
+int priority(void)
+void priority(int priority)
+int handle_input(ACE_HANDLE fd = ACE_INVALID_HANDLE)
+int handle_output(ACE_HANDLE fd = ACE_INVALID_HANDLE)
+int handle_exception(ACE_HANDLE fd = ACE_INVALID_HANDLE)
+int handle_timeout(const ACE_Time_Value ¤t_time,const void *act = 0)
+int handle_exit(ACE_Process *)
+int handle_close(ACE_HANDLE handle,ACE_Reactor_Mask close_mask)
+int handle_signal(int signum, siginfo_t * = 0, ucontext_t * = 0)
+int resume_handler(void)
+int handle_qos(ACE_HANDLE = ACE_INVALID_HANDLE)
+int handle_group_qos(ACE_HANDLE = ACE_INVALID_HANDLE)
+void reactor(ACE_Reactor *reactor)
+ACE_Reactor *reactor(void)
+ACE_Reactor_Timer_Interface *reactor_timer_interface(void)
  • 句柄相关:get_handle ,set_handle
  • 优先级相关:priority,优先级的设置及获取
  • 事件相关:handle_input ,handle_output ,handle_exception ,handle_timeout ,handle_exit(进程退出),handle_close(当handle_*方法返回-1时或者reactor调用remove_handler),handle_signal(处理信号)
  • qos相关:handle_qos, handle_group_qos
  • reactor相关:reactor的设置及获取

支持的事件类型有

  • READ_MASK
  • WRITE_MASK
  • EXCEPT_MASK
  • ACCEPT_MASK
  • CONNECT_MASK
  • TIMER_MASK
  • QOS_MASK
  • GROUP_QOS_MASK
  • SIGNAL_MASK

信号事件

ACE_Sig_Handler用于管理事件,包含注册和删除信号相关的事件

use
use
ACE_Sig_Handler
- ACE_Event_Handler *signal_handlers_[ACE_NSIG]
# static sig_atomic_t sig_pending_;
ACE_Sig_Action
- struct sigaction sa_
ACE_Sig_Set
- sigset_t sigset_
ACE_Sig_Handlers
ACE_Sig_Adatper
ACE_Event_Handler

ACE_Sig_Handler 其方法有

virtual int register_handler (int signum,ACE_Event_Handler *new_sh,ACE_Sig_Action *new_disp = 0,ACE_Event_Handler **old_sh = 0,ACE_Sig_Action *old_disp = 0);
virtual int remove_handler (int signum,ACE_Sig_Action *new_disp = 0,ACE_Sig_Action *old_disp = 0,int sigkey = -1);
static int sig_pending (void);
static void sig_pending (int);
virtual ACE_Event_Handler *handler (int signum);
virtual ACE_Event_Handler *handler (int signum, ACE_Event_Handler *);
static void dispatch (int, siginfo_t *,ucontext_t *);
void dump (void) const;

sig_pending_处理信号事件的标识
ACE_Sig_Set是对sigset_t的封装,其原方法有

int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *sest, int signo);
int sigdelset(sigset_t *set, int signo);
int sigismember(const sigset_t *set, int signo);

封装后方法为

int empty_set (void);
int fill_set (void);
int sig_add (int signo);
int sig_del (int signo);
int is_member (int signo) const;
operator sigset_t *();
sigset_t sigset (void) const;
void dump (void) const;

ACE_Sig_Action是对sigaction的封装,其原方法为

int sigaction(int signo, const struct sigaction *restrict act, struct sigaction *restrict oact);

//sigaction定义
struct sigaction
{
	void (*sa_handler)(int);
	sigset_t sa_mask;
	int sa_flags;
	void (*sa_sigaction)(int, siginfo_t *, void*);
};

封装后方法有

int register_action (int signum,ACE_Sig_Action *oaction = 0);
int restore_action (int signum,ACE_Sig_Action &oaction);
int retrieve_action (int signum);
void set (struct sigaction *);
struct sigaction *get (void);
operator struct sigaction *();
void flags (int);
int flags (void);
void mask (sigset_t *);
void mask (ACE_Sig_Set &);
sigset_t *mask (void);
void handler (ACE_SignalHandler);
ACE_SignalHandler handler (void);
void dump (void) const;

handle_signal方法是在ACE_Sig_Handler::dispatch中被调用,会将sig_pending_ 置为1,reactor在handle_events时会根据此标识判断是否有处理事件,同时将sig_pending_复位

void
ACE_Sig_Handler::dispatch (int signum,
                           siginfo_t *siginfo,
                           ucontext_t *ucontext)
{
  ACE_Errno_Guard error (errno);
  ACE_Sig_Handler::sig_pending_ = 1;
  ACE_ASSERT (ACE_Sig_Handler::in_range (signum));
  ACE_Event_Handler *eh = ACE_Sig_Handler::signal_handlers_[signum];
  if (eh != 0)
    {
      if (eh->handle_signal (signum, siginfo, ucontext) == -1)
        ACE_Sig_Handler::remove_handler_i (signum);
#if defined (ACE_WIN32)
      else
        ACE_Sig_Handler::register_handler_i (signum, eh);
#endif /* ACE_WIN32*/
    }
}

信号处理函数是通过ACE_Sig_Handler::register_handler_i
分为两种情况,一种是c函数,一个是c++的
c函数使用

extern "C" void
ace_sig_handler_dispatch (int signum, siginfo_t *info, ucontext_t *context)
{
  ACE_TRACE ("ace_sig_handler_dispatch");
  ACE_Sig_Handler::dispatch (signum, info, context);
}

#define ace_signal_handler_dispatcher ACE_SignalHandler(ace_sig_handler_dispatch)

extern "C" void
ace_sig_handlers_dispatch (int signum, siginfo_t *info, ucontext_t *context)
{
  ACE_TRACE ("ace_sig_handlers_dispatch");
  ACE_Sig_Handlers::dispatch (signum, info, context);
}

#define ace_signal_handlers_dispatcher ACE_SignalHandler(ace_sig_handlers_dispatch)

c++使用

#define ace_signal_handler_dispatcher ACE_SignalHandler(ACE_Sig_Handler::dispatch)
#define ace_signal_handlers_dispatcher ACE_SignalHandler(ACE_Sig_Handlers::dispatch)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值