wangzhengquan
2021-02-24 fcdbbd495c15b0b12e03f50a5c5fa1a6c30a737b
update
4个文件已修改
45 ■■■■■ 已修改文件
src/CMakeLists.txt 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/logger_factory.cpp 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/socket/shm_socket.cpp 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
test_net_socket/net_mod_socket.sh 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/CMakeLists.txt
@@ -32,7 +32,7 @@
if (BUILD_SHARED_LIBS)
  add_library(shm_queue SHARED ${_SOURCES_})
else()
 add_library(shm_queue SHARED ${_SOURCES_})
 add_library(shm_queue STATIC ${_SOURCES_})
endif()
# STATIC SHARED
src/logger_factory.cpp
@@ -18,7 +18,7 @@
    config.logFile = logFile;
#ifdef BUILD_Debug
    config.level = Logger::INFO;
    config.level = Logger::DEBUG;
    config.console = 1;
#else
    config.level = Logger::ERROR;
src/socket/shm_socket.cpp
@@ -17,10 +17,10 @@
}
static pthread_once_t _once_ = PTHREAD_ONCE_INIT;
static pthread_key_t _perthread_socket_key_;
static pthread_key_t _localthread_socket_key_;
static void _destrory_socket_perthread(void *tmp_socket);
static void _create_socket_key_perthread(void);
static void _destrory_threadlocal_socket_(void *tmp_socket);
static void _create_threadlocal_socket_key_(void);
static int shm_recvpakfrom(shm_socket_t *sockt, shm_packet_t *recvpak ,  const struct timespec *timeout,  int flag);
@@ -136,6 +136,11 @@
int shm_socket_close(shm_socket_t *sockt) {
  shm_socket_t * threadlocal_socket = (shm_socket_t *)pthread_getspecific(_localthread_socket_key_);
  if(threadlocal_socket != NULL) {
    _destrory_threadlocal_socket_(threadlocal_socket);
  }
  return _shm_socket_close_(sockt);
}
@@ -283,15 +288,17 @@
// =================================================================================================
 /* Free thread-specific data buffer */
static void _destrory_socket_perthread(void *tmp_socket)
static void _destrory_threadlocal_socket_(void *tmp_socket)
{
  int rv;
  logger->debug("%d destroy threadlocal socket\n", pthread_self());
  if(tmp_socket == NULL)
    return;
  logger->debug("%d destroy tmp socket\n", pthread_self());
  _shm_socket_close_((shm_socket_t *)tmp_socket);
  rv =  pthread_setspecific(_perthread_socket_key_, NULL);
  rv =  pthread_setspecific(_localthread_socket_key_, NULL);
  if ( rv != 0) {
    logger->error(rv, "shm_sendandrecv : pthread_setspecific");
    exit(1);
@@ -299,14 +306,14 @@
}
/* One-time key creation function */
static void _create_socket_key_perthread(void)
static void _create_threadlocal_socket_key_(void)
{
  int s;
  /* Allocate a unique thread-specific data key and save the address
     of the destructor for thread-specific data buffers */
  s = pthread_key_create(&_perthread_socket_key_, _destrory_socket_perthread);
  //s = pthread_key_create(&_perthread_socket_key_, NULL);
  s = pthread_key_create(&_localthread_socket_key_, _destrory_threadlocal_socket_);
  //s = pthread_key_create(&_localthread_socket_key_, NULL);
  if (s != 0) {
     logger->error(s, "pthread_key_create");
     exit(1);
@@ -403,22 +410,22 @@
  shm_packet_t recvpak;
  std::map<int, shm_packet_t>::iterator recvbufIter;
  // 用thread local 保证每个线程用一个独占的socket接受对方返回的信息
  shm_socket_t *tmp_socket;
  shm_socket_t *tmp_socket = NULL;
 
  rv = pthread_once(&_once_, _create_socket_key_perthread);
  rv = pthread_once(&_once_, _create_threadlocal_socket_key_);
  if (rv != 0) {
    logger->error(rv, "shm_sendandrecv pthread_once");
    exit(1);
  }
  tmp_socket = (shm_socket_t *)pthread_getspecific(_perthread_socket_key_);
  tmp_socket = (shm_socket_t *)pthread_getspecific(_localthread_socket_key_);
  if (tmp_socket == NULL)
  {
    /* If first call from this thread, allocate buffer for thread, and save its location */
    logger->debug("%ld create tmp socket\n", (long)pthread_self() );
    logger->debug("%lu create threadlocal socket\n", (long)pthread_self() );
    tmp_socket = shm_socket_open(SHM_SOCKET_DGRAM);
    rv =  pthread_setspecific(_perthread_socket_key_, tmp_socket);
    rv =  pthread_setspecific(_localthread_socket_key_, tmp_socket);
    if ( rv != 0) {
      logger->error(rv, "shm_sendandrecv : pthread_setspecific");
      exit(1);
@@ -502,7 +509,7 @@
      tryn++;
      rv = shm_recvfrom(tmp_socket, recv_buf, recv_size, &recv_key, timeout, flags);
      if(rv != 0) {
        logger->error("_shm_sendandrecv_thread_local : %s\n", bus_strerror(rv));
        logger->error("_shm_sendandrecv_alloc_new : %s\n", bus_strerror(rv));
        return rv;
      }
     
test_net_socket/net_mod_socket.sh
@@ -23,7 +23,7 @@
    ./test_net_mod_socket --fun="start_net_client" \
     --sendlist="localhost:5000:100" \
     --sendlist=" :5000:100" \
     --publist="localhost:5000"