| 1000 | } |
| 1001 | |
| 1002 | static ssize_t rpmsg_socket_send_continuous(FAR struct socket *psock, |
| 1003 | FAR const struct iovec *buf, |
| 1004 | size_t iovcnt, bool nonblock) |
| 1005 | { |
| 1006 | FAR struct rpmsg_socket_conn_s *conn = psock->s_conn; |
| 1007 | uint32_t len = rpmsg_socket_get_iovlen(buf, iovcnt); |
| 1008 | uint32_t written = 0; |
| 1009 | uint32_t offset = 0; |
| 1010 | int ret = 0; |
| 1011 | |
| 1012 | while (written < len) |
| 1013 | { |
| 1014 | FAR struct rpmsg_socket_data_s *msg; |
| 1015 | uint32_t block_written = 0; |
| 1016 | uint32_t ipcsize; |
| 1017 | uint32_t block; |
| 1018 | |
| 1019 | nxmutex_lock(&conn->sendlock); |
| 1020 | block = MIN(len - written, rpmsg_socket_get_space(conn)); |
| 1021 | nxmutex_unlock(&conn->sendlock); |
| 1022 | |
| 1023 | if (block == 0) |
| 1024 | { |
| 1025 | if (nonblock) |
| 1026 | { |
| 1027 | ret = -EAGAIN; |
| 1028 | break; |
| 1029 | } |
| 1030 | |
| 1031 | ret = net_sem_timedwait(&conn->sendsem, |
| 1032 | _SO_TIMEOUT(conn->sconn.s_sndtimeo)); |
| 1033 | if (!conn->ept.rdev || conn->unbind) |
| 1034 | { |
| 1035 | ret = -ECONNRESET; |
| 1036 | } |
| 1037 | |
| 1038 | if (ret < 0) |
| 1039 | { |
| 1040 | break; |
| 1041 | } |
| 1042 | |
| 1043 | continue; |
| 1044 | } |
| 1045 | |
| 1046 | msg = rpmsg_get_tx_payload_buffer(&conn->ept, &ipcsize, true); |
| 1047 | if (!msg) |
| 1048 | { |
| 1049 | ret = -EINVAL; |
| 1050 | break; |
| 1051 | } |
| 1052 | |
| 1053 | nxmutex_lock(&conn->sendlock); |
| 1054 | block = MIN(len - written, rpmsg_socket_get_space(conn)); |
| 1055 | block = MIN(block, ipcsize - sizeof(*msg)); |
| 1056 | |
| 1057 | msg->cmd = RPMSG_SOCKET_CMD_DATA; |
| 1058 | msg->pos = conn->recvpos; |
| 1059 | msg->len = block; |
no test coverage detected