码迷,mamicode.com
首页 > 其他好文 > 详细

libev 宏展开

时间:2015-12-07 22:33:06      阅读:402      评论:0      收藏:0      [点我收藏+]

标签:

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

放上宏展开后的代码。

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

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

libev 宏展开

标签:

原文地址:http://www.cnblogs.com/zihunqingxin/p/5027350.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!