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