• libev 中 ev_loop 结构体中的成员变量


    1、ev_loop是libev用来描述事件循环的结构体。在libev中的定义比较绕,这里把它摘抄出来,做下注释,方便学习。libev的定义如下

    struct ev_loop
    {
      ev_tstamp ev_rt_now;
      #define ev_rt_now ((loop)->ev_rt_now)
      #define VAR(name,decl) decl;
        #include "ev_vars.h"
      #undef VAR
    };
    #include "ev_wrap.h"
    
    static struct ev_loop default_loop_struct;
    EV_API_DECL struct ev_loop *ev_default_loop_ptr = 0;

    ev_tstamp 是double类型,是一个时间事件的计数类型,这里使用define来定义ev_rt_now为((loop)->ev_rt_now),程序里可以直接使用ev_rt_now,后边结构体的定义都是这样,这可能是作者的一些编程技巧。

    #define VAR(name,decl) decl; 
    #define VARx(type,name) VAR(name, type name)

    这两行表示了一个意思,用type来定义name,就是等于 type name;如 int backend;相当于在结构体中定义了一个变量。具体变量在ev_vars.h头文件中定义。

    ev_warp.h文件的作用和#define ev_rt_now ((loop)->ev_rt_now) 相同。具体两个文件代码如下:

    #define VARx(type,name) VAR(name, type name)
    
    VARx(ev_tstamp, now_floor) /* last time we refreshed rt_time */
    VARx(ev_tstamp, mn_now)    /* monotonic clock "now" */
    VARx(ev_tstamp, rtmn_diff) /* difference realtime - monotonic time */
    
    /* for reverse feeding of events */
    VARx(W *, rfeeds)
    VARx(int, rfeedmax)
    VARx(int, rfeedcnt)
    
    VAR (pendings, ANPENDING *pendings [NUMPRI])
    VAR (pendingmax, int pendingmax [NUMPRI])
    VAR (pendingcnt, int pendingcnt [NUMPRI])
    VARx(int, pendingpri) /* highest priority currently pending */
    VARx(ev_prepare, pending_w) /* dummy pending watcher */
    
    VARx(ev_tstamp, io_blocktime)
    VARx(ev_tstamp, timeout_blocktime)
    
    VARx(int, backend)
    VARx(int, activecnt) /* total number of active events ("refcount") */
    VARx(EV_ATOMIC_T, loop_done)  /* signal by ev_break */
    
    VARx(int, backend_fd)
    VARx(ev_tstamp, backend_mintime) /* assumed typical timer resolution */
    VAR (backend_modify, void (*backend_modify)(EV_P_ int fd, int oev, int nev))
    VAR (backend_poll  , void (*backend_poll)(EV_P_ ev_tstamp timeout))
    
    VARx(ANFD *, anfds)
    VARx(int, anfdmax)
    
    VAR (evpipe, int evpipe [2])
    VARx(ev_io, pipe_w)
    VARx(EV_ATOMIC_T, pipe_write_wanted)
    VARx(EV_ATOMIC_T, pipe_write_skipped)
    
    #if !defined(_WIN32) || EV_GENWRAP
    VARx(pid_t, curpid)
    #endif
    
    VARx(char, postfork)  /* true if we need to recreate kernel state after fork */
    
    #if EV_USE_SELECT || EV_GENWRAP
    VARx(void *, vec_ri)
    VARx(void *, vec_ro)
    VARx(void *, vec_wi)
    VARx(void *, vec_wo)
    #if defined(_WIN32) || EV_GENWRAP
    VARx(void *, vec_eo)
    #endif
    VARx(int, vec_max)
    #endif
    
    #if EV_USE_POLL || EV_GENWRAP
    VARx(struct pollfd *, polls)
    VARx(int, pollmax)
    VARx(int, pollcnt)
    VARx(int *, pollidxs) /* maps fds into structure indices */
    VARx(int, pollidxmax)
    #endif
    
    #if EV_USE_EPOLL || EV_GENWRAP
    VARx(struct epoll_event *, epoll_events)
    VARx(int, epoll_eventmax)
    VARx(int *, epoll_eperms)
    VARx(int, epoll_epermcnt)
    VARx(int, epoll_epermmax)
    #endif
    
    #if EV_USE_KQUEUE || EV_GENWRAP
    VARx(pid_t, kqueue_fd_pid)
    VARx(struct kevent *, kqueue_changes)
    VARx(int, kqueue_changemax)
    VARx(int, kqueue_changecnt)
    VARx(struct kevent *, kqueue_events)
    VARx(int, kqueue_eventmax)
    #endif
    
    #if EV_USE_PORT || EV_GENWRAP
    VARx(struct port_event *, port_events)
    VARx(int, port_eventmax)
    #endif
    
    #if EV_USE_IOCP || EV_GENWRAP
    VARx(HANDLE, iocp)
    #endif
    
    VARx(int *, fdchanges)
    VARx(int, fdchangemax)
    VARx(int, fdchangecnt)
    
    VARx(ANHE *, timers)
    VARx(int, timermax)
    VARx(int, timercnt)
    
    #if EV_PERIODIC_ENABLE || EV_GENWRAP
    VARx(ANHE *, periodics)
    VARx(int, periodicmax)
    VARx(int, periodiccnt)
    #endif
    
    #if EV_IDLE_ENABLE || EV_GENWRAP
    VAR (idles, ev_idle **idles [NUMPRI])
    VAR (idlemax, int idlemax [NUMPRI])
    VAR (idlecnt, int idlecnt [NUMPRI])
    #endif
    VARx(int, idleall) /* total number */
    
    VARx(struct ev_prepare **, prepares)
    VARx(int, preparemax)
    VARx(int, preparecnt)
    
    VARx(struct ev_check **, checks)
    VARx(int, checkmax)
    VARx(int, checkcnt)
    
    #if EV_FORK_ENABLE || EV_GENWRAP
    VARx(struct ev_fork **, forks)
    VARx(int, forkmax)
    VARx(int, forkcnt)
    #endif
    
    #if EV_CLEANUP_ENABLE || EV_GENWRAP
    VARx(struct ev_cleanup **, cleanups)
    VARx(int, cleanupmax)
    VARx(int, cleanupcnt)
    #endif
    
    #if EV_ASYNC_ENABLE || EV_GENWRAP
    VARx(EV_ATOMIC_T, async_pending)
    VARx(struct ev_async **, asyncs)
    VARx(int, asyncmax)
    VARx(int, asynccnt)
    #endif
    
    #if EV_USE_INOTIFY || EV_GENWRAP
    VARx(int, fs_fd)
    VARx(ev_io, fs_w)
    VARx(char, fs_2625) /* whether we are running in linux 2.6.25 or newer */
    VAR (fs_hash, ANFS fs_hash [EV_INOTIFY_HASHSIZE])
    #endif
    
    VARx(EV_ATOMIC_T, sig_pending)
    #if EV_USE_SIGNALFD || EV_GENWRAP
    VARx(int, sigfd)
    VARx(ev_io, sigfd_w)
    VARx(sigset_t, sigfd_set)
    #endif
    
    VARx(unsigned int, origflags) /* original loop flags */
    
    #if EV_FEATURE_API || EV_GENWRAP
    VARx(unsigned int, loop_count) /* total number of loop iterations/blocks */
    VARx(unsigned int, loop_depth) /* #ev_run enters - #ev_run leaves */
    
    VARx(void *, userdata)
    /* C++ doesn't support the ev_loop_callback typedef here. stinks. */
    VAR (release_cb, void (*release_cb)(EV_P) EV_THROW)
    VAR (acquire_cb, void (*acquire_cb)(EV_P) EV_THROW)
    VAR (invoke_cb , ev_loop_callback invoke_cb)
    #endif
    
    #undef VARx
    #define acquire_cb ((loop)->acquire_cb)
    #define activecnt ((loop)->activecnt)
    #define anfdmax ((loop)->anfdmax)
    #define anfds ((loop)->anfds)
    #define async_pending ((loop)->async_pending)
    #define asynccnt ((loop)->asynccnt)
    #define asyncmax ((loop)->asyncmax)
    #define asyncs ((loop)->asyncs)
    #define backend ((loop)->backend)
    #define backend_fd ((loop)->backend_fd)
    #define backend_mintime ((loop)->backend_mintime)
    #define backend_modify ((loop)->backend_modify)
    #define backend_poll ((loop)->backend_poll)
    #define checkcnt ((loop)->checkcnt)
    #define checkmax ((loop)->checkmax)
    #define checks ((loop)->checks)
    #define cleanupcnt ((loop)->cleanupcnt)
    #define cleanupmax ((loop)->cleanupmax)
    #define cleanups ((loop)->cleanups)
    #define curpid ((loop)->curpid)
    #define epoll_epermcnt ((loop)->epoll_epermcnt)
    #define epoll_epermmax ((loop)->epoll_epermmax)
    #define epoll_eperms ((loop)->epoll_eperms)
    #define epoll_eventmax ((loop)->epoll_eventmax)
    #define epoll_events ((loop)->epoll_events)
    #define evpipe ((loop)->evpipe)
    #define fdchangecnt ((loop)->fdchangecnt)
    #define fdchangemax ((loop)->fdchangemax)
    #define fdchanges ((loop)->fdchanges)
    #define forkcnt ((loop)->forkcnt)
    #define forkmax ((loop)->forkmax)
    #define forks ((loop)->forks)
    #define fs_2625 ((loop)->fs_2625)
    #define fs_fd ((loop)->fs_fd)
    #define fs_hash ((loop)->fs_hash)
    #define fs_w ((loop)->fs_w)
    #define idleall ((loop)->idleall)
    #define idlecnt ((loop)->idlecnt)
    #define idlemax ((loop)->idlemax)
    #define idles ((loop)->idles)
    #define invoke_cb ((loop)->invoke_cb)
    #define io_blocktime ((loop)->io_blocktime)
    #define iocp ((loop)->iocp)
    #define kqueue_changecnt ((loop)->kqueue_changecnt)
    #define kqueue_changemax ((loop)->kqueue_changemax)
    #define kqueue_changes ((loop)->kqueue_changes)
    #define kqueue_eventmax ((loop)->kqueue_eventmax)
    #define kqueue_events ((loop)->kqueue_events)
    #define kqueue_fd_pid ((loop)->kqueue_fd_pid)
    #define loop_count ((loop)->loop_count)
    #define loop_depth ((loop)->loop_depth)
    #define loop_done ((loop)->loop_done)
    #define mn_now ((loop)->mn_now)
    #define now_floor ((loop)->now_floor)
    #define origflags ((loop)->origflags)
    #define pending_w ((loop)->pending_w)
    #define pendingcnt ((loop)->pendingcnt)
    #define pendingmax ((loop)->pendingmax)
    #define pendingpri ((loop)->pendingpri)
    #define pendings ((loop)->pendings)
    #define periodiccnt ((loop)->periodiccnt)
    #define periodicmax ((loop)->periodicmax)
    #define periodics ((loop)->periodics)
    #define pipe_w ((loop)->pipe_w)
    #define pipe_write_skipped ((loop)->pipe_write_skipped)
    #define pipe_write_wanted ((loop)->pipe_write_wanted)
    #define pollcnt ((loop)->pollcnt)
    #define pollidxmax ((loop)->pollidxmax)
    #define pollidxs ((loop)->pollidxs)
    #define pollmax ((loop)->pollmax)
    #define polls ((loop)->polls)
    #define port_eventmax ((loop)->port_eventmax)
    #define port_events ((loop)->port_events)
    #define postfork ((loop)->postfork)
    #define preparecnt ((loop)->preparecnt)
    #define preparemax ((loop)->preparemax)
    #define prepares ((loop)->prepares)
    #define release_cb ((loop)->release_cb)
    #define rfeedcnt ((loop)->rfeedcnt)
    #define rfeedmax ((loop)->rfeedmax)
    #define rfeeds ((loop)->rfeeds)
    #define rtmn_diff ((loop)->rtmn_diff)
    #define sig_pending ((loop)->sig_pending)
    #define sigfd ((loop)->sigfd)
    #define sigfd_set ((loop)->sigfd_set)
    #define sigfd_w ((loop)->sigfd_w)
    #define timeout_blocktime ((loop)->timeout_blocktime)
    #define timercnt ((loop)->timercnt)
    #define timermax ((loop)->timermax)
    #define timers ((loop)->timers)
    #define userdata ((loop)->userdata)
    #define vec_eo ((loop)->vec_eo)
    #define vec_max ((loop)->vec_max)
    #define vec_ri ((loop)->vec_ri)
    #define vec_ro ((loop)->vec_ro)
    #define vec_wi ((loop)->vec_wi)
    #define vec_wo ((loop)->vec_wo)

  • 相关阅读:
    编程语言 编译型语言与解释型语言及汇编语言
    Alpha冲刺2
    事后诸葛亮
    Alpha阶段项目复审
    PostgreSQL的表膨胀与Vacuum和Vacuum Full
    PostgreSQL查看表膨胀(对所有表进行膨胀率排序)
    python中from __future__ import division/print_function的用法
    【IT企业笔试集】2013年阿里巴巴实习生招聘笔试题目及解答
    【WPF编程】一个未完成的12306本地客户端的源代码
    【深入理解计算机系统第二版】3.55习题
  • 原文地址:https://www.cnblogs.com/pang1567/p/4069941.html
Copyright © 2020-2023  润新知