kind of implemented llist in chat-misc
DO NOT USE THIS COMMIT, I USE IT JUST FOR SYNCING CODE BETWEEN DEVICES, IT IS UNSTABLE AS FUCK; thx <3
This commit is contained in:
parent
3ca7299086
commit
b19a9deee7
@ -29,6 +29,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|||||||
#include <json-c/json.h>
|
#include <json-c/json.h>
|
||||||
|
|
||||||
#include <why2/chat/flags.h>
|
#include <why2/chat/flags.h>
|
||||||
|
#include <why2/llist.h>
|
||||||
#include <why2/memory.h>
|
#include <why2/memory.h>
|
||||||
#include <why2/misc.h>
|
#include <why2/misc.h>
|
||||||
|
|
||||||
@ -47,7 +48,7 @@ typedef struct waiting_node
|
|||||||
} waiting_node_t; //SINGLE LINKED LIST
|
} waiting_node_t; //SINGLE LINKED LIST
|
||||||
|
|
||||||
node_t *head = NULL;
|
node_t *head = NULL;
|
||||||
waiting_node_t *waiting_head = NULL;
|
why2_list_t waiting_list = WHY2_LIST_EMPTY;
|
||||||
|
|
||||||
void push_to_list(int connection, pthread_t thread)
|
void push_to_list(int connection, pthread_t thread)
|
||||||
{
|
{
|
||||||
@ -70,26 +71,6 @@ void push_to_list(int connection, pthread_t thread)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void waiting_push_to_list(pthread_t thread)
|
|
||||||
{
|
|
||||||
//CREATE NODE
|
|
||||||
waiting_node_t *new_node = malloc(sizeof(waiting_node_t));
|
|
||||||
waiting_node_t *buffer = waiting_head;
|
|
||||||
|
|
||||||
new_node -> thread = thread;
|
|
||||||
new_node -> next = NULL;
|
|
||||||
|
|
||||||
if (waiting_head == NULL) //INIT LIST
|
|
||||||
{
|
|
||||||
waiting_head = new_node;
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
while (buffer -> next != NULL) buffer = buffer -> next; //GET TO THE END OF LIST
|
|
||||||
|
|
||||||
buffer -> next = new_node; //LINK
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void remove_node(node_t *node)
|
void remove_node(node_t *node)
|
||||||
{
|
{
|
||||||
if (node == NULL) return; //NULL NODE
|
if (node == NULL) return; //NULL NODE
|
||||||
@ -125,41 +106,6 @@ void remove_node(node_t *node)
|
|||||||
free(node);
|
free(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
void waiting_remove_node(waiting_node_t *node)
|
|
||||||
{
|
|
||||||
if (node == NULL) return; //NULL NODE
|
|
||||||
|
|
||||||
waiting_node_t *buffer_1 = waiting_head;
|
|
||||||
waiting_node_t *buffer_2;
|
|
||||||
|
|
||||||
while (buffer_1 -> next != NULL) //GO TROUGH EVERY ELEMENT IN LIST
|
|
||||||
{
|
|
||||||
if (buffer_1 == node) break; //FOUND (IF THE WHILE GOES TROUGH THE WHOLE LIST WITHOUT THE break, I ASSUME THE LAST NODE IS THE CORRECT ONE)
|
|
||||||
|
|
||||||
buffer_1 = buffer_1 -> next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (node != buffer_1) return; //node WASN'T FOUND
|
|
||||||
|
|
||||||
if (buffer_1 == waiting_head) //node WAS THE FIRST NODE IN THE LIST
|
|
||||||
{
|
|
||||||
//UNLINK
|
|
||||||
waiting_head = buffer_1 -> next;
|
|
||||||
} else //wdyt
|
|
||||||
{
|
|
||||||
//GET THE NODE BEFORE node
|
|
||||||
buffer_2 = waiting_head;
|
|
||||||
|
|
||||||
while (buffer_2 -> next != buffer_1) buffer_2 = buffer_2 -> next;
|
|
||||||
|
|
||||||
//UNLINK
|
|
||||||
buffer_2 -> next = buffer_1 -> next;
|
|
||||||
}
|
|
||||||
|
|
||||||
//DEALLOCATION
|
|
||||||
free(node);
|
|
||||||
}
|
|
||||||
|
|
||||||
node_t *get_node(int connection)
|
node_t *get_node(int connection)
|
||||||
{
|
{
|
||||||
if (head == NULL) return NULL; //EMPTY LIST
|
if (head == NULL) return NULL; //EMPTY LIST
|
||||||
@ -177,23 +123,6 @@ node_t *get_node(int connection)
|
|||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
waiting_node_t *waiting_get_node(pthread_t thread)
|
|
||||||
{
|
|
||||||
if (waiting_head == NULL) return NULL; //EMPTY LIST
|
|
||||||
|
|
||||||
waiting_node_t *buffer = waiting_head;
|
|
||||||
while (buffer -> next != NULL)
|
|
||||||
{
|
|
||||||
if (buffer -> thread == thread) return buffer;
|
|
||||||
|
|
||||||
buffer = buffer -> next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (thread != buffer -> thread) buffer = NULL; //PREVENT FROM RETURNING INVALID NODE
|
|
||||||
|
|
||||||
return buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *get_string_from_json(struct json_object *json, char *string)
|
char *get_string_from_json(struct json_object *json, char *string)
|
||||||
{
|
{
|
||||||
struct json_object *object;
|
struct json_object *object;
|
||||||
@ -334,14 +263,13 @@ void remove_json_syntax_characters(char *text)
|
|||||||
void *stop_oldest_thread(void *id)
|
void *stop_oldest_thread(void *id)
|
||||||
{
|
{
|
||||||
sleep(WHY2_COMMUNICATION_TIME); //yk wait
|
sleep(WHY2_COMMUNICATION_TIME); //yk wait
|
||||||
|
if (waiting_list.head == NULL) return NULL;
|
||||||
|
|
||||||
pthread_t thread = *(pthread_t*) id;
|
if (*(pthread_t*) waiting_list.head -> value == *(pthread_t*) id) //THREAD IS STILL ALIVE, I HOPE
|
||||||
|
|
||||||
if (waiting_head -> thread == thread) //THREAD IS STILL ALIVE, I HOPE
|
|
||||||
{
|
{
|
||||||
//KILL THE THREAD
|
//KILL THE THREAD
|
||||||
pthread_cancel(thread);
|
pthread_cancel(*(pthread_t*) id);
|
||||||
waiting_remove_node(waiting_get_node(thread));
|
why2_list_remove(&waiting_list, why2_list_find(&waiting_list, id));
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user