zoukankan      html  css  js  c++  java
  • libev 宏展开

    想看源码,宏太多,看着累,宏展开,再看,功力时间不够,先放下

    放上宏展开后的代码。

    libev4.20

    展开方示为

    ./configure

    修改makefile文件,字符串 替换CC为 CPP

    注意要把基础的CC定义保留

    make

    mv ev.o ev.c

    mv event.o event.c

    make clean

    修改makefile文件,字符串替换CPP-》CC

    注意要把基础的CPP定义保留 

    宏展开后#号注释的代码,可以修改CPP的定义 加个参数 

    ev.c,event.c

    及为展开后的代码

    测试可编译通过

    附ev.c部分代码

    struct ev_loop;
    enum {
        EV_UNDEF = (int)0xFFFFFFFF,
        EV_NONE = 0x00,
        EV_READ = 0x01,
        EV_WRITE = 0x02,
        EV__IOFDSET = 0x80,
        EV_IO = EV_READ,
        EV_TIMER = 0x00000100,
    
        EV_TIMEOUT = EV_TIMER,
    
        EV_PERIODIC = 0x00000200,
        EV_SIGNAL = 0x00000400,
        EV_CHILD = 0x00000800,
        EV_STAT = 0x00001000,
        EV_IDLE = 0x00002000,
        EV_PREPARE = 0x00004000,
        EV_CHECK = 0x00008000,
        EV_EMBED = 0x00010000,
        EV_FORK = 0x00020000,
        EV_CLEANUP = 0x00040000,
        EV_ASYNC = 0x00080000,
        EV_CUSTOM = 0x01000000,
        EV_ERROR = (int)0x80000000
    };
    typedef struct ev_watcher
    {
        int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_watcher *w, int revents);
    } ev_watcher;
    
    
    typedef struct ev_watcher_list
    {
        int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_watcher_list *w, int revents);
    
        struct ev_watcher_list *next;
    } ev_watcher_list;
    
    
    typedef struct ev_watcher_time
    {
        int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_watcher_time *w, int revents);
    
        ev_tstamp at;
    } ev_watcher_time;
    
    
    
    typedef struct ev_io
    {
        int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_io *w, int revents);
    
        struct ev_watcher_list *next;
    
        int fd;
        int events;
    } ev_io;
    
    
    
    typedef struct ev_timer
    {
        int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_timer *w, int revents);
        ev_tstamp at;
    
        ev_tstamp repeat;
    } ev_timer;
    
    
    
    typedef struct ev_periodic
    {
        int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_periodic *w, int revents); ev_tstamp at;
    
        ev_tstamp offset;
        ev_tstamp interval;
        ev_tstamp (*reschedule_cb)(struct ev_periodic *w, ev_tstamp now) ;
    } ev_periodic;
    
    
    
    typedef struct ev_signal
    {
        int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_signal *w, int revents);
    
        struct ev_watcher_list *next;
    
        int signum;
    } ev_signal;
    
    
    
    
    typedef struct ev_child
    {
        int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_child *w, int revents);
    
        struct ev_watcher_list *next;
    
        int flags;
        int pid;
        int rpid;
        int rstatus;
    } ev_child;
    
    
    
    
    
    
    typedef struct stat ev_statdata;
    
    
    
    
    typedef struct ev_stat
    {
        int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_stat *w, int revents);
    
        struct ev_watcher_list *next;
    
        ev_timer timer;
        ev_tstamp interval;
        const char *path;
        ev_statdata prev;
        ev_statdata attr;
    
        int wd;
    } ev_stat;
    
    
    
    
    
    typedef struct ev_idle
    {
        int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_idle *w, int revents);
    } ev_idle;
    
    
    
    
    
    typedef struct ev_prepare
    {
        int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_prepare *w, int revents);
    } ev_prepare;
    
    
    
    typedef struct ev_check
    {
        int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_check *w, int revents);
    } ev_check;
    
    
    
    
    typedef struct ev_fork
    {
        int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_fork *w, int revents);
    } ev_fork;
    
    
    
    
    
    typedef struct ev_cleanup
    {
        int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_cleanup *w, int revents);
    } ev_cleanup;
    
    
    
    
    
    typedef struct ev_embed
    {
        int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_embed *w, int revents);
    
        struct ev_loop *other;
        ev_io io;
        ev_prepare prepare;
        ev_check check;
        ev_timer timer;
        ev_periodic periodic;
        ev_idle idle;
        ev_fork fork;
    
        ev_cleanup cleanup;
    
    } ev_embed;
    
    
    
    
    
    typedef struct ev_async
    {
        int active; int pending; int priority; void *data; void (*cb)(struct ev_loop *loop, struct ev_async *w, int revents);
    
        sig_atomic_t volatile sent;
    } ev_async;
    
    
    
    
    
    union ev_any_watcher
    {
        struct ev_watcher w;
        struct ev_watcher_list wl;
    
        struct ev_io io;
        struct ev_timer timer;
        struct ev_periodic periodic;
        struct ev_signal signal;
        struct ev_child child;
    
        struct ev_stat stat;
    
    
        struct ev_idle idle;
    
        struct ev_prepare prepare;
        struct ev_check check;
    
        struct ev_fork fork;
    
    
        struct ev_cleanup cleanup;
    
    
        struct ev_embed embed;
    
    
        struct ev_async async;
    
    };
    
    
    enum {
    
        EVFLAG_AUTO = 0x00000000U,
    
        EVFLAG_NOENV = 0x01000000U,
        EVFLAG_FORKCHECK = 0x02000000U,
    
        EVFLAG_NOINOTIFY = 0x00100000U,
    
        EVFLAG_NOSIGFD = 0,
    
        EVFLAG_SIGNALFD = 0x00200000U,
        EVFLAG_NOSIGMASK = 0x00400000U
    };
    
    
    enum {
        EVBACKEND_SELECT = 0x00000001U,
        EVBACKEND_POLL = 0x00000002U,
        EVBACKEND_EPOLL = 0x00000004U,
        EVBACKEND_KQUEUE = 0x00000008U,
        EVBACKEND_DEVPOLL = 0x00000010U,
        EVBACKEND_PORT = 0x00000020U,
        EVBACKEND_ALL = 0x0000003FU,
        EVBACKEND_MASK = 0x0000FFFFU
    };
    
    
    extern int ev_version_major (void) ;
    extern int ev_version_minor (void) ;
    
    extern unsigned int ev_supported_backends (void) ;
    extern unsigned int ev_recommended_backends (void) ;
    extern unsigned int ev_embeddable_backends (void) ;
    
    extern ev_tstamp ev_time (void) ;
    extern void ev_sleep (ev_tstamp delay) ;
    
    
    
    
    
    
    
    extern void ev_set_allocator (void *(*cb)(void *ptr, long size) ) ;
    
    
    
    
    
    extern void ev_set_syserr_cb (void (*cb)(const char *msg) ) ;
    
    
    
    
    
    extern struct ev_loop *ev_default_loop (unsigned int flags ) ;
    
    
    
    
    
    static inline struct ev_loop *
    ev_default_loop_uc_ (void)
    {
        extern struct ev_loop *ev_default_loop_ptr;
    
        return ev_default_loop_ptr;
    }
    
    static inline int
    ev_is_default_loop (struct ev_loop *loop)
    {
        return loop == ev_default_loop_uc_ ();
    }
    
    
    extern struct ev_loop *ev_loop_new (unsigned int flags ) ;
    
    
    
    static inline void
    idle_reify (struct ev_loop *loop)
    {
        if (__builtin_expect ((!!(((loop)->idleall))),(0)))
        {
            int pri;
    
            for (pri = ((((0x7f) & 4) ? +2 : 0) - (((0x7f) & 4) ? -2 : 0) + 1); pri--; )
            {
                if (((loop)->pendingcnt) [pri])
                    break;
    
                if (((loop)->idlecnt) [pri])
                {
                    queue_events (loop, (W *)((loop)->idles) [pri], ((loop)->idlecnt) [pri], EV_IDLE);
                    break;
                }
            }
        }
    }
    
    
    
    static inline void
    timers_reify (struct ev_loop *loop)
    {
        do { } while (0);
    
        if (((loop)->timercnt) && (((loop)->timers) [(4 - 1)]).at < ((loop)->mn_now))
        {
            do
            {
                ev_timer *w = (ev_timer *)(((loop)->timers) [(4 - 1)]).w;
    
    
    
    
                if (w->repeat)
                {
                    ((WT)(w))->at += w->repeat;
                    if (((WT)(w))->at < ((loop)->mn_now))
                        ((WT)(w))->at = ((loop)->mn_now);
    
                    (__builtin_expect(!(("libev: negative ev_timer repeat value found while processing timers", w->repeat > 0.)), 0) ? __assert_rtn(__func__, "ev.c", 3207, "("libev: negative ev_timer repeat value found while processing timers", w->repeat > 0.)") : (void)0);
    
                    (((loop)->timers) [(4 - 1)]).at = (((loop)->timers) [(4 - 1)]).w->at;
                    downheap (((loop)->timers), ((loop)->timercnt), (4 - 1));
                }
                else
                    ev_timer_stop (loop, w);
    
                do { } while (0);
                feed_reverse (loop, (W)w);
            }
            while (((loop)->timercnt) && (((loop)->timers) [(4 - 1)]).at < ((loop)->mn_now));
    
            feed_reverse_done (loop, EV_TIMER);
        }
    }
    
    
    
    static void __attribute__ ((__noinline__))
    periodic_recalc (struct ev_loop *loop, ev_periodic *w)
    {
        ev_tstamp interval = w->interval > 0.0001220703125 ? w->interval : 0.0001220703125;
        ev_tstamp at = w->offset + interval * floor ((((loop)->ev_rt_now) - w->offset) / interval);
    
    
        while (at <= ((loop)->ev_rt_now))
        {
            ev_tstamp nat = at + w->interval;
    
    
            if (__builtin_expect ((!!(nat == at)),(0)))
            {
                at = ((loop)->ev_rt_now);
                break;
            }
    
            at = nat;
        }
    
        ((WT)(w))->at = at;
    }
    
    
    static inline void
    periodics_reify (struct ev_loop *loop)
    {
        do { } while (0);
    
        while (((loop)->periodiccnt) && (((loop)->periodics) [(4 - 1)]).at < ((loop)->ev_rt_now))
        {
            do
            {
                ev_periodic *w = (ev_periodic *)(((loop)->periodics) [(4 - 1)]).w;
    
    
    
    
                if (w->reschedule_cb)
                {
                    ((WT)(w))->at = w->reschedule_cb (w, ((loop)->ev_rt_now));
    
                    (__builtin_expect(!(("libev: ev_periodic reschedule callback returned time in the past", ((WT)(w))->at >= ((loop)->ev_rt_now))), 0) ? __assert_rtn(__func__, "ev.c", 3269, "("libev: ev_periodic reschedule callback returned time in the past", ev_at (w) >= ev_rt_now)") : (void)0);
    
                    (((loop)->periodics) [(4 - 1)]).at = (((loop)->periodics) [(4 - 1)]).w->at;
                    downheap (((loop)->periodics), ((loop)->periodiccnt), (4 - 1));
                }
                else if (w->interval)
                {
                    periodic_recalc (loop, w);
                    (((loop)->periodics) [(4 - 1)]).at = (((loop)->periodics) [(4 - 1)]).w->at;
                    downheap (((loop)->periodics), ((loop)->periodiccnt), (4 - 1));
                }
                else
                    ev_periodic_stop (loop, w);
    
                do { } while (0);
                feed_reverse (loop, (W)w);
            }
            while (((loop)->periodiccnt) && (((loop)->periodics) [(4 - 1)]).at < ((loop)->ev_rt_now));
    
            feed_reverse_done (loop, EV_PERIODIC);
        }
    }
    
    
    
    static void __attribute__ ((__noinline__))
    periodics_reschedule (struct ev_loop *loop)
    {
        int i;
    
    
        for (i = (4 - 1); i < ((loop)->periodiccnt) + (4 - 1); ++i)
        {
            ev_periodic *w = (ev_periodic *)(((loop)->periodics) [i]).w;
    
            if (w->reschedule_cb)
                ((WT)(w))->at = w->reschedule_cb (w, ((loop)->ev_rt_now));
            else if (w->interval)
                periodic_recalc (loop, w);
    
            (((loop)->periodics) [i]).at = (((loop)->periodics) [i]).w->at;
        }
    
        reheap (((loop)->periodics), ((loop)->periodiccnt));
    }
    
    
    
    static void __attribute__ ((__noinline__))
    timers_reschedule (struct ev_loop *loop, ev_tstamp adjust)
    {
        int i;
    
        for (i = 0; i < ((loop)->timercnt); ++i)
        {
            ANHE *he = ((loop)->timers) + i + (4 - 1);
            (*he).w->at += adjust;
            (*he).at = (*he).w->at;
        }
    }
    
    
    
    static inline void
    time_update (struct ev_loop *loop, ev_tstamp max_block)
    {
        {
            ((loop)->ev_rt_now) = ev_time ();
    
            if (__builtin_expect ((!!(((loop)->mn_now) > ((loop)->ev_rt_now) || ((loop)->ev_rt_now) > ((loop)->mn_now) + max_block + 1.)),(0)))
            {
    
                timers_reschedule (loop, ((loop)->ev_rt_now) - ((loop)->mn_now));
    
                periodics_reschedule (loop);
    
            }
    
            ((loop)->mn_now) = ((loop)->ev_rt_now);
        }
    }
    View Code

    还没看,以后可能也不会看了

  • 相关阅读:
    Java中的数学计算函数汇总
    安卓杂记(三)利用自定义的PolyBezier()函数将一系列散点绘制成光滑曲线(一)
    安卓杂记(二)利用FrameLayout叠加多种view的方法
    安卓问题报告小记(一): Activity not started, its current task has been brought to the front
    安卓杂记(一) 获取时间总结整理
    node api
    javascript 坑
    async
    promise
    js去除数组中的重复项
  • 原文地址:https://www.cnblogs.com/zihunqingxin/p/5027350.html
Copyright © 2011-2022 走看看