diff options
author | edy555 <edy555@gmail.com> | 2012-12-08 22:49:25 +0900 |
---|---|---|
committer | Hoernchen <la@tfc-server.de> | 2012-12-28 18:59:41 +0100 |
commit | aa60c2aaedfdc2de6c83843fcdb1c87d9522c1f0 (patch) | |
tree | 553be237033663daf6cb423bc9aa82dda7b70b4f | |
parent | 196bb151699f6802c84a65dd456e5b1139859d00 (diff) |
fix segv on reconnect
Signed-off-by: Hoernchen <la@tfc-server.de>
improve staibility (for sdr#)
Signed-off-by: Hoernchen <la@tfc-server.de>
-rw-r--r-- | src/rtl_tcp.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/src/rtl_tcp.c b/src/rtl_tcp.c index eeab395..bd02c61 100644 --- a/src/rtl_tcp.c +++ b/src/rtl_tcp.c @@ -123,8 +123,10 @@ sighandler(int signum) static void sighandler(int signum) { fprintf(stderr, "Signal caught, exiting!\n"); - do_exit = 1; - rtlsdr_cancel_async(dev); + if (!do_exit) { + rtlsdr_cancel_async(dev); + do_exit = 1; + } } #endif @@ -206,11 +208,15 @@ static void *tcp_worker(void *arg) r = select(s+1, NULL, &writefds, NULL, &tv); if(r) { bytessent = send(s, &curelem->data[index], bytesleft, 0); - if (bytessent == SOCKET_ERROR || do_exit) { - printf("worker socket error\n"); + if (bytessent == SOCKET_ERROR) { + perror("worker socket error"); sighandler(0); dead[0]=1; pthread_exit(NULL); + } else if (do_exit) { + printf("do_exit\n"); + dead[0]=1; + pthread_exit(NULL); } else { bytesleft -= bytessent; index += bytessent; @@ -260,11 +266,15 @@ static void *command_worker(void *arg) r = select(s+1, &readfds, NULL, NULL, &tv); if(r) { received = recv(s, (char*)&cmd+(sizeof(cmd)-left), left, 0); - if(received == SOCKET_ERROR || do_exit){ - printf("comm recv socket error\n"); + if(received == SOCKET_ERROR){ + perror("comm recv socket error"); sighandler(0); dead[1]=1; pthread_exit(NULL); + } else if(do_exit){ + printf("do exit\n"); + dead[1]=1; + pthread_exit(NULL); } else { left -= received; } @@ -514,12 +524,14 @@ int main(int argc, char **argv) r = rtlsdr_read_async(dev, rtlsdr_callback, (void *)0, buf_num, 0); - closesocket(s); if(!dead[0]) pthread_join(tcp_worker_thread, &status); + dead[0]=0; if(!dead[1]) pthread_join(command_thread, &status); + dead[1]=0; + closesocket(s); printf("all threads dead..\n"); curelem = ll_buffers; |