diff --git a/common/utils/T/tracer/enb.c b/common/utils/T/tracer/enb.c index c80fd9bda330829bbe16cf05d8b1fe4cdf3fc310..eeaa0ff31fc00a553c9a870b75fc677307d7cf63 100644 --- a/common/utils/T/tracer/enb.c +++ b/common/utils/T/tracer/enb.c @@ -1,7 +1,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <unistd.h> +#include <pthread.h> #include "database.h" #include "event.h" #include "handler.h" @@ -19,9 +19,34 @@ typedef struct { view *legacy; } enb_gui; +typedef struct { + int socket; + int *is_on; + int nevents; + pthread_mutex_t lock; +} enb_data; + #define DEFAULT_REMOTE_IP "127.0.0.1" #define DEFAULT_REMOTE_PORT 2021 +void is_on_changed(void *_d) +{ + enb_data *d = _d; + char t; + + if (pthread_mutex_lock(&d->lock)) abort(); + + if (d->socket == -1) goto no_connection; + + t = 1; + socket_send(d->socket, &t, 1); + socket_send(d->socket, &d->nevents, sizeof(int)); + socket_send(d->socket, d->is_on, d->nevents * sizeof(int)); + +no_connection: + if (pthread_mutex_unlock(&d->lock)) abort(); +} + void usage(void) { printf( @@ -214,13 +239,11 @@ int main(int n, char **v) int on_off_n = 0; int *is_on; int number_of_events; - int s; int i; - char t; - int l; event_handler *h; gui *g; enb_gui eg; + enb_data enb_data; on_off_name = malloc(n * sizeof(char *)); if (on_off_name == NULL) abort(); on_off_action = malloc(n * sizeof(int)); if (on_off_action == NULL) abort(); @@ -346,25 +369,22 @@ int main(int n, char **v) for (i = 0; i < on_off_n; i++) on_off(database, on_off_name[i], is_on, on_off_action[i]); - s = connect_to(ip, port); + enb_data.socket = -1; + enb_data.is_on = is_on; + enb_data.nevents = number_of_events; + if (pthread_mutex_init(&enb_data.lock, NULL)) abort(); + setup_event_selector(g, database, is_on, is_on_changed, &enb_data); - /* send the first message - activate selected traces */ - t = 0; - if (write(s, &t, 1) != 1) abort(); - l = 0; - for (i = 0; i < number_of_events; i++) if (is_on[i]) l++; - if (write(s, &l, sizeof(int)) != sizeof(int)) abort(); - for (l = 0; l < number_of_events; l++) - if (is_on[l]) - if (write(s, &l, sizeof(int)) != sizeof(int)) abort(); + enb_data.socket = connect_to(ip, port); - setup_event_selector(g, database, s, is_on); + /* send the first message - activate selected traces */ + is_on_changed(&enb_data); /* read messages */ while (1) { char v[T_BUFFER_MAX]; event e; - e = get_event(s, v, database); + e = get_event(enb_data.socket, v, database); handle_event(h, e); } diff --git a/common/utils/T/tracer/event_selector.c b/common/utils/T/tracer/event_selector.c index bc1f25f4b73020b7f642c46a339c6e17e4d2d3f1..a03846c0566a98faef440f7eb991793209d676e4 100644 --- a/common/utils/T/tracer/event_selector.c +++ b/common/utils/T/tracer/event_selector.c @@ -7,6 +7,8 @@ struct event_selector { int *is_on; + int *is_on_paused; /* when pausing, is_on is set to all 0, this one + * is used to copy back data when un-pausing */ int red; int green; gui *g; @@ -15,12 +17,13 @@ struct event_selector { void *database; int nevents; int ngroups; - int socket; int paused; /* those three widgets used to pause/unpause reception of events */ widget *parent_widget; widget *normal_widget; widget *pause_widget; + void (*change_callback)(void *change_callback_data); + void *change_callback_data; }; static void scroll(void *private, gui *g, @@ -57,7 +60,6 @@ static void click(void *private, gui *g, char *text; int color; int i; - char t; /* notification_data depends on the kind of widget */ if (w == this->pause_widget) { @@ -76,22 +78,17 @@ static void click(void *private, gui *g, container_set_child_growable(g, this->parent_widget, this->pause_widget, 1); /* pause */ - t = 1; - socket_send(this->socket, &t, 1); - socket_send(this->socket, &this->nevents, sizeof(int)); - set_on = 0; - for (i = 0; i < this->nevents; i++) - socket_send(this->socket, &set_on, sizeof(int)); + memcpy(this->is_on_paused, this->is_on, this->nevents * sizeof(int)); + memset(this->is_on, 0, this->nevents * sizeof(int)); + this->change_callback(this->change_callback_data); } else { widget_del_child(g, this->parent_widget, this->pause_widget); widget_add_child(g, this->parent_widget, this->normal_widget, 0); container_set_child_growable(g, this->parent_widget, this->normal_widget, 1); /* un-pause */ - t = 1; - socket_send(this->socket, &t, 1); - socket_send(this->socket, &this->nevents, sizeof(int)); - socket_send(this->socket, this->is_on, this->nevents * sizeof(int)); + memcpy(this->is_on, this->is_on_paused, this->nevents * sizeof(int)); + this->change_callback(this->change_callback_data); } this->paused = 1 - this->paused; return; @@ -121,14 +118,11 @@ static void click(void *private, gui *g, textlist_set_color(this->g, this->groups, line, set_on ? this->green : this->red); - t = 1; - socket_send(this->socket, &t, 1); - socket_send(this->socket, &this->nevents, sizeof(int)); - socket_send(this->socket, this->is_on, this->nevents * sizeof(int)); + this->change_callback(this->change_callback_data); } -event_selector *setup_event_selector(gui *g, void *database, int socket, - int *is_on) +event_selector *setup_event_selector(gui *g, void *database, int *is_on, + void (*change_callback)(void *), void *change_callback_data) { struct event_selector *ret; widget *win; @@ -198,6 +192,9 @@ event_selector *setup_event_selector(gui *g, void *database, int socket, ret->nevents = n; + ret->is_on_paused = calloc(n, sizeof(int)); + if (ret->is_on_paused == NULL) abort(); + n = database_get_groups(database, &gps); for (i = 0; i < n; i++) { textlist_add(g, groups, gps[i], -1, FOREGROUND_COLOR); @@ -213,7 +210,8 @@ event_selector *setup_event_selector(gui *g, void *database, int socket, ret->events = events; ret->groups = groups; ret->database = database; - ret->socket = socket; + ret->change_callback = change_callback; + ret->change_callback_data = change_callback_data; ret->parent_widget = win_container; ret->normal_widget = main_container; diff --git a/common/utils/T/tracer/event_selector.h b/common/utils/T/tracer/event_selector.h index 60da0a07e5c33d1ef3427fb2cfe2d752143d1786..dedd79965c5096a5e2dce8ad13d61f11fbdda42e 100644 --- a/common/utils/T/tracer/event_selector.h +++ b/common/utils/T/tracer/event_selector.h @@ -5,7 +5,7 @@ typedef void event_selector; -event_selector *setup_event_selector(gui *g, void *database, int socket, - int *is_on); +event_selector *setup_event_selector(gui *g, void *database, int *is_on, + void (*change_callback)(void *), void *change_callback_data); #endif /* _EVENT_SELECTOR_H_ */ diff --git a/common/utils/T/tracer/textlog.c b/common/utils/T/tracer/textlog.c index 6ff36f650c476c9d96b27f8502d7cc5199603b65..f7bde62a43898ab5add5cbade75034ebf76e6797 100644 --- a/common/utils/T/tracer/textlog.c +++ b/common/utils/T/tracer/textlog.c @@ -1,7 +1,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <unistd.h> +#include <pthread.h> #include "database.h" #include "event.h" #include "handler.h" @@ -16,6 +16,31 @@ #define DEFAULT_REMOTE_IP "127.0.0.1" #define DEFAULT_REMOTE_PORT 2021 +typedef struct { + int socket; + int *is_on; + int nevents; + pthread_mutex_t lock; +} textlog_data; + +void is_on_changed(void *_d) +{ + textlog_data *d = _d; + char t; + + if (pthread_mutex_lock(&d->lock)) abort(); + + if (d->socket == -1) goto no_connection; + + t = 1; + socket_send(d->socket, &t, 1); + socket_send(d->socket, &d->nevents, sizeof(int)); + socket_send(d->socket, d->is_on, d->nevents * sizeof(int)); + +no_connection: + if (pthread_mutex_unlock(&d->lock)) abort(); +} + void usage(void) { printf( @@ -58,16 +83,14 @@ int main(int n, char **v) int on_off_n = 0; int *is_on; int number_of_events; - int s; int i; - char t; - int l; event_handler *h; logger *textlog; gui *g; int gui_mode = 0; view *out; int gui_active = 1; + textlog_data textlog_data; on_off_name = malloc(n * sizeof(char *)); if (on_off_name == NULL) abort(); on_off_action = malloc(n * sizeof(int)); if (on_off_action == NULL) abort(); @@ -141,26 +164,23 @@ int main(int n, char **v) for (i = 0; i < on_off_n; i++) on_off(database, on_off_name[i], is_on, on_off_action[i]); - s = connect_to(ip, port); + textlog_data.socket = -1; + textlog_data.is_on = is_on; + textlog_data.nevents = number_of_events; + if (pthread_mutex_init(&textlog_data.lock, NULL)) abort(); + if (gui_active) + setup_event_selector(g, database, is_on, is_on_changed, &textlog_data); - /* send the first message - activate selected traces */ - t = 0; - if (write(s, &t, 1) != 1) abort(); - l = 0; - for (i = 0; i < number_of_events; i++) if (is_on[i]) l++; - if (write(s, &l, sizeof(int)) != sizeof(int)) abort(); - for (l = 0; l < number_of_events; l++) - if (is_on[l]) - if (write(s, &l, sizeof(int)) != sizeof(int)) abort(); + textlog_data.socket = connect_to(ip, port); - if (gui_active) - setup_event_selector(g, database, s, is_on); + /* send the first message - activate selected traces */ + is_on_changed(&textlog_data); /* read messages */ while (1) { char v[T_BUFFER_MAX]; event e; - e = get_event(s, v, database); + e = get_event(textlog_data.socket, v, database); handle_event(h, e); } diff --git a/common/utils/T/tracer/vcd.c b/common/utils/T/tracer/vcd.c index bf66bddd29e0590d1862ab253251f224ae20ce99..46187f751bb0adb66e9720e032ba94189aa29cb1 100644 --- a/common/utils/T/tracer/vcd.c +++ b/common/utils/T/tracer/vcd.c @@ -1,7 +1,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> -#include <unistd.h> +#include <pthread.h> #include "database.h" #include "event.h" #include "handler.h" @@ -13,6 +13,31 @@ #include "event_selector.h" #include "config.h" +typedef struct { + int socket; + int *is_on; + int nevents; + pthread_mutex_t lock; +} vcd_data; + +void is_on_changed(void *_d) +{ + vcd_data *d = _d; + char t; + + if (pthread_mutex_lock(&d->lock)) abort(); + + if (d->socket == -1) goto no_connection; + + t = 1; + socket_send(d->socket, &t, 1); + socket_send(d->socket, &d->nevents, sizeof(int)); + socket_send(d->socket, d->is_on, d->nevents * sizeof(int)); + +no_connection: + if (pthread_mutex_unlock(&d->lock)) abort(); +} + #define DEFAULT_REMOTE_IP "127.0.0.1" #define DEFAULT_REMOTE_PORT 2021 @@ -98,12 +123,10 @@ int main(int n, char **v) int on_off_n = 0; int *is_on; int number_of_events; - int s; int i; - char t; - int l; event_handler *h; gui *g; + vcd_data vcd_data; on_off_name = malloc(n * sizeof(char *)); if (on_off_name == NULL) abort(); on_off_action = malloc(n * sizeof(int)); if (on_off_action == NULL) abort(); @@ -152,25 +175,22 @@ int main(int n, char **v) for (i = 0; i < on_off_n; i++) on_off(database, on_off_name[i], is_on, on_off_action[i]); - s = connect_to(ip, port); + vcd_data.socket = -1; + vcd_data.is_on = is_on; + vcd_data.nevents = number_of_events; + if (pthread_mutex_init(&vcd_data.lock, NULL)) abort(); + setup_event_selector(g, database, is_on, is_on_changed, &vcd_data); - /* send the first message - activate selected traces */ - t = 0; - if (write(s, &t, 1) != 1) abort(); - l = 0; - for (i = 0; i < number_of_events; i++) if (is_on[i]) l++; - if (write(s, &l, sizeof(int)) != sizeof(int)) abort(); - for (l = 0; l < number_of_events; l++) - if (is_on[l]) - if (write(s, &l, sizeof(int)) != sizeof(int)) abort(); + vcd_data.socket = connect_to(ip, port); - setup_event_selector(g, database, s, is_on); + /* send the first message - activate selected traces */ + is_on_changed(&vcd_data); /* read messages */ while (1) { char v[T_BUFFER_MAX]; event e; - e = get_event(s, v, database); + e = get_event(vcd_data.socket, v, database); handle_event(h, e); }