163 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /**
 | |
|  * Copyright (c) 2021 OceanBase
 | |
|  * OceanBase CE is licensed under Mulan PubL v2.
 | |
|  * You can use this software according to the terms and conditions of the Mulan PubL v2.
 | |
|  * You may obtain a copy of Mulan PubL v2 at:
 | |
|  *          http://license.coscl.org.cn/MulanPubL-2.0
 | |
|  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | |
|  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | |
|  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | |
|  * See the Mulan PubL v2 for more details.
 | |
|  */
 | |
| 
 | |
| #ifndef USSL_HOOK_USSL_DEPS_
 | |
| #define USSL_HOOK_USSL_DEPS_
 | |
| 
 | |
| #ifndef ATOMIC_LOAD
 | |
| #define ATOMIC_LOAD(x) __atomic_load_n((x), __ATOMIC_ACQUIRE)
 | |
| #endif
 | |
| 
 | |
| #ifndef ATOMIC_STORE
 | |
| #define ATOMIC_STORE(x, v) __atomic_store_n((x), (v), __ATOMIC_RELEASE)
 | |
| #endif
 | |
| 
 | |
| #ifndef ATOMIC_TAS
 | |
| #define ATOMIC_TAS(val, newv) __sync_lock_test_and_set((val), (newv))
 | |
| #endif
 | |
| 
 | |
| #ifndef ATOMIC_FAA
 | |
| #define ATOMIC_FAA(val, addv) __sync_fetch_and_add((val), (addv))
 | |
| #endif
 | |
| 
 | |
| #ifndef ATOMIC_AAF
 | |
| #define ATOMIC_AAF(val, addv) __sync_add_and_fetch((val), (addv))
 | |
| #endif
 | |
| 
 | |
| #ifndef ATOMIC_VCAS
 | |
| #define ATOMIC_VCAS(val, cmpv, newv) __sync_val_compare_and_swap((val), (cmpv), (newv))
 | |
| #endif
 | |
| 
 | |
| #ifndef ATOMIC_BCAS
 | |
| #define ATOMIC_BCAS(val, cmpv, newv) __sync_bool_compare_and_swap((val), (cmpv), (newv))
 | |
| #endif
 | |
| 
 | |
| 
 | |
| #include <errno.h>
 | |
| #include <stdint.h>
 | |
| #include <sys/socket.h>
 | |
| #include <sys/syscall.h>
 | |
| #include <unistd.h>
 | |
| #include <sys/epoll.h>
 | |
| static pid_t ussl_gettid() { return syscall(SYS_gettid); }
 | |
| 
 | |
| #include <sys/time.h>
 | |
| #include <time.h>
 | |
| static int64_t ussl_get_us()
 | |
| {
 | |
|   struct timeval tv;
 | |
|   gettimeofday(&tv, NULL);
 | |
|   return tv.tv_sec * 1000000 + tv.tv_usec;
 | |
| }
 | |
| 
 | |
| #ifndef ussl_log
 | |
| #include <stdio.h>
 | |
| static const char *ussl_format_ts(char *buf, int64_t limit, int64_t time_us)
 | |
| {
 | |
|   const char *format = "%Y-%m-%d %H:%M:%S";
 | |
|   buf[0] = '\0';
 | |
|   struct tm time_struct;
 | |
|   int64_t time_s = time_us / 1000000;
 | |
|   int64_t cur_second_time_us = time_us % 1000000;
 | |
|   if (NULL != localtime_r(&time_s, &time_struct)) {
 | |
|     int64_t pos = strftime(buf, limit, format, &time_struct);
 | |
|     if (pos < limit) {
 | |
|       snprintf(buf + pos, limit - pos, ".%.6ld", cur_second_time_us);
 | |
|     }
 | |
|   }
 | |
|   return buf;
 | |
| }
 | |
| 
 | |
| #include <string.h>
 | |
| #define __FILENAME__ (strrchr(__FILE__, '/') ? (strrchr(__FILE__, '/') + 1):__FILE__)
 | |
| 
 | |
| #define ussl_log(level, errcode, format, ...)                                                                 \
 | |
|   {                                                                                                           \
 | |
|     char time_str[64];                                                                                        \
 | |
|     (void)errcode;                                                                                            \
 | |
|     ussl_format_ts(time_str, sizeof(time_str), ussl_get_us());                                                \
 | |
|     fprintf(stderr, "[%s] %s %s:%d [%d] %s [ussl_log]" format "\n", time_str, #level, __FILENAME__, __LINE__, \
 | |
|             ussl_gettid(), __func__, ##__VA_ARGS__);                                                          \
 | |
|   }
 | |
| #endif
 | |
| 
 | |
| #define ussl_log_info(...) ussl_log(INFO, oceanbase::common::OB_SUCCESS, ##__VA_ARGS__)
 | |
| #define ussl_log_error(...) ussl_log(ERROR, oceanbase::common::OB_ERR_SYS, ##__VA_ARGS__)
 | |
| #define ussl_log_warn(...) ussl_log(WARN, oceanbase::common::OB_SUCCESS, ##__VA_ARGS__)
 | |
| #define ussl_fatal(...)                                          \
 | |
| {                                                                \
 | |
|   ussl_log(ERROR, oceanbase::common::OB_ERR_SYS, ##__VA_ARGS__); \
 | |
|   exit(1);                                                       \
 | |
| }
 | |
| 
 | |
| #include <stddef.h>
 | |
| 
 | |
| #define ussl_structof(p, T, m) (T *)((char *)p - offsetof(T, m))
 | |
| 
 | |
| #define ussl_arrlen(x) (sizeof(x) / sizeof(x[0]))
 | |
| 
 | |
| typedef struct ussl_dlink_t
 | |
| {
 | |
|   struct ussl_dlink_t *next;
 | |
|   struct ussl_dlink_t *prev;
 | |
| } ussl_dlink_t;
 | |
| 
 | |
| void ussl_dlink_init(ussl_dlink_t *n)
 | |
| {
 | |
|   n->prev = n;
 | |
|   n->next = n;
 | |
| }
 | |
| 
 | |
| void __ussl_dlink_insert(ussl_dlink_t *prev, ussl_dlink_t *next, ussl_dlink_t *n)
 | |
| {
 | |
|   n->prev = prev;
 | |
|   n->next = next;
 | |
|   prev->next = n;
 | |
|   next->prev = n;
 | |
| }
 | |
| 
 | |
| void __ussl_dlink_delete(ussl_dlink_t *prev, ussl_dlink_t *next)
 | |
| {
 | |
|   prev->next = next;
 | |
|   next->prev = prev;
 | |
| }
 | |
| 
 | |
| void ussl_dlink_insert(ussl_dlink_t *head, ussl_dlink_t *n) { __ussl_dlink_insert(head, head->next, n); }
 | |
| 
 | |
| void ussl_dlink_delete(ussl_dlink_t *n)
 | |
| {
 | |
|   if (n->next) {
 | |
|     __ussl_dlink_delete(n->prev, n->next);
 | |
|     n->next = NULL;
 | |
|   }
 | |
| }
 | |
| 
 | |
| #define ussl_dlink_for(head, p) \
 | |
|   for (ussl_dlink_t *p = (head)->next, *_np = p->next; p != (head); p = _np, _np = p->next)
 | |
| 
 | |
| static int (*libc_setsockopt)(int sockfd, int level, int optname, const void *optval,
 | |
|                               socklen_t optlen);
 | |
| static int (*libc_listen)(int sockfd, int backlog);
 | |
| static int (*libc_connect)(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
 | |
| // libc_accept is used in other files, so don't make it static.
 | |
| int (*libc_accept)(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
 | |
| static int (*libc_accept4)(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags);
 | |
| static int (*libc_epoll_ctl)(int epfd, int op, int fd, struct epoll_event *event);
 | |
| static int (*libc_close)(int fd);
 | |
| static ssize_t (*libc_read)(int fd, void *buf, size_t count);
 | |
| static ssize_t (*libc_write)(int fd, const void *buf, size_t count);
 | |
| static ssize_t (*libc_writev)(int fildes, const struct iovec *iov, int iovcnt);
 | |
| 
 | |
| int make_socket_non_blocking(int fd);
 | |
| 
 | |
| #endif // USSL_HOOK_USSL_DEPS_
 | 
