aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHoernchen <la@tfc-server.de>2013-12-27 00:21:26 +0100
committerSteve Markgraf <steve@steve-m.de>2013-12-27 00:22:30 +0100
commit7855c7c8768c91fd47425136bb4c151d0abdc224 (patch)
tree5f8b62d31ad947365ba5bfbe0925f7efb51209fa
parent67302f466577501001fd6e0efac8c422afc713ff (diff)
rtl_tcp: clean up error handling
Signed-off-by: Steve Markgraf <steve@steve-m.de>
-rw-r--r--src/rtl_tcp.c67
1 files changed, 18 insertions, 49 deletions
diff --git a/src/rtl_tcp.c b/src/rtl_tcp.c
index 8b6431e..6a4a55e 100644
--- a/src/rtl_tcp.c
+++ b/src/rtl_tcp.c
@@ -1,7 +1,7 @@
/*
* rtl-sdr, turns your Realtek RTL2832 based DVB dongle into a SDR receiver
* Copyright (C) 2012 by Steve Markgraf <steve@steve-m.de>
- * Copyright (C) 2012 by Hoernchen <la@tfc-server.de>
+ * Copyright (C) 2012-2013 by Hoernchen <la@tfc-server.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -59,7 +59,6 @@ static pthread_t tcp_worker_thread;
static pthread_t command_thread;
static pthread_cond_t exit_cond;
static pthread_mutex_t exit_cond_lock;
-static volatile int dead[2] = {0, 0};
static pthread_mutex_t ll_mutex;
static pthread_cond_t cond;
@@ -82,7 +81,7 @@ int global_numq = 0;
static struct llist *ll_buffers = 0;
int llbuf_num=500;
-static int do_exit = 0;
+static volatile int do_exit = 0;
void usage(void)
{
@@ -135,10 +134,8 @@ sighandler(int signum)
static void sighandler(int signum)
{
fprintf(stderr, "Signal caught, exiting!\n");
- if (!do_exit) {
- rtlsdr_cancel_async(dev);
- do_exit = 1;
- }
+ rtlsdr_cancel_async(dev);
+ do_exit = 1;
}
#endif
@@ -210,7 +207,6 @@ static void *tcp_worker(void *arg)
pthread_mutex_unlock(&ll_mutex);
printf("worker cond timeout\n");
sighandler(0);
- dead[0]=1;
pthread_exit(NULL);
}
@@ -230,23 +226,12 @@ 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) {
- 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;
- }
- } else if(do_exit) {
+ bytesleft -= bytessent;
+ index += bytessent;
+ }
+ if(bytessent == SOCKET_ERROR || do_exit) {
printf("worker socket bye\n");
sighandler(0);
- dead[0]=1;
pthread_exit(NULL);
}
}
@@ -306,22 +291,11 @@ 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){
- 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;
- }
- } else if(do_exit) {
+ left -= received;
+ }
+ if(received == SOCKET_ERROR || do_exit) {
printf("comm recv bye\n");
sighandler(0);
- dead[1] = 1;
pthread_exit(NULL);
}
}
@@ -528,12 +502,12 @@ int main(int argc, char **argv)
setsockopt(listensocket, SOL_SOCKET, SO_LINGER, (char *)&ling, sizeof(ling));
bind(listensocket,(struct sockaddr *)&local,sizeof(local));
- #ifdef _WIN32
+#ifdef _WIN32
ioctlsocket(listensocket, FIONBIO, &blockmode);
- #else
+#else
r = fcntl(listensocket, F_GETFL, 0);
r = fcntl(listensocket, F_SETFL, r | O_NONBLOCK);
- #endif
+#endif
while(1) {
printf("listening...\n");
@@ -586,13 +560,8 @@ int main(int argc, char **argv)
r = rtlsdr_read_async(dev, rtlsdr_callback, NULL, buf_num, 0);
- if(!dead[0])
- pthread_join(tcp_worker_thread, &status);
- dead[0]=0;
-
- if(!dead[1])
- pthread_join(command_thread, &status);
- dead[1]=0;
+ pthread_join(tcp_worker_thread, &status);
+ pthread_join(command_thread, &status);
closesocket(s);
@@ -615,9 +584,9 @@ out:
rtlsdr_close(dev);
closesocket(listensocket);
closesocket(s);
- #ifdef _WIN32
+#ifdef _WIN32
WSACleanup();
- #endif
+#endif
printf("bye!\n");
return r >= 0 ? r : -r;
}