00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "xmmspriv/xmms_collsync.h"
00024 #include "xmmspriv/xmms_thread_name.h"
00025 #include "xmms/xmms_log.h"
00026 #include <glib.h>
00027
00028 static GThread *thread;
00029 static GMutex *mutex;
00030 static GCond *cond;
00031 static gboolean want_sync = FALSE;
00032 static gboolean keep_running = TRUE;
00033
00034
00035
00036
00037
00038 static gpointer
00039 do_loop (gpointer udata)
00040 {
00041 xmms_coll_dag_t *dag = udata;
00042 GTimeVal time;
00043
00044 xmms_set_thread_name ("x2 coll sync");
00045
00046 g_mutex_lock (mutex);
00047
00048 while (keep_running) {
00049 if (!want_sync) {
00050 g_cond_wait (cond, mutex);
00051 }
00052
00053
00054 while (keep_running && want_sync) {
00055 want_sync = FALSE;
00056
00057 g_get_current_time (&time);
00058 g_time_val_add (&time, 10000000);
00059
00060 g_cond_timed_wait (cond, mutex, &time);
00061 }
00062
00063 if (keep_running) {
00064
00065
00066 g_mutex_unlock (mutex);
00067
00068 XMMS_DBG ("Syncing collections to database.");
00069 xmms_collection_sync (dag);
00070
00071 g_mutex_lock (mutex);
00072 }
00073 }
00074
00075 g_mutex_unlock (mutex);
00076
00077 return NULL;
00078 }
00079
00080
00081
00082
00083 void
00084 xmms_coll_sync_init (xmms_coll_dag_t *dag)
00085 {
00086 cond = g_cond_new ();
00087 mutex = g_mutex_new ();
00088
00089 thread = g_thread_create (do_loop, dag, TRUE, NULL);
00090 }
00091
00092
00093
00094
00095 void
00096 xmms_coll_sync_shutdown ()
00097 {
00098 g_mutex_lock (mutex);
00099 keep_running = FALSE;
00100 g_cond_signal (cond);
00101 g_mutex_unlock (mutex);
00102
00103 g_thread_join (thread);
00104
00105 g_mutex_free (mutex);
00106 g_cond_free (cond);
00107 }
00108
00109
00110
00111
00112 void
00113 xmms_coll_sync_schedule_sync ()
00114 {
00115 g_mutex_lock (mutex);
00116 want_sync = TRUE;
00117 g_cond_signal (cond);
00118 g_mutex_unlock (mutex);
00119 }