diff --git a/src/chat/misc.c b/src/chat/misc.c index b3db261..b59a330 100644 --- a/src/chat/misc.c +++ b/src/chat/misc.c @@ -21,9 +21,9 @@ along with this program. If not, see . #include #include #include -#include #include #include +#include #include @@ -33,6 +33,9 @@ along with this program. If not, see . #include #include +//TIMEOUT STUFF +pthread_t thread_timeout_buffer; + //LINKED LIST STUFF (BIT CHANGED memory.c'S VERSION) typedef struct node { @@ -116,8 +119,6 @@ node_t *get_node(int connection) return buffer; } - - char *get_string_from_json(struct json_object *json, char *string) { struct json_object *object; @@ -216,6 +217,11 @@ char *read_socket_raw(int socket) return content_buffer; } +void *read_socket_raw_thread(void *socket) +{ + return read_socket_raw(*(int*) socket); +} + char *read_socket_from_raw(char *raw) { char *final_message; @@ -250,6 +256,11 @@ void remove_json_syntax_characters(char *text) } } +void alarm_handler() +{ + pthread_cancel(thread_timeout_buffer); +} + //GLOBAL void why2_send_socket(char *text, char *username, int socket) { @@ -308,19 +319,27 @@ void *why2_communicate_thread(void *arg) push_to_list(connection, pthread_self()); //ADD TO LIST - time_t start_time = time(NULL); char *received = NULL; char *raw = NULL; + void *raw_ptr = NULL; char *decoded_buffer; pthread_t thread_buffer; why2_bool exiting = 0; - while ((time(NULL) - start_time) < WHY2_COMMUNICATION_TIME && !exiting) //KEEP COMMUNICATION ALIVE FOR 5 MINUTES [RESET TIMER AT MESSAGE SENT] //TODO: Fix stuck + while (!exiting) //KEEP COMMUNICATION ALIVE FOR 5 MINUTES [RESET TIMER AT MESSAGE SENT] //TODO: Fix stuck { //READ - raw = read_socket_raw(connection); + pthread_create(&thread_timeout_buffer, NULL, read_socket_raw_thread, &connection); - if (raw == NULL) break; //QUIT COMMUNICATION IF INVALID PACKET WAS RECEIVED + //SET TIMEOUT (DEFAULT IS 5 MINUTES) + signal(SIGALRM, alarm_handler); + alarm(WHY2_COMMUNICATION_TIME); + + pthread_join(thread_timeout_buffer, &raw_ptr); + + if (raw_ptr == WHY2_INVALID_POINTER || raw_ptr == NULL) break; //QUIT COMMUNICATION IF INVALID PACKET WAS RECEIVED + + raw = (char*) raw_ptr; //REMOVE CONTROL CHARACTERS FROM raw for (size_t i = 0; i < strlen(raw); i++) @@ -346,14 +365,15 @@ void *why2_communicate_thread(void *arg) pthread_create(&thread_buffer, NULL, send_to_all, raw); pthread_join(thread_buffer, NULL); - //RESET TIMER - start_time = time(NULL); - deallocation: why2_deallocate(received); why2_deallocate(raw); + why2_deallocate(raw_ptr); why2_deallocate(decoded_buffer); + + //RESET VARIABLES + raw_ptr = NULL; } printf("User exited.\t%d\n", connection);