On 4/9/24 11:13 PM, Geliang Tang wrote:
+int send_recv_data(int lfd, int fd, uint32_t total_bytes) +{
- ssize_t nr_recv = 0, bytes = 0;
- struct send_recv_arg arg = {
.fd = lfd,
.bytes = total_bytes,
.stop = 0,
- };
- pthread_t srv_thread;
- void *thread_ret;
- char batch[1500];
- int err;
- err = pthread_create(&srv_thread, NULL, send_recv_server, (void *)&arg);
- if (err) {
log_err("pthread_create");
return err;
- }
- /* recv total_bytes */
- while (bytes < total_bytes && !READ_ONCE(arg.stop)) {
nr_recv = recv(fd, &batch,
MIN(total_bytes - bytes, sizeof(batch)), 0);
if (nr_recv == -1 && errno == EINTR)
continue;
if (nr_recv == -1)
break;
bytes += nr_recv;
- }
- if (bytes != total_bytes) {
log_err("recv");
return -1;
This is still not right. It needs to write arg.stop and do pthread_join().
pw-bot: cr
- }
- WRITE_ONCE(arg.stop, 1);
- pthread_join(srv_thread, &thread_ret);
- if (IS_ERR(thread_ret)) {
log_err("thread_ret");
return -1;
- }
- return 0;
+}