| | |
| | | } |
| | | |
| | | /** |
| | | * @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, |
| | | int shm_recvandsend(shm_socket_t *sockt, recvandsend_callback_fn callback, |
| | | const struct timespec *timeout, int flag, void *user_data) { |
| | | |
| | | int rv; |
| | |
| | | |
| | | 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(&sendbuf, &sendsize, user_data); |
| | | callback(recvbuf, recvpak.size, recvpak.key, &sendbuf, &sendsize, user_data); |
| | | |
| | | shm_packet_t sendpak; |
| | | sendpak.key = sockt->key; |