• R2学习记录


    Setting up the Libevent library
    1.重写log行为

    #include <event2/event.h>
    #include <stdio.h>
    static void discard_cb(int severity, const char *msg) {
        /* This callback does nothing. */
    }
    static FILE *logfile = NULL;
    static void write_to_file_cb(int severity, const char *msg) {
        const char *s;
        if (!logfile)
            return;
        switch (severity) {
            case _EVENT_LOG_DEBUG: 
                s = "debug";
            case _EVENT_LOG_MSG:
                s = "msg";
            case _EVENT_LOG_WARN: 
                s = "warn";
            case _EVENT_LOG_ERR:
                s = "error";
            default:    /* never reached */
                s = "?";
        }
        fprintf(logfile, "[%s] %s
    ", s, msg);
    }
    
    /* Turn off all logging from Libevent. */
    void suppress_logging(void) {
        event_set_log_callback(discard_cb);
    }
    /* Redirect all Libevent log messages to the C stdio file 'f'. */
    void set_logfile(FILE *f) {
        logfile = f;
        event_set_log_callback(write_to_file_cb);
    }

    2.重写异常退出动作:

    typedef void (*event_fatal_cb)(int err);
    void event_set_fatal_callback(event_fatal_cb cb);

    3.重写内存管理方式:

    void event_set_mem_functions(void *(*malloc_fn)(size_t sz),
    void *(*realloc_fn)(void *ptr, size_t sz),
    void (*free_fn)(void *ptr));

    4.锁和线程
    libevent默认支持win和类unix的线程库, 如果想自己实现线程库的话需要实现:
    Locks
    locking
    unlocking
    lock allocation
    lock destruction
    Conditions
    condition variable creation
    condition variable destruction
    waiting on a condition variable
    signaling/broadcasting to a condition variable
    Threads
    thread ID detection

    #define EVTHREAD_WRITE     0x04
    #define EVTHREAD_READ    0x08    
    #define EVTHREAD_TRY    0x10
    
    #define EVTHREAD_LOCKTYPE_RECURSIVE 1
    #define EVTHREAD_LOCKTYPE_READWRITE 2
    
    #define EVTHREAD_LOCK_API_VERSION 1
    
    struct evthread_lock_callbacks {
            int lock_api_version;
            unsigned supported_locktypes;
            void *(*alloc)(unsigned locktype);
            void (*free)(void *lock, unsigned locktype);
            int (*lock)(unsigned mode, void *lock);
            int (*unlock)(unsigned mode, void *lock);
    };
    int evthread_set_lock_callbacks(const struct evthread_lock_callbacks *);
    void evthread_set_id_callback(unsigned long (*id_fn)(void));
    struct evthread_condition_callbacks {
            int condition_api_version;
            void *(*alloc_condition)(unsigned condtype);
            void (*free_condition)(void *cond);
            int (*signal_condition)(void *cond, int broadcast);
            int (*wait_condition)(void *cond, void *lock,
                            const struct timeval *timeout);
    };
    int evthread_set_condition_callbacks(
            const struct evthread_condition_callbacks *);
  • 相关阅读:
    Elasticsearch学习,请先看这一篇!
    加解密/数字签名/证书 原理
    C# 给对象赋null值会释放内存吗?
    打包常见问题
    友盟推送
    谈一谈可能用到数据持久化的地方
    浅谈设置字体大小
    AFN和SDWebImage请求网络图片的一点问题
    linux学习(1)——这是一个新的开始,加油吧少年
    C指针——简单总结
  • 原文地址:https://www.cnblogs.com/wuwangchuxin0924/p/9795337.html
Copyright © 2020-2023  润新知