aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoredy555 <edy555@gmail.com>2012-12-08 22:49:25 +0900
committerHoernchen <la@tfc-server.de>2012-12-28 18:59:41 +0100
commitaa60c2aaedfdc2de6c83843fcdb1c87d9522c1f0 (patch)
tree553be237033663daf6cb423bc9aa82dda7b70b4f
parent196bb151699f6802c84a65dd456e5b1139859d00 (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.c26
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;