[2690] in BarnOwl Developers
Re: [PATCH] Track names along with timers, add :show timers
daemon@ATHENA.MIT.EDU (David A Benjamin)
Wed Sep 29 22:07:36 2010
Date: Wed, 29 Sep 2010 22:07:33 -0400 (EDT)
From: David A Benjamin <davidben@MIT.EDU>
To: Nelson Elhage <nelhage@mit.edu>
cc: barnowl-dev@mit.edu
In-Reply-To: <87zkv0kmtt.fsf@mit.edu>
On Wed, 29 Sep 2010, Nelson Elhage wrote:
>> + 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.
Oh, oops. Yeah, that was definitely my intent, but my eyes must have
caught onto the wrong curly braces. :-)
David
> 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
>>
>>
>