[2689] in BarnOwl Developers
Re: [PATCH] Track names along with timers, add :show timers
daemon@ATHENA.MIT.EDU (Nelson Elhage)
Wed Sep 29 22:05:38 2010
From: Nelson Elhage <nelhage@MIT.EDU>
To: David Benjamin <davidben@mit.edu>, barnowl-dev@mit.edu
In-Reply-To: <1285521649-15873-1-git-send-email-davidben@mit.edu>
Date: Wed, 29 Sep 2010 22:05:34 -0400
> + my $nickname = $self->{cfg}->{account_nickname};
> if($self->{cfg}->{poll_for_tweets}) {
> $self->{timer} = BarnOwl::Timer->new({
> + name => "Twitter ($nickname) poll_for_tweets",
> after => $delay,
> interval => 90,
> cb => sub { $weak->poll_twitter if $weak }
> @@ -169,6 +171,7 @@ sub sleep {
>
> if($self->{cfg}->{poll_for_dms}) {
> $self->{direct_timer} = BarnOwl::Timer->new({
> + name => "Twitter ($nickname) direct_timer",
I'd be inclined to be a little more consistent in some of these names --
i.e. poll_for_tweets and poll_for_dms or something else more parallel,
but I don't really care.
- Nelson
On Sun, 26 Sep 2010 13:20:49 -0400, David Benjamin <davidben@MIT.EDU> wrote:
> This will help people with BarnOwls eating CPU to diagnose timer leaks.
> ---
> aim.c | 5 ++-
> commands.c | 3 ++
> functions.c | 30 ++++++++++++++++++++
> owl.h | 1 +
> perl/lib/BarnOwl/Complete/Client.pm | 1 +
> perl/lib/BarnOwl/MainLoopCompatHook.pm | 1 +
> perl/lib/BarnOwl/Timer.pm | 6 +++-
> .../IRC/lib/BarnOwl/Module/IRC/Connection.pm | 1 +
> .../Jabber/lib/BarnOwl/Module/Jabber/Connection.pm | 1 +
> .../Twitter/lib/BarnOwl/Module/Twitter/Handle.pm | 3 ++
> perlglue.xs | 12 ++++---
> select.c | 4 ++-
> variable.c | 3 +-
> 13 files changed, 61 insertions(+), 10 deletions(-)
>
> diff --git a/aim.c b/aim.c
> index e14b179..5e27abc 100644
> --- a/aim.c
> +++ b/aim.c
> @@ -183,7 +183,7 @@ int owl_aim_login(const char *screenname, const char *password)
> aim_request_login(sess, conn, screenname);
> owl_function_debugmsg("owl_aim_login: connecting");
>
> - g.aim_nop_timer = owl_select_add_timer(30, 30, owl_aim_send_nop, NULL, NULL);
> + g.aim_nop_timer = owl_select_add_timer("owl_aim_send_nop", 30, 30, owl_aim_send_nop, NULL, NULL);
>
> return(0);
> }
> @@ -209,7 +209,8 @@ void owl_aim_successful_login(const char *screenname)
>
> /* start the ingorelogin timer */
> owl_global_set_ignore_aimlogin(&g);
> - owl_select_add_timer(owl_global_get_aim_ignorelogin_timer(&g),
> + owl_select_add_timer("owl_aim_unset_ignorelogin",
> + owl_global_get_aim_ignorelogin_timer(&g),
> 0, owl_aim_unset_ignorelogin, NULL, NULL);
>
> /* aim_ssi_setpresence(owl_global_get_aimsess(&g), 0x00000400); */
> diff --git a/commands.c b/commands.c
> index 432d794..bc6dc63 100644
> --- a/commands.c
> +++ b/commands.c
> @@ -653,6 +653,7 @@ const owl_cmd commands_to_init[]
> "show styles\n"
> "show subscriptions / show subs\n"
> "show terminal\n"
> + "show timers\n"
> "show variables\n"
> "show variable <variable>\n"
> "show version\n"
> @@ -2242,6 +2243,8 @@ char *owl_command_show(int argc, const char *const *argv, const char *buff)
> owl_function_show_colors();
> } else if (!strcmp(argv[1], "styles")) {
> owl_function_show_styles();
> + } else if (!strcmp(argv[1], "timers")) {
> + owl_function_show_timers();
> } else if (!strcmp(argv[1], "subs") || !strcmp(argv[1], "subscriptions")) {
> owl_function_getsubs();
> } else if (!strcmp(argv[1], "terminal") || !strcmp(argv[1], "term")) {
> diff --git a/functions.c b/functions.c
> index 767fc9d..89e02ff 100644
> --- a/functions.c
> +++ b/functions.c
> @@ -92,6 +92,36 @@ void owl_function_show_styles(void) {
> owl_fmtext_cleanup(&fm);
> }
>
> +static void _owl_function_timer_append_fmtext(gpointer data, gpointer user_data) {
> + owl_fmtext *fm = user_data;
> + owl_timer *timer = data;
> + char *str = owl_sprintf("- %s: in %d seconds",
> + timer->name ? timer->name : "(unnamed)",
> + timer->time - time(NULL));
> + owl_fmtext_append_normal(fm, str);
> + owl_free(str);
> + if (timer->interval) {
> + str = owl_sprintf(", repeat every %d seconds", timer->interval);
> + owl_fmtext_append_normal(fm, str);
> + owl_free(str);
> + }
> + owl_fmtext_append_normal(fm, "\n");
> +}
> +
> +void owl_function_show_timers(void) {
> + owl_fmtext fm;
> + GList **timers;
> +
> + owl_fmtext_init_null(&fm);
> + owl_fmtext_append_bold(&fm, "Active timers:\n");
> +
> + timers = owl_global_get_timerlist(&g);
> + g_list_foreach(*timers, _owl_function_timer_append_fmtext, &fm);
> +
> + owl_function_popless_fmtext(&fm);
> + owl_fmtext_cleanup(&fm);
> +}
> +
> char *owl_function_style_describe(const char *name) {
> const char *desc;
> char *s;
> diff --git a/owl.h b/owl.h
> index 7711736..8d6ca37 100644
> --- a/owl.h
> +++ b/owl.h
> @@ -531,6 +531,7 @@ typedef struct _owl_timer {
> void (*callback)(struct _owl_timer *, void *);
> void (*destroy)(struct _owl_timer *);
> void *data;
> + char *name;
> } owl_timer;
>
> typedef struct _owl_errqueue {
> diff --git a/perl/lib/BarnOwl/Complete/Client.pm b/perl/lib/BarnOwl/Complete/Client.pm
> index eb5e630..076a41a 100644
> --- a/perl/lib/BarnOwl/Complete/Client.pm
> +++ b/perl/lib/BarnOwl/Complete/Client.pm
> @@ -36,6 +36,7 @@ my %show = (
> subscriptions => undef,
> subs => undef,
> terminal => undef,
> + timers => undef,
> variables => undef,
> variable => \&complete_variable,
> version => undef,
> diff --git a/perl/lib/BarnOwl/MainLoopCompatHook.pm b/perl/lib/BarnOwl/MainLoopCompatHook.pm
> index d42df25..35cdb2f 100644
> --- a/perl/lib/BarnOwl/MainLoopCompatHook.pm
> +++ b/perl/lib/BarnOwl/MainLoopCompatHook.pm
> @@ -48,6 +48,7 @@ sub _ensure_timer {
> weaken($weak);
> unless ($self->{timer}) {
> $self->{timer} = BarnOwl::Timer->new( {
> + name => "BarnOwl::MainLoopCompatHook",
> after => 0,
> interval => 1,
> cb => sub {
> diff --git a/perl/lib/BarnOwl/Timer.pm b/perl/lib/BarnOwl/Timer.pm
> index e121731..c7dbc46 100644
> --- a/perl/lib/BarnOwl/Timer.pm
> +++ b/perl/lib/BarnOwl/Timer.pm
> @@ -12,11 +12,15 @@ sub new {
>
> my $self = {cb => $cb};
>
> + my $name = $args->{name};
> + $name = "(unnamed)" unless defined $name;
> +
> bless($self, $class);
>
> $self->{timer} = BarnOwl::Internal::add_timer($args->{after} || 0,
> $args->{interval} || 0,
> - $self);
> + $self,
> + $name);
> return $self;
> }
>
> diff --git a/perl/modules/IRC/lib/BarnOwl/Module/IRC/Connection.pm b/perl/modules/IRC/lib/BarnOwl/Module/IRC/Connection.pm
> index e4b30e2..ba4f0c3 100644
> --- a/perl/modules/IRC/lib/BarnOwl/Module/IRC/Connection.pm
> +++ b/perl/modules/IRC/lib/BarnOwl/Module/IRC/Connection.pm
> @@ -323,6 +323,7 @@ sub schedule_reconnect {
> }
> $self->{reconnect_timer} =
> BarnOwl::Timer->new( {
> + name => 'IRC (' . $self->alias . ') reconnect_timer',
> after => $interval,
> cb => sub {
> $weak->reconnect( $interval ) if $weak;
> diff --git a/perl/modules/Jabber/lib/BarnOwl/Module/Jabber/Connection.pm b/perl/modules/Jabber/lib/BarnOwl/Module/Jabber/Connection.pm
> index 9248226..8feffb0 100644
> --- a/perl/modules/Jabber/lib/BarnOwl/Module/Jabber/Connection.pm
> +++ b/perl/modules/Jabber/lib/BarnOwl/Module/Jabber/Connection.pm
> @@ -197,6 +197,7 @@ sub onConnect {
> unless (exists $BarnOwl::Module::Jabber::vars{keepAliveTimer}) {
> $BarnOwl::Module::Jabber::vars{keepAliveTimer} =
> BarnOwl::Timer->new({
> + 'name' => "Jabber ($fullJid) keepAliveTimer",
> 'after' => 5,
> 'interval' => 5,
> 'cb' => sub { BarnOwl::Module::Jabber::do_keep_alive_and_auto_away(@_) }
> diff --git a/perl/modules/Twitter/lib/BarnOwl/Module/Twitter/Handle.pm b/perl/modules/Twitter/lib/BarnOwl/Module/Twitter/Handle.pm
> index cba4d33..07ff246 100644
> --- a/perl/modules/Twitter/lib/BarnOwl/Module/Twitter/Handle.pm
> +++ b/perl/modules/Twitter/lib/BarnOwl/Module/Twitter/Handle.pm
> @@ -159,8 +159,10 @@ sub sleep {
> $self->{direct_timer} = undef;
> }
>
> + my $nickname = $self->{cfg}->{account_nickname};
> if($self->{cfg}->{poll_for_tweets}) {
> $self->{timer} = BarnOwl::Timer->new({
> + name => "Twitter ($nickname) poll_for_tweets",
> after => $delay,
> interval => 90,
> cb => sub { $weak->poll_twitter if $weak }
> @@ -169,6 +171,7 @@ sub sleep {
>
> if($self->{cfg}->{poll_for_dms}) {
> $self->{direct_timer} = BarnOwl::Timer->new({
> + name => "Twitter ($nickname) direct_timer",
> after => $delay,
> interval => 180,
> cb => sub { $weak->poll_direct if $weak }
> diff --git a/perlglue.xs b/perlglue.xs
> index ba9f086..12877de 100644
> --- a/perlglue.xs
> +++ b/perlglue.xs
> @@ -515,21 +515,23 @@ add_io_dispatch(fd, mode, cb)
> owl_select_add_perl_io_dispatch(fd, mode, newSVsv(cb));
>
> IV
> -add_timer(after, interval, cb)
> +add_timer(after, interval, cb, name = NULL)
> int after
> int interval
> SV *cb
> + const char *name
> PREINIT:
> SV *ref;
> owl_timer *t;
> CODE:
> ref = sv_rvweaken(newSVsv(cb));
> - t = owl_select_add_timer(after,
> + t = owl_select_add_timer(name,
> + after,
> interval,
> owl_perlconfig_perl_timer,
> owl_perlconfig_perl_timer_destroy,
> ref);
> - owl_function_debugmsg("Created timer %p", t);
> + owl_function_debugmsg("Created timer %s: %p", t->name ? t->name : "(unnamed)", t);
> RETVAL = (IV)t;
> OUTPUT:
> RETVAL
> @@ -541,8 +543,8 @@ remove_timer(timer)
> owl_timer *t;
> CODE:
> t = (owl_timer*)timer;
> - owl_function_debugmsg("Freeing timer %p", t);
> - owl_select_remove_timer(t);
> + owl_function_debugmsg("Freeing timer %s: %p", t->name ? t->name : "(unnamed)", t);
> + owl_select_remove_timer(t);
>
> MODULE = BarnOwl PACKAGE = BarnOwl::Editwin
>
> diff --git a/select.c b/select.c
> index a6f0ddf..cecc6b0 100644
> --- a/select.c
> +++ b/select.c
> @@ -12,7 +12,7 @@ int _owl_select_timer_eq(const owl_timer *t1, const owl_timer *t2) {
> return t1 == t2;
> }
>
> -owl_timer *owl_select_add_timer(int after, int interval, void (*cb)(owl_timer *, void *), void (*destroy)(owl_timer*), void *data)
> +owl_timer *owl_select_add_timer(const char* name, int after, int interval, void (*cb)(owl_timer *, void *), void (*destroy)(owl_timer*), void *data)
> {
> owl_timer *t = owl_malloc(sizeof(owl_timer));
> GList **timers = owl_global_get_timerlist(&g);
> @@ -22,6 +22,7 @@ owl_timer *owl_select_add_timer(int after, int interval, void (*cb)(owl_timer *,
> t->callback = cb;
> t->destroy = destroy;
> t->data = data;
> + t->name = name ? owl_strdup(name) : NULL;
>
> *timers = g_list_insert_sorted(*timers, t,
> (GCompareFunc)_owl_select_timer_cmp);
> @@ -36,6 +37,7 @@ void owl_select_remove_timer(owl_timer *t)
> if(t->destroy) {
> t->destroy(t);
> }
> + owl_free(t->name);
> owl_free(t);
> }
> }
> diff --git a/variable.c b/variable.c
> index ada962e..5380e62 100644
> --- a/variable.c
> +++ b/variable.c
> @@ -434,7 +434,8 @@ int owl_variable_pseudologins_set(owl_variable *v, const void *newval)
> if (*(const int*)newval == 1) {
> owl_function_zephyr_buddy_check(0);
> if (timer == NULL) {
> - timer = owl_select_add_timer(180, 180, owl_zephyr_buddycheck_timer, NULL, NULL);
> + timer = owl_select_add_timer("owl_zephyr_buddycheck_timer",
> + 180, 180, owl_zephyr_buddycheck_timer, NULL, NULL);
> }
> } else {
> if (timer != NULL) {
> --
> 1.7.3.1.g716de
>
>