From de793ea9d2c3a1925d85ce48d25d8df69bc6c3b4 Mon Sep 17 00:00:00 2001 From: Jan Vidar Krey Date: Tue, 6 Oct 2009 14:36:49 +0200 Subject: [PATCH] Some compile fixes and memory leak fixes for ADCRush. --- src/tools/adcclient.c | 15 +++-- src/tools/adcrush.c | 137 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 144 insertions(+), 8 deletions(-) diff --git a/src/tools/adcclient.c b/src/tools/adcclient.c index 7a64e14..e6b2a6a 100644 --- a/src/tools/adcclient.c +++ b/src/tools/adcclient.c @@ -79,13 +79,16 @@ static void timer_callback(struct net_timer* t, void* arg) static void event_callback(struct net_connection* con, int events, void *arg) { - struct ADC_client* client = (struct ADC_client*) arg; + struct ADC_client* client = (struct ADC_client*) con->ptr; if (events == NET_EVENT_DESTROYED) { printf("NET_EVENT_DESTROYED\n"); - hub_free(client->con); - client->con = 0; + if (client) + { + client->con = 0; + } + hub_free(con); return; } @@ -433,7 +436,11 @@ void ADC_client_disconnect(struct ADC_client* client) { if (client->con && client->con->sd != -1) { - net_con_close(client->con); + if (net_con_close(client->con)) + { + hub_free(client->con); + } + client->con = 0; } } diff --git a/src/tools/adcrush.c b/src/tools/adcrush.c index 815328b..32440ee 100644 --- a/src/tools/adcrush.c +++ b/src/tools/adcrush.c @@ -26,9 +26,8 @@ static int cfg_chat = 0; /* chat mode, allow sending chat messages */ static int cfg_quiet = 0; /* quiet mode (no output) */ static int cfg_clients = ADC_CLIENTS_DEFAULT; /* number of clients */ -static int running = 1; - static struct sockaddr_in saddr; +static int running = 1; enum operationMode @@ -129,6 +128,7 @@ static size_t get_wait_rand(size_t max) return ((size_t )(next / 65536) % max); } +#if 0 static void perf_result(struct ADC_client* client, sid_t target, const char* what, const char* token); static void perf_chat(struct ADC_client* client, int priv) @@ -230,7 +230,6 @@ static void perf_update(struct ADC_client* client) ADC_client_send(client, buf); } - static void perf_normal_action(struct ADC_client* client) { size_t r = get_wait_rand(5); @@ -277,6 +276,66 @@ static void perf_normal_action(struct ADC_client* client) } } +#endif + +static int handle(struct ADC_client* client, enum ADC_client_callback_type type, struct ADC_client_callback_data* data) +{ + switch (type) + { + case ADC_CLIENT_CONNECTING: + bot_output(client, LVL_DEBUG, "*** Connecting..."); + break; + + case ADC_CLIENT_CONNECTED: + bot_output(client, LVL_DEBUG, "*** Connected."); + break; + + case ADC_CLIENT_DISCONNECTED: + bot_output(client, LVL_DEBUG, "*** Disconnected."); + break; + + case ADC_CLIENT_LOGGING_IN: + bot_output(client, LVL_DEBUG, "*** Logging in..."); + break; + + case ADC_CLIENT_PASSWORD_REQ: + bot_output(client, LVL_DEBUG, "*** Requesting password."); + + case ADC_CLIENT_LOGGED_IN: + bot_output(client, LVL_DEBUG, "*** Logged in."); + break; + + case ADC_CLIENT_LOGIN_ERROR: + bot_output(client, LVL_DEBUG, "*** Login error"); + break; + + case ADC_CLIENT_MESSAGE: + bot_output(client, LVL_DEBUG, " <%s> %s", sid_to_string(data->chat->from_sid), data->chat->message); + break; + + case ADC_CLIENT_USER_JOIN: + bot_output(client, LVL_DEBUG, " JOIN: %s", data->user->name); + break; + + case ADC_CLIENT_USER_QUIT: + bot_output(client, LVL_DEBUG, " QUIT"); + break; + + case ADC_CLIENT_SEARCH_REQ: + break; + + case ADC_CLIENT_HUB_INFO: + bot_output(client, LVL_DEBUG, " Hub: \"%s\" [%s]\n" + " \"%s\"\n", data->hubinfo->name, data->hubinfo->version, data->hubinfo->description); + break; + + default: + bot_output(client, LVL_DEBUG, "Not handled event=%d\n", (int) type); + return 0; + break; + } + return 1; +} void runloop(size_t clients) { @@ -292,10 +351,14 @@ void runloop(size_t clients) snprintf(nick, 20, "adcrush_%d", (int) n); ADC_client_create(c, nick, "stresstester"); + ADC_client_set_callback(c, handle); ADC_client_connect(c, "adc://adc.extatic.org:1511"); } - event_dispatch(); + while (running) + { + event_base_loop(net_get_evbase(), EVLOOP_ONCE); + } for (n = 0; n < clients; n++) { @@ -451,11 +514,55 @@ void parse_command_line(int argc, char** argv) } } +#ifndef WIN32 +static void handle_signal(int signal, short events, void* arg) +{ + switch (signal) + { + case SIGINT: + case SIGTERM: + running = 0; + break; + default: + break; + } +} + +static struct event signal_events[10]; +static int signals[] = +{ + SIGINT, /* Interrupt the application */ + SIGTERM, /* Terminate the application */ + 0 +}; + +void setup_signal_handlers() +{ + int i = 0; + for (i = 0; signals[i]; i++) + { + signal_set(&signal_events[i], signals[i], handle_signal, NULL); + signal_add(&signal_events[i], NULL); + } +} + +void shutdown_signal_handlers() +{ + int i = 0; + for (i = 0; signals[i]; i++) + { + signal_del(&signal_events[i]); + } +} +#endif /* WIN32 */ + + int main(int argc, char** argv) { parse_command_line(argc, argv); net_initialize(); + setup_signal_handlers(); hub_log_initialize(NULL, 0); hub_set_log_verbosity(1000); @@ -467,7 +574,29 @@ int main(int argc, char** argv) runloop(cfg_clients); + shutdown_signal_handlers(); + net_destroy(); + free(cfg_host); + return 0; +} + +#if 0 + +int main(int argc, char** argv) +{ + struct ADC_client client; + net_initialize(); + + ADC_client_create(&client, "uhub-admin", "stresstester"); + ADC_client_set_callback(&client, handle); + ADC_client_connect(&client, "adc://adc.extatic.org:1511"); + + event_dispatch(); + + ADC_client_destroy(&client); net_destroy(); return 0; } +#endif +