X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fgps.c;h=81056e3c973a80f07188e9549e7132554e847862;hb=6d8031d73b7c1d874d7afa4cad2f248c4073764d;hp=e43af4a4e55b2256af5846f81c3f0a8d9f157ef4;hpb=7c14b05db2cd7b17321f1e37bfb852c1a9a3832d;p=collectd.git diff --git a/src/gps.c b/src/gps.c index e43af4a4..81056e3c 100644 --- a/src/gps.c +++ b/src/gps.c @@ -30,7 +30,6 @@ #include "common.h" #include "plugin.h" #include "utils_time.h" -#include "configfile.h" #define CGPS_TRUE 1 #define CGPS_FALSE 0 @@ -65,6 +64,7 @@ static cgps_data_t cgps_data = {NAN, NAN, NAN, NAN}; static pthread_t cgps_thread_id; static pthread_mutex_t cgps_data_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t cgps_thread_lock = PTHREAD_MUTEX_INITIALIZER; +static pthread_cond_t cgps_thread_cond = PTHREAD_COND_INITIALIZER; static int cgps_thread_shutdown = CGPS_FALSE; static int cgps_thread_running = CGPS_FALSE; @@ -73,27 +73,16 @@ static int cgps_thread_running = CGPS_FALSE; */ static int cgps_thread_pause(cdtime_t pTime) { - cdtime_t now; - now = cdtime (); - struct timespec pause_th; - CDTIME_T_TO_TIMESPEC (MS_TO_CDTIME_T(10), &pause_th); - while (CGPS_TRUE) - { - if ( (cdtime () - now) > pTime ) - { - break; - } + cdtime_t until = cdtime() + pTime; - pthread_mutex_lock (&cgps_thread_lock); - if (cgps_thread_shutdown == CGPS_TRUE) - { - return CGPS_FALSE; - } - pthread_mutex_unlock (&cgps_thread_lock); - nanosleep (&pause_th, NULL); - } + pthread_mutex_lock (&cgps_thread_lock); + pthread_cond_timedwait (&cgps_thread_cond, &cgps_thread_lock, + &CDTIME_T_TO_TIMESPEC (until)); + + int ret = !cgps_thread_shutdown; - return CGPS_TRUE; + pthread_mutex_lock (&cgps_thread_lock); + return ret; } /** @@ -221,14 +210,10 @@ quit: */ static void cgps_submit (const char *type, gauge_t value, const char *type_instance) { - value_t values[1]; value_list_t vl = VALUE_LIST_INIT; - values[0].gauge = value; - - vl.values = values; + vl.values = &(value_t) { .gauge = value }; vl.values_len = 1; - sstrncpy (vl.host, hostname_g, sizeof (vl.host)); sstrncpy (vl.plugin, "gps", sizeof (vl.plugin)); sstrncpy (vl.type, type, sizeof (vl.type)); sstrncpy (vl.type_instance, type_instance, sizeof (vl.type_instance)); @@ -239,7 +224,7 @@ static void cgps_submit (const char *type, gauge_t value, const char *type_insta /** * Read the data and submit by piece. */ -static int cgps_read () +static int cgps_read (void) { cgps_data_t data_copy; @@ -285,14 +270,14 @@ static int cgps_config (oconfig_item_t *ci) cgps_config_data.timeout > TIME_T_TO_CDTIME_T(5) || cgps_config_data.timeout < US_TO_CDTIME_T(500) - ) + ) { - WARNING ("gps plugin: timeout set to %.6f sec. setting to default (%.6f).", + WARNING ("gps plugin: timeout set to %.6f sec. setting to default (%.6f).", CDTIME_T_TO_DOUBLE(cgps_config_data.timeout), CDTIME_T_TO_DOUBLE(CGPS_DEFAULT_TIMEOUT) ); cgps_config_data.timeout = CGPS_DEFAULT_TIMEOUT; - } + } return (0); } @@ -315,7 +300,7 @@ static int cgps_init (void) CDTIME_T_TO_DOUBLE (cgps_config_data.timeout), CDTIME_T_TO_DOUBLE (cgps_config_data.pause_connect)); - status = plugin_thread_create (&cgps_thread_id, NULL, cgps_thread, NULL); + status = plugin_thread_create (&cgps_thread_id, NULL, cgps_thread, NULL, "gps"); if (status != 0) { ERROR ("gps plugin: pthread_create() failed."); @@ -334,6 +319,7 @@ static int cgps_shutdown (void) pthread_mutex_lock (&cgps_thread_lock); cgps_thread_shutdown = CGPS_TRUE; + pthread_cond_broadcast (&cgps_thread_cond); pthread_mutex_unlock (&cgps_thread_lock); pthread_join(cgps_thread_id, &res);