• cxx11emu.h 和 logprint.h


    cxx11emu.h 和 logprint.h

    /* Start of cxx11emu.h */
    
    #ifndef STDBP_CXX11EMU_H_
    #define STDBP_CXX11EMU_H_
    
    #if defined(__cplusplus) || defined(c_plusplus)
    
    /// @todo Value may not be correct, because as of writing C++17 isn't official
    #if __cplusplus >= 201703L
    #define CPP17
    #endif
    #if __cplusplus >= 201402L
    #define CPP14
    #endif
    #if __cplusplus >= 201103L
    #define CPP11
    #endif
    
    /* Namespace macros. It's sometimes necessary to put something into the "std"
     * namespace. For example, a specialization of std::hash. These macros can be
     * used to put the code in the correct namespace.
     */
    #ifdef CPP17
    #define CPP17_NAMESPACE std
    #else
    #define CPP17_NAMESPACE cpp17
    #endif
    #ifdef CPP14
    #define CPP14_NAMESPACE std
    #else
    #define CPP14_NAMESPACE cpp14
    #endif
    #ifdef CPP11
    #define CPP11_NAMESPACE std
    #else
    #define CPP11_NAMESPACE cpp11
    #endif
    
    namespace cpp11
    {
    }
    
    #ifndef CPP11
    namespace cpp11
    {
    class nullptr_t
    {
    public:
        nullptr_t(): pad_(0)
        {
        }
    
        template< class T >
        operator T*() const
        {
            return 0;
        }
    
        template< class C, class T >
        operator T C::*( ) const
        {
            return 0;
        }
    private:
        void* pad_; /* std requires : sizeof(nullptr_t) == sizeof(void*) */ 
        void operator&() const;
    };
    
    const cpp11::nullptr_t nullptr;
    }
    
    namespace cpp11
    {
    /* Static assertions */
    #ifndef static_assert
    #define XXJOIN(x, y) XXJOIN_AGAIN(x, y)
    #define XXJOIN_AGAIN(x, y) x##y
    #define static_assert(exp) typedef char 
        CONCATE(assertion_failed_at_line_, __LINE__)[(exp) ? 1 : -1]
    #define static_assert2(exp, str) typedef char 
        CONCATE(str##_at_Line, __LINE__)[(exp) ? 1 : -1]
    #endif /* End of static_assert */
    } // namespace cpp11
    
    #endif /* End of CPP11 */
    
    namespace cpp14
    {
    }
    
    namespace cpp17
    {
    }
    
    /* cpp points to either std or cpp11/14/17 as appropriate
     */
    namespace cpp
    {
    using namespace ::std;
    using namespace ::cpp11;
    using namespace ::cpp14;
    using namespace ::cpp17;
    }
    
    #endif /* End of defined(__cplusplus) || defined(c_plusplus) */
    
    #endif /* End of STDBP_CXX11EMU_H_ */
    
    /* End of cxx11emu.h */
    /* Start of logprint.h */
    
    #ifndef UTIL_LOGPRINT_H_
    #define UTIL_LOGPRINT_H_
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdarg.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <sys/types.h>
    
    /**
     * 在使用 FreeBSD 平台上, 使用 -pthread (注意,没有'l') 参数,
     * gcc 会自动链接系统当前版本推荐的 thread lib 以及对应的 thread safe 的 c func。
     * 参考: http://www.zeroc.com/forums/help-center/4334-ice-freebsd.html
     * 参考: http://gcc.gnu.org/onlinedocs/libstdc++/manual/using_concurrency.html
     *
     * 注意:FreeBSD 中,其实包含了 libc_r, libthr, libpthread(libkse) 三个版本的多线程库。
     * lib_r, Reentrant C Library,最老的版本,基本废弃。
     * libthr, 1:1 thread model,8.0 开始,它就是默认的库。
     * libpthread(libkse), M:N thread model,6.x, 7.x 下的默认库。
     * 其中 libpthread 默认使用的是 PTHREAD_SCOPE_PROCESS,而 libthr 用的是 PTHREAD_SCOPE_SYSTEM。
     * 理论上来说,libthr 在多核状态下,且服务器主要就跑你的程序的时候,能更好的利用 cpu。
     * 参考: http://kasicass.blog.163.com/blog/static/395619200911289639311
     * 
     */
    #include <pthread.h>
    
    #if defined(__cplusplus) || defined(c_plusplus)
    extern "C" {
    #endif /* End of defined(__cplusplus) || defined(c_plusplus) */
    
    #define LOGPRINT_PATHNAME        "logprint.log"
    #define LOGPRINT_STRING_LEN        (1024u)
    
    int g_log_fd;
    char g_msg_buf[LOGPRINT_STRING_LEN];
    pthread_mutex_t g_log_mutex;
    
    #ifdef _LOGPRINT_
    
    #define LOGPRINT(fmt, args...)                                                   
        do                                                                           
        {                                                                            
            pthread_mutex_lock(&g_log_mutex);                                        
            g_log_fd = open(LOGPRINT_PATHNAME, O_WRONLY | O_CREAT | O_APPEND, 0666); 
            sprintf(g_msg_buf, "pid(%d):tid(%lu):file(%s):func(%s):line(%d) - " fmt, 
                    (int)getpid(), (unsigned long int)pthread_self(),                
                    __FILE__, __func__, __LINE__, ##args);                           
            write(g_log_fd, g_msg_buf, strlen(g_msg_buf));                           
            close(g_log_fd);                                                         
            pthread_mutex_unlock(&g_log_mutex);                                      
        } while (0)
    
    #else
    
    #define LOGPRINT(fmt, args...) NULL
    
    #endif /* End of _LOGPRINT_ */
    
    #if defined(__cplusplus) || defined(c_plusplus)
    } // End of extern "C"
    #endif /* End of defined(__cplusplus) || defined(c_plusplus) */
    
    #endif /* End of UTIL_LOGPRINT_H_ */

    ================ End

  • 相关阅读:
    Redis之HyperLoglog
    Mycat面试知识点总结
    Redis持久化之混合aof,rdb
    Redis之缓存穿透,缓存击穿,缓存雪崩
    Redis参数解析之--输出缓冲区
    Https简单流程
    Spring之PropertyPlaceholderConfigurer源码分析
    Redis之位数组的实现(一)--数据结构
    Redis之订阅是怎么实现的
    反射
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/11696025.html
Copyright © 2020-2023  润新知