summaryrefslogtreecommitdiff
path: root/navit/vehicle
diff options
context:
space:
mode:
authorSebastian Leske <sebastian.leske@sleske.name>2015-10-26 08:12:40 +0100
committerSebastian Leske <sebastian.leske@sleske.name>2015-10-27 16:33:13 +0100
commit3203adf409379d7893cd4ef96e12b27a492d1d71 (patch)
tree9f7b26d5e0802b4d2a2d7c97f67e08041f2c4e7b /navit/vehicle
parent7dc21344072cb7e5aef19c8b25291a61aaa20f82 (diff)
downloadnavit-3203adf409379d7893cd4ef96e12b27a492d1d71.tar.gz
vehicle_gpsd:Read all pending data on every poll.R6323
When the system is overloaded, we may lag behind reading the reports streamed by gpsd. To mitigate this, read all pending reports during every poll, and only process the latest report. There is no point in processing a GPS report if a later report is already waiting on the socket. Fixes trac #1332.
Diffstat (limited to 'navit/vehicle')
-rw-r--r--navit/vehicle/gpsd/vehicle_gpsd.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/navit/vehicle/gpsd/vehicle_gpsd.c b/navit/vehicle/gpsd/vehicle_gpsd.c
index f7f5616f9..73d9e648d 100644
--- a/navit/vehicle/gpsd/vehicle_gpsd.c
+++ b/navit/vehicle/gpsd/vehicle_gpsd.c
@@ -318,7 +318,11 @@ vehicle_gpsd_io(struct vehicle_priv *priv)
if (priv->gps) {
vehicle_last = priv;
#if GPSD_API_MAJOR_VERSION >= 5
- if(gps_read(priv->gps)==-1) {
+ int read_result;
+ /* Read until EOF, in case we are lagging behind.
+ * No point in processing old GPS reports. */
+ while((read_result=gps_read(priv->gps))>0);
+ if(read_result==-1) {
dbg(lvl_error,"gps_poll failed\n");
vehicle_gpsd_close(priv);
vehicle_gpsd_open(priv);