wangzhengquan
2021-02-04 6600a375ac386a0d384c4e9f1af4f235b8d67262
src/socket/shm_socket.cpp
@@ -153,7 +153,7 @@
  int rv;
 
  shm_packet_t sendpak;
  shm_packet_t sendpak = {0};
  sendpak.key = sockt->key;
  sendpak.size = size;
  sendpak.buf = mm_malloc(size);
@@ -242,48 +242,38 @@
}
/**
 * @callback  void (*recv_callback_fn)(void **sendbuf, int *sendsize)
 * @callback  void (*recvandsend_callback_fn)(void *recvbuf, int recvsize, int key, void **sendbuf, int *sendsize)
 *            sendbuf 和 sendsize是callbak_fn回调函数的返回值, 分别表示发送数据,和发送数据的大小。
 * 
 */
int shm_recvandsend(shm_socket_t *sockt, void **recvbuf, int *recvsize, int *key, recv_callback_fn callback,
  const struct timespec *timeout, int flag) {
int shm_recvandsend(shm_socket_t *sockt,  recvandsend_callback_fn callback,
  const struct timespec *timeout, int flag, void *user_data) {
  
  int rv;
 
  void *sendbuf = NULL;
  int sendsize = 0;
  shm_packet_t recvpak;
  shm_packet_t recvpak = {0};
  rv = shm_recvpakfrom(sockt , &recvpak, timeout, flag);
  if (rv != 0) {
    if(rv == ETIMEDOUT)
    if(rv == ETIMEDOUT){
      logger->debug("%d shm_recvfrom failed %s", shm_socket_get_key(sockt), bus_strerror(EBUS_TIMEOUT));
      return EBUS_TIMEOUT;
    }
    
    logger->debug("%d shm_recvfrom failed %s", shm_socket_get_key(sockt), bus_strerror(rv));
    logger->error("%d shm_recvfrom failed %s", shm_socket_get_key(sockt), bus_strerror(rv));
    return rv;
  }
   
  if(recvbuf != NULL) {
    void *_buf = malloc(recvpak.size);
    memcpy(_buf, recvpak.buf, recvpak.size);
    *recvbuf = _buf;
  }
  if(recvsize != NULL)
    *recvsize = recvpak.size;
  if(key != NULL)
    *key = recvpak.key;
  void *recvbuf = malloc(recvpak.size);
  memcpy(recvbuf, recvpak.buf, recvpak.size);
  mm_free(recvpak.buf);
  callback(recvbuf, recvpak.size, recvpak.key, &sendbuf, &sendsize, user_data);
  callback(&sendbuf, &sendsize);
  shm_packet_t sendpak;
  shm_packet_t sendpak = {0};
  sendpak.key = sockt->key;
  sendpak.size = sendsize;
  memcpy(sendpak.uuid, recvpak.uuid, sizeof sendpak.uuid);