[tuxdroid-svn] r322 - in daemon/trunk: . libs
Status: Beta
Brought to you by:
ks156
From: neimad <c2m...@c2...> - 2007-05-19 11:27:10
|
Author: neimad Date: 2007-05-19 13:26:40 +0200 (Sat, 19 May 2007) New Revision: 322 Modified: daemon/trunk/libs/USBDaemon_command_tux.c daemon/trunk/libs/USBDaemon_globals.h daemon/trunk/libs/USBDaemon_log.c daemon/trunk/libs/USBDaemon_tcp_server.c daemon/trunk/libs/USBDaemon_tcp_server.h daemon/trunk/libs/USBDaemon_usb_enum.c daemon/trunk/libs/USBDaemon_usb_enum.h daemon/trunk/libs/USBDaemon_usb_readWrite.c daemon/trunk/main.c Log: * Got rid of the so-called "USB thread". It merely periodically checked whether the dongle was still connected and updated tux's status. This is now performed by specifying a timeout to select(). NOTE: the current implementation assumes that select() "modifies the timeout to reflect the amount of time not slept" (see manpage), which is the case on Linux but is not portable. A subsequent patch will fix this. * The change above means tuxdaemon is now a single threaded process, hence I got rid of all the pthread locking. It didn't seem to be of any use, anyway. As a nice side-effect, the thread-related problem encountered on the NSLU2 (as reported by Philippe Teuwen aka doegox) is solved. * Renamed tcp_server_start_task() to tcp_server_loop(). Modified: daemon/trunk/libs/USBDaemon_command_tux.c =================================================================== --- daemon/trunk/libs/USBDaemon_command_tux.c 2007-05-19 11:04:04 UTC (rev 321) +++ daemon/trunk/libs/USBDaemon_command_tux.c 2007-05-19 11:26:40 UTC (rev 322) @@ -242,7 +242,6 @@ switch (data[0]) { case SUB_D_CMD_STRUC_DISCONNECT_CLIENT: - pthread_mutex_lock(&tcp_mutex); /* Byte 2 equal id client to disconnect */ if (tcp_clients_handle[data[1]] >= 0) { @@ -253,13 +252,10 @@ { /* Bad id client */ result[0] = ACK_CMD_KO; } - pthread_mutex_unlock(&tcp_mutex); break; case SUB_D_CMD_STRUC_DISCONNECT_CLIENT_ME: - pthread_mutex_lock(&tcp_mutex); tcp_remove_client(id_client); result[0] = ACK_CMD_NO_ACK; - pthread_mutex_unlock(&tcp_mutex); break; case SUB_D_CMD_STRUC_KILL_DAEMON: log_warning("daemon killed by user"); Modified: daemon/trunk/libs/USBDaemon_globals.h =================================================================== --- daemon/trunk/libs/USBDaemon_globals.h 2007-05-19 11:04:04 UTC (rev 321) +++ daemon/trunk/libs/USBDaemon_globals.h 2007-05-19 11:26:40 UTC (rev 322) @@ -26,7 +26,6 @@ /*_____________________ I N C L U D E S____________________________________ */ #include <usb.h> -#include <pthread.h> /*_____________________ D E F I N E S ______________________________________*/ Modified: daemon/trunk/libs/USBDaemon_log.c =================================================================== --- daemon/trunk/libs/USBDaemon_log.c 2007-05-19 11:04:04 UTC (rev 321) +++ daemon/trunk/libs/USBDaemon_log.c 2007-05-19 11:26:40 UTC (rev 322) @@ -5,6 +5,7 @@ #include <stdlib.h> #include <stdio.h> #include <stdarg.h> +#include <time.h> #include <assert.h> #include <syslog.h> Modified: daemon/trunk/libs/USBDaemon_tcp_server.c =================================================================== --- daemon/trunk/libs/USBDaemon_tcp_server.c 2007-05-19 11:04:04 UTC (rev 321) +++ daemon/trunk/libs/USBDaemon_tcp_server.c 2007-05-19 11:26:40 UTC (rev 322) @@ -33,6 +33,8 @@ #include "USBDaemon_command_tux.h" #include "USBDaemon_status_table.h" #include "USBDaemon_tcp_server.h" +#include "USBDaemon_usb_enum.h" +#include "USBDaemon_usb_readWrite.h" #include "USBDaemon_pidfile.h" #include "USBDaemon_log.h" @@ -41,7 +43,6 @@ int tcp_server_handle = -1; struct sockaddr_in tcp_server_sockaddr; tux_tcp_status_t tux_tcp_status = TUX_TCP_STATUS_DOWN; -pthread_mutex_t tcp_mutex; int tcp_clients_handle[TUX_MAX_TCP_CLIENTS] = {[(0)...(TUX_MAX_TCP_CLIENTS - 1)] = -1 }; @@ -50,18 +51,35 @@ /*_____________________ F U N C T I O N S __________________________________*/ +/** + * Update/check Tux status. + * + * @return 1 if tux is present, 0 otherwise + */ +static int update_tux_status(void) +{ + static int check_count = 0; + + check_count = (check_count + 1) % 16; + if (check_count == 0 && usb_find_TuxDroid() == NULL) + return 0; + + usb_get_status_TuxDroid(); + + return 1; +} + /************************************************************************ */ /* tcp_server_start_task() */ /************************************************************************ */ -void *tcp_server_start_task(void *unused) +void *tcp_server_loop(void) { +#define TIMEOUT ((struct timeval){ .tv_sec = 0, .tv_usec = 50000 }) tcp_frame_t datas_recv; int val; - pthread_mutex_init(&tcp_mutex, NULL); - if ((tcp_server_handle = socket(AF_INET, SOCK_STREAM, 0)) < 0) { log_error("TCP socket: socket creation failed: %m"); @@ -98,6 +116,7 @@ while (tcp_server_handle >= 0) { + struct timeval timeout = TIMEOUT; fd_set rset; int i, r, fdmax; @@ -106,7 +125,6 @@ fdmax = tcp_server_handle; /* Client connection */ - pthread_mutex_lock(&tcp_mutex); for (i = 0; i < TUX_MAX_TCP_CLIENTS; i++) if (tcp_clients_handle[i] >= 0) { @@ -114,18 +132,27 @@ if (tcp_clients_handle[i] > fdmax) fdmax = tcp_clients_handle[i]; } - pthread_mutex_unlock(&tcp_mutex); - r = select(fdmax + 1, &rset, NULL, NULL, NULL); - if (r < 0) + r = select(fdmax + 1, &rset, NULL, NULL, &timeout); + if (r == 0) { + if (!update_tux_status()) + { + log_error("Tux dongle is disconnected"); + /* FIXME: exit loop cleanly */ + exit(1); + } + + timeout = TIMEOUT; + } + else if (r < 0) + { if (errno == EINTR) continue; break; } /* Incoming connection request ? */ - pthread_mutex_lock(&tcp_mutex); if (FD_ISSET(tcp_server_handle, &rset)) { int tmp_client = @@ -167,18 +194,10 @@ r = recv(tcp_clients_handle[i], datas_recv, sizeof(datas_recv), 0); if (r == 0) - { tcp_remove_client(i); - } else if (r > 0) - { - pthread_mutex_unlock(&tcp_mutex); commands_dispatcher((unsigned char)i, datas_recv); - pthread_mutex_lock(&tcp_mutex); - } } - - pthread_mutex_unlock(&tcp_mutex); } return NULL; @@ -193,13 +212,8 @@ { int i; - pthread_mutex_lock(&tcp_mutex); - if (tux_tcp_status == TUX_TCP_STATUS_DOWN) - { - pthread_mutex_unlock(&tcp_mutex); return; - } for (i = 0; i < TUX_MAX_TCP_CLIENTS; i++) { @@ -209,8 +223,6 @@ if (send(tcp_clients_handle[i], data, sizeof(tcp_frame_t), 0) == 0) tcp_remove_client(i); } - - pthread_mutex_unlock(&tcp_mutex); } /************************************************************************ */ @@ -220,13 +232,8 @@ /************************************************************************ */ void tcp_server_send_raw_to_client(int client_index, const tcp_frame_t data) { - pthread_mutex_lock(&tcp_mutex); - if (tux_tcp_status == TUX_TCP_STATUS_DOWN) - { - pthread_mutex_unlock(&tcp_mutex); return; - } if (tcp_clients_handle[client_index] >= 0) { @@ -234,8 +241,6 @@ == 0) tcp_remove_client(client_index); } - - pthread_mutex_unlock(&tcp_mutex); } /************************************************************************ */ @@ -255,9 +260,7 @@ tcp_server_send_raw(data); - pthread_mutex_lock(&tcp_mutex); close(tcp_server_handle); - pthread_mutex_unlock(&tcp_mutex); usleep(10000); } Modified: daemon/trunk/libs/USBDaemon_tcp_server.h =================================================================== --- daemon/trunk/libs/USBDaemon_tcp_server.h 2007-05-19 11:04:04 UTC (rev 321) +++ daemon/trunk/libs/USBDaemon_tcp_server.h 2007-05-19 11:26:40 UTC (rev 322) @@ -53,10 +53,9 @@ extern int tcp_clients_handle[]; extern unsigned char tcp_clients_count; extern client_name_t tcp_clients_name[]; -extern pthread_mutex_t tcp_mutex; /*_____________________ F U N C T I O N S __________________________________*/ -extern void *tcp_server_start_task(void *unused); +extern void *tcp_server_loop(void); extern void tcp_server_send_raw(const tcp_frame_t data); extern void tcp_server_send_raw_to_client(int client_index, const tcp_frame_t data); Modified: daemon/trunk/libs/USBDaemon_usb_enum.c =================================================================== --- daemon/trunk/libs/USBDaemon_usb_enum.c 2007-05-19 11:04:04 UTC (rev 321) +++ daemon/trunk/libs/USBDaemon_usb_enum.c 2007-05-19 11:26:40 UTC (rev 322) @@ -37,7 +37,6 @@ usb_dev_handle *tux_handle; struct usb_device *tux_device; TUX_USB_CONN_STATUS TUX_USB_STATUS = TUX_USB_DISCONNECTED; -pthread_mutex_t usb_mutex; /*_____________________ F U N C T I O N S __________________________________*/ @@ -46,7 +45,7 @@ /* usb_find_TuxDroid() */ /************************************************************************ */ -static struct usb_device *usb_find_TuxDroid() +struct usb_device *usb_find_TuxDroid() { struct usb_bus *bus; struct usb_device *tux_dev; @@ -108,7 +107,6 @@ /************************************************************************ */ int usb_init_TuxDroid(void) { - pthread_mutex_init(&usb_mutex, NULL); /* Find Tux */ do { @@ -139,44 +137,11 @@ return 0; } - return 1; -} - -/************************************************************************ */ - -/* usb_start_task_TuxDroid() */ - -/************************************************************************ */ -void *usb_start_task(void *unused) -{ - unsigned char dongle_is_present_counter; - - usleep(50000); - TUX_USB_STATUS = TUX_USB_CONNECTED; /* Reinit audio channel */ send_usb_dongle_cmd(0x02, 0, 0, 0); current_audio_channel = 0; - /* Read loop */ - dongle_is_present_counter = 0; - while (tux_handle) - { - /* Make circular the variable to 16 values */ - dongle_is_present_counter = (dongle_is_present_counter + 1) & 0x0F; - /* Once on 16, we test the presence of the dongle */ - if (dongle_is_present_counter == 0) - if (usb_find_TuxDroid() == NULL) - { - log_error("Tux dongle is disconnected"); - send_daemon_disconnected(); - exit(1); - } - - usb_get_status_TuxDroid(); - usleep(50000); - } - - return NULL; + return 1; } Modified: daemon/trunk/libs/USBDaemon_usb_enum.h =================================================================== --- daemon/trunk/libs/USBDaemon_usb_enum.h 2007-05-19 11:04:04 UTC (rev 321) +++ daemon/trunk/libs/USBDaemon_usb_enum.h 2007-05-19 11:26:40 UTC (rev 322) @@ -39,10 +39,10 @@ /*_____________________ V A R I A B L E S __________________________________*/ extern usb_dev_handle *tux_handle; extern TUX_USB_CONN_STATUS TUX_USB_STATUS; -extern pthread_mutex_t usb_mutex; /*_____________________ F U N C T I O N S __________________________________*/ -extern void *usb_start_task(void *unused); + +extern struct usb_device *usb_find_TuxDroid(); extern int usb_init_TuxDroid(void); #endif Modified: daemon/trunk/libs/USBDaemon_usb_readWrite.c =================================================================== --- daemon/trunk/libs/USBDaemon_usb_readWrite.c 2007-05-19 11:04:04 UTC (rev 321) +++ daemon/trunk/libs/USBDaemon_usb_readWrite.c 2007-05-19 11:26:40 UTC (rev 322) @@ -48,11 +48,9 @@ for (i = 0; i < 5; i++) { - pthread_mutex_lock(&usb_mutex); idx = usb_interrupt_read(tux_handle, TUX_READ_EP, (char *)data, TUX_RECV_LENGTH, TUX_READ_TIMEOUT); - pthread_mutex_unlock(&usb_mutex); if (idx != TUX_RECV_LENGTH) i = 0; @@ -83,31 +81,20 @@ cmd_send[3] = 0x00; cmd_send[4] = 0x00; - pthread_mutex_lock(&usb_mutex); - if (TUX_USB_CONNECTED != TUX_USB_STATUS) - { - pthread_mutex_unlock(&usb_mutex); return; - } idx = usb_interrupt_write(tux_handle, TUX_WRITE_EP, (char *)cmd_send, sizeof(cmd_send), TUX_WRITE_TIMEOUT); if (idx <= 0) - { - pthread_mutex_unlock(&usb_mutex); return; - } idx = usb_interrupt_read(tux_handle, TUX_READ_EP, (char *)data, sizeof(data), TUX_READ_TIMEOUT); if (idx <= 0) - { - pthread_mutex_unlock(&usb_mutex); return; - } cmd_dispatch[0] = data[0]; cmd_dispatch[1] = data[1]; @@ -137,8 +124,6 @@ update_raw_status_table(cmd_dispatch); } } - - pthread_mutex_unlock(&usb_mutex); } /************************************************************************ */ @@ -152,13 +137,8 @@ unsigned char counter; unsigned char csf; - pthread_mutex_lock(&usb_mutex); - if (TUX_USB_CONNECTED != TUX_USB_STATUS) - { - pthread_mutex_unlock(&usb_mutex); return ACK_CMD_DONGLE_NOT_PRESENT; - } /* Send data */ cmd_status_flag = 1; @@ -168,13 +148,9 @@ counter = 0; csf = cmd_status_flag; - pthread_mutex_unlock(&usb_mutex); - while (csf) { - pthread_mutex_lock(&usb_mutex); csf = cmd_status_flag; - pthread_mutex_unlock(&usb_mutex); counter++; usleep(10000); Modified: daemon/trunk/main.c =================================================================== --- daemon/trunk/main.c 2007-05-19 11:04:04 UTC (rev 321) +++ daemon/trunk/main.c 2007-05-19 11:26:40 UTC (rev 322) @@ -26,8 +26,6 @@ #include <stdlib.h> #include <string.h> #include <usb.h> -#include <glib.h> -#include <glib-object.h> #include <errno.h> #include <sys/types.h> #include <sys/stat.h> @@ -274,10 +272,6 @@ /************************************************************************ */ int main(int argc, char *argv[]) { - GMainLoop *loop; - GThread *UsbThread; - GThread *TcpThread; - GError *error = NULL; unsigned char i; log_target_t log_target = LOG_TARGET_SYSLOG; log_level_t log_level = LOG_LEVEL_INFO; @@ -350,40 +344,9 @@ /* open USB handler and setuid nobody */ if (!usb_init_TuxDroid()) - { exit(1); - } - /* Gestion Multithread */ - if (!g_thread_supported()) - { - g_thread_init(NULL); - } - else - { - log_error("g_thread NOT supported"); - exit(1); - } - /* Start USB task thread */ - UsbThread = - g_thread_create((GThreadFunc) usb_start_task, NULL, TRUE, &error); - if (UsbThread == NULL) - { - log_error("Thread creation failed: %s", error->message); - exit(2); - } - /* Start TCP task thread */ - TcpThread = - g_thread_create((GThreadFunc) tcp_server_start_task, NULL, TRUE, - &error); - if (TcpThread == NULL) - { - log_error("Thread creation failed: %s", error->message); - exit(2); - } + tcp_server_loop(); - loop = g_main_loop_new(NULL, FALSE); - g_main_loop_run(loop); - exit(0); } |