1
0
mirror of https://github.com/Tha14/toxic.git synced 2024-11-23 02:23:02 +01:00

implement multi-threading

This commit is contained in:
Jfreegman 2014-03-13 06:06:53 -04:00
parent c37311ae36
commit f6a85518bc
5 changed files with 57 additions and 11 deletions

View File

@ -44,7 +44,7 @@ extern int store_data(Tox *m, char *path);
extern FileSender file_senders[MAX_FILES]; extern FileSender file_senders[MAX_FILES];
extern ToxicFriend friends[MAX_FRIENDS_NUM]; extern ToxicFriend friends[MAX_FRIENDS_NUM];
extern struct _Winthread Winthread;
#ifdef _SUPPORT_AUDIO #ifdef _SUPPORT_AUDIO
#define AC_NUM_CHAT_COMMANDS 22 #define AC_NUM_CHAT_COMMANDS 22
@ -747,7 +747,10 @@ static void chat_onDraw(ToxWindow *self, Tox *m)
/* Reset statusbar->statusmsg on window resize */ /* Reset statusbar->statusmsg on window resize */
if (x2 != self->x) { if (x2 != self->x) {
uint8_t statusmsg[TOX_MAX_STATUSMESSAGE_LENGTH] = {'\0'}; uint8_t statusmsg[TOX_MAX_STATUSMESSAGE_LENGTH] = {'\0'};
pthread_mutex_lock(&Winthread.lock);
tox_get_status_message(m, self->num, statusmsg, TOX_MAX_STATUSMESSAGE_LENGTH); tox_get_status_message(m, self->num, statusmsg, TOX_MAX_STATUSMESSAGE_LENGTH);
pthread_mutex_unlock(&Winthread.lock);
snprintf(statusbar->statusmsg, sizeof(statusbar->statusmsg), "%s", statusmsg); snprintf(statusbar->statusmsg, sizeof(statusbar->statusmsg), "%s", statusmsg);
statusbar->statusmsg_len = tox_get_status_message_size(m, self->num); statusbar->statusmsg_len = tox_get_status_message_size(m, self->num);
} }

View File

@ -42,6 +42,7 @@ static int max_friends_index = 0; /* marks the index of the last friend in fr
static int num_selected = 0; static int num_selected = 0;
static int num_friends = 0; static int num_friends = 0;
extern struct _Winthread Winthread;
ToxicFriend friends[MAX_FRIENDS_NUM]; ToxicFriend friends[MAX_FRIENDS_NUM];
static int friendlist_index[MAX_FRIENDS_NUM] = {0}; static int friendlist_index[MAX_FRIENDS_NUM] = {0};
@ -420,9 +421,11 @@ static void friendlist_onDraw(ToxWindow *self, Tox *m)
/* Reset friends[f].statusmsg on window resize */ /* Reset friends[f].statusmsg on window resize */
if (fix_statuses) { if (fix_statuses) {
uint8_t statusmsg[TOX_MAX_STATUSMESSAGE_LENGTH] = {'\0'}; uint8_t statusmsg[TOX_MAX_STATUSMESSAGE_LENGTH] = {'\0'};
pthread_mutex_lock(&Winthread.lock);
tox_get_status_message(m, friends[f].num, statusmsg, TOX_MAX_STATUSMESSAGE_LENGTH); tox_get_status_message(m, friends[f].num, statusmsg, TOX_MAX_STATUSMESSAGE_LENGTH);
snprintf(friends[f].statusmsg, sizeof(friends[f].statusmsg), "%s", statusmsg);
friends[f].statusmsg_len = tox_get_status_message_size(m, f); friends[f].statusmsg_len = tox_get_status_message_size(m, f);
pthread_mutex_unlock(&Winthread.lock);
snprintf(friends[f].statusmsg, sizeof(friends[f].statusmsg), "%s", statusmsg);
} }
/* Truncate note if it doesn't fit on one line */ /* Truncate note if it doesn't fit on one line */

View File

@ -38,6 +38,7 @@
#include <locale.h> #include <locale.h>
#include <string.h> #include <string.h>
#include <time.h> #include <time.h>
#include <pthread.h>
#ifdef _WIN32 #ifdef _WIN32
#include <direct.h> #include <direct.h>
@ -78,6 +79,8 @@ ToxWindow *prompt = NULL;
static int f_loadfromfile; /* 1 if we want to load from/save the data file, 0 otherwise */ static int f_loadfromfile; /* 1 if we want to load from/save the data file, 0 otherwise */
struct _Winthread Winthread;
void on_window_resize(int sig) void on_window_resize(int sig)
{ {
endwin(); endwin();
@ -255,9 +258,10 @@ int init_connection(Tox *m)
int i; int i;
int n = MIN(NUM_INIT_NODES, linecnt); int n = MIN(NUM_INIT_NODES, linecnt);
for(i = 0; i < n; ++i) for(i = 0; i < n; ++i) {
if (init_connection_helper(m, rand() % linecnt)) if (init_connection_helper(m, rand() % linecnt))
res = 0; res = 0;
}
return res; return res;
} }
@ -284,13 +288,11 @@ static void do_connection(Tox *m, ToxWindow *prompt)
} else if (!dht_on && is_connected) { } else if (!dht_on && is_connected) {
dht_on = true; dht_on = true;
prompt_update_connectionstatus(prompt, dht_on); prompt_update_connectionstatus(prompt, dht_on);
prep_prompt_win(); prep_prompt_win();
wprintw(prompt->window, "DHT connected.\n"); wprintw(prompt->window, "DHT connected.\n");
} else if (dht_on && !is_connected) { } else if (dht_on && !is_connected) {
dht_on = false; dht_on = false;
prompt_update_connectionstatus(prompt, dht_on); prompt_update_connectionstatus(prompt, dht_on);
prep_prompt_win(); prep_prompt_win();
wprintw(prompt->window, "\nDHT disconnected. Attempting to reconnect.\n"); wprintw(prompt->window, "\nDHT disconnected. Attempting to reconnect.\n");
} }
@ -400,6 +402,7 @@ static void load_data(Tox *m, char *path)
void exit_toxic(Tox *m) void exit_toxic(Tox *m)
{ {
pthread_join(Winthread.tid, NULL);
store_data(m, DATA_FILE); store_data(m, DATA_FILE);
close_all_file_senders(); close_all_file_senders();
kill_all_windows(); kill_all_windows();
@ -418,12 +421,23 @@ void exit_toxic(Tox *m)
static void do_toxic(Tox *m, ToxWindow *prompt) static void do_toxic(Tox *m, ToxWindow *prompt)
{ {
pthread_mutex_lock(&Winthread.lock);
do_connection(m, prompt); do_connection(m, prompt);
draw_active_window(m);
do_file_senders(m); do_file_senders(m);
/* main tox-core loop */ /* main tox-core loop */
tox_do(m); tox_do(m);
pthread_mutex_unlock(&Winthread.lock);
}
void *thread_winref(void *data)
{
Tox *m = (Tox *) data;
while (true)
draw_active_window(m);
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[])
@ -486,6 +500,21 @@ int main(int argc, char *argv[])
} }
prompt = init_windows(m); prompt = init_windows(m);
prompt_init_statusbar(prompt, m);
/* create new thread for ncurses stuff */
if (pthread_mutex_init(&Winthread.lock, NULL) != 0)
{
endwin();
fprintf(stderr, "Mutex init failed. Aborting...\n");
exit(EXIT_FAILURE);
}
if (pthread_create(&Winthread.tid, NULL, thread_winref, (void *) m) != 0) {
endwin();
fprintf(stderr, "Thread creation failed. Aborting...\n");
exit(EXIT_FAILURE);
}
#ifdef _SUPPORT_AUDIO #ifdef _SUPPORT_AUDIO
@ -520,11 +549,12 @@ int main(int argc, char *argv[])
attroff(COLOR_PAIR(RED) | A_BOLD); attroff(COLOR_PAIR(RED) | A_BOLD);
} }
prompt_init_statusbar(prompt, m);
sort_friendlist_index(m); sort_friendlist_index(m);
while (true) while (true) {
do_toxic(m, prompt); do_toxic(m, prompt);
usleep(10000);
}
return 0; return 0;
} }

View File

@ -232,6 +232,11 @@ struct FileReceiver {
/* End file transfer code */ /* End file transfer code */
struct _Winthread {
pthread_t tid;
pthread_mutex_t lock;
};
void on_request(uint8_t *public_key, uint8_t *data, uint16_t length, void *userdata); void on_request(uint8_t *public_key, uint8_t *data, uint16_t length, void *userdata);
void on_connectionchange(Tox *m, int friendnumber, uint8_t status, void *userdata); void on_connectionchange(Tox *m, int friendnumber, uint8_t status, void *userdata);
void on_message(Tox *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata); void on_message(Tox *m, int friendnumber, uint8_t *string, uint16_t length, void *userdata);

View File

@ -26,6 +26,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <pthread.h>
#include "friendlist.h" #include "friendlist.h"
#include "prompt.h" #include "prompt.h"
@ -33,7 +34,7 @@
#include "groupchat.h" #include "groupchat.h"
extern char *DATA_FILE; extern char *DATA_FILE;
extern struct _Winthread Winthread;
static ToxWindow windows[MAX_WINDOWS_NUM]; static ToxWindow windows[MAX_WINDOWS_NUM];
static ToxWindow *active_window; static ToxWindow *active_window;
@ -397,10 +398,14 @@ void draw_active_window(Tox *m)
ch = getch(); ch = getch();
#endif #endif
if (ch == T_KEY_NEXT || ch == T_KEY_PREV) if (ch == T_KEY_NEXT || ch == T_KEY_PREV) {
set_next_window((int) ch); set_next_window((int) ch);
else if (ch != ERR) } else if (ch != ERR) {
pthread_mutex_lock(&Winthread.lock);
a->onKey(a, m, ch); a->onKey(a, m, ch);
pthread_mutex_unlock(&Winthread.lock);
}
} }
int get_num_active_windows(void) int get_num_active_windows(void)