# HG changeset patch # User yaz # Date 1165681961 28800 # Node ID 1bd205b6e83defccd52b14d667152e1b1743b959 # Parent 7fc7b66c8a530ff31d5cc5206f175643304efca2 [svn] - replace g_usleep() with g_cond_timed_wait() - some bug fixes diff -r 7fc7b66c8a53 -r 1bd205b6e83d ChangeLog --- a/ChangeLog Sat Dec 09 05:52:12 2006 -0800 +++ b/ChangeLog Sat Dec 09 08:32:41 2006 -0800 @@ -1,3 +1,11 @@ +2006-12-09 13:52:12 +0000 William Pitcock + revision [770] + - you know, it'd help if binio were better documented. + + trunk/src/adplug/core/binio_virtual.h | 66 ++++++++++++++++++++++++---------- + 1 file changed, 48 insertions(+), 18 deletions(-) + + 2006-12-09 13:29:06 +0000 Giacomo Lozito revision [768] prevent adplug makefile from pointlessly trying to link source files in the core library diff -r 7fc7b66c8a53 -r 1bd205b6e83d src/scrobbler/plugin.c --- a/src/scrobbler/plugin.c Sat Dec 09 05:52:12 2006 -0800 +++ b/src/scrobbler/plugin.c Sat Dec 09 08:32:41 2006 -0800 @@ -30,6 +30,8 @@ #include "configure.h" #define XS_CS xmms_scrobbler.xmms_session +#define XS_SLEEP 1 +#define HS_SLEEP 10 typedef struct submit_t { @@ -43,10 +45,13 @@ static int sc_going, ge_going, ha_going; static GtkWidget *cfgdlg; +static GMutex *m_scrobbler; static GThread *pt_scrobbler; -static GMutex *m_scrobbler; static GThread *pt_handshake; +static GMutex *hs_mutex, *xs_mutex; +static GCond *hs_cond, *xs_cond; + static GeneralPlugin xmms_scrobbler = { NULL, @@ -67,6 +72,7 @@ ConfigDb *cfgfile; sc_going = 1; ge_going = 1; + ha_going = 1; GError **moo = NULL; cfgdlg = create_cfgdlg(); @@ -125,7 +131,12 @@ g_free(ha_password); m_scrobbler = g_mutex_new(); - if ((pt_scrobbler = g_thread_create(xs_thread, m_scrobbler, TRUE, moo)) == NULL) + hs_mutex = g_mutex_new(); + xs_mutex = g_mutex_new(); + hs_cond = g_cond_new(); + xs_cond = g_cond_new(); + + if ((pt_scrobbler = g_thread_create(xs_thread, NULL, TRUE, moo)) == NULL) { pdebug(fmt_vastr("Error creating scrobbler thread: %s", moo), DEBUG); sc_going = 0; @@ -134,7 +145,7 @@ return; } - if ((pt_handshake = g_thread_create(hs_thread, m_scrobbler, TRUE, NULL)) == NULL) + if ((pt_handshake = g_thread_create(hs_thread, NULL, TRUE, moo)) == NULL) { pdebug(fmt_vastr("Error creating handshake thread: %s", moo), DEBUG); sc_going = 0; @@ -153,19 +164,34 @@ prefswin_page_destroy(cfgdlg); - if (!sc_going && !ge_going) + if (!sc_going && !ge_going && ! ha_going) return; pdebug("about to lock mutex", DEBUG); g_mutex_lock(m_scrobbler); pdebug("locked mutex", DEBUG); sc_going = 0; ge_going = 0; + ha_going = 0; g_mutex_unlock(m_scrobbler); pdebug("joining threads", DEBUG); + + /* wake up waiting threads */ + pdebug("send signal to xs and hs", DEBUG); + g_cond_signal(xs_cond); + g_cond_signal(hs_cond); + + pdebug("wait xs", DEBUG); g_thread_join(pt_scrobbler); + pdebug("wait hs", DEBUG); g_thread_join(pt_handshake); + g_cond_free(hs_cond); + g_cond_free(xs_cond); + g_mutex_free(hs_mutex); + g_mutex_free(xs_mutex); + g_mutex_free(m_scrobbler); + sc_cleaner(); gerpok_sc_cleaner(); hatena_sc_cleaner(); @@ -421,7 +447,8 @@ { int run = 1; submit_t dosubmit; - + GTimeVal sleeptime; + while (run) { /* Error catching */ if(sc_catch_error()) @@ -470,10 +497,16 @@ else pdebug("tuple does not contain an artist or a title, not submitting.", DEBUG); } + g_get_current_time(&sleeptime); + sleeptime.tv_sec += XS_SLEEP; + g_mutex_lock(m_scrobbler); run = (sc_going != 0 || ge_going != 0 || ha_going != 0); g_mutex_unlock(m_scrobbler); - g_usleep(100000); + + g_mutex_lock(xs_mutex); + g_cond_timed_wait(xs_cond, xs_mutex, &sleeptime); + g_mutex_unlock(xs_mutex); } pdebug("scrobbler thread: exiting", DEBUG); g_thread_exit(NULL); @@ -484,7 +517,8 @@ static void *hs_thread(void *data __attribute__((unused))) { int run = 1; - + GTimeVal sleeptime; + while(run) { if(sc_idle(m_scrobbler)) @@ -492,7 +526,7 @@ pdebug("Giving up due to fatal error", DEBUG); g_mutex_lock(m_scrobbler); sc_going = 0; - g_mutex_lock(m_scrobbler); + g_mutex_unlock(m_scrobbler); } if(gerpok_sc_idle(m_scrobbler)) @@ -500,7 +534,7 @@ pdebug("Giving up due to fatal error", DEBUG); g_mutex_lock(m_scrobbler); ge_going = 0; - g_mutex_lock(m_scrobbler); + g_mutex_unlock(m_scrobbler); } if(hatena_sc_idle(m_scrobbler)) @@ -508,13 +542,21 @@ pdebug("Giving up due to fatal error", DEBUG); g_mutex_lock(m_scrobbler); ha_going = 0; - g_mutex_lock(m_scrobbler); + g_mutex_unlock(m_scrobbler); } g_mutex_lock(m_scrobbler); run = (sc_going != 0 || ge_going != 0 || ha_going != 0); g_mutex_unlock(m_scrobbler); - g_usleep(1000000); + + if(run) { + g_get_current_time(&sleeptime); + sleeptime.tv_sec += HS_SLEEP; + + g_mutex_lock(hs_mutex); + g_cond_timed_wait(hs_cond, hs_mutex, &sleeptime); + g_mutex_unlock(hs_mutex); + } } pdebug("handshake thread: exiting", DEBUG); g_thread_exit(NULL);