From 1afe1a51ffcd7b052ab25355d4f27c0492deb4c5 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Fri, 28 Oct 2011 16:19:18 -0700 Subject: [PATCH] Fixed a race condition where multiple syncs could be started simultaneously --- .../todoroo/astrid/sync/SyncBackgroundService.java | 14 +++++++++++--- api/src/com/todoroo/astrid/sync/SyncProvider.java | 4 ++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/api/src/com/todoroo/astrid/sync/SyncBackgroundService.java b/api/src/com/todoroo/astrid/sync/SyncBackgroundService.java index 533808fd0..f15794569 100644 --- a/api/src/com/todoroo/astrid/sync/SyncBackgroundService.java +++ b/api/src/com/todoroo/astrid/sync/SyncBackgroundService.java @@ -1,5 +1,7 @@ package com.todoroo.astrid.sync; +import java.util.concurrent.atomic.AtomicBoolean; + import android.app.AlarmManager; import android.app.PendingIntent; import android.app.Service; @@ -45,12 +47,15 @@ abstract public class SyncBackgroundService extends Service { DependencyInjectionService.getInstance().inject(this); } + private final AtomicBoolean started = new AtomicBoolean(false); + /** Receive the alarm - start the synchronize service! */ @Override public void onStart(Intent intent, int startId) { try { - if(intent != null) + if(intent != null && !started.getAndSet(true)) { startSynchronization(this); + } } catch (Exception e) { exceptionService.reportError(getSyncUtilities().getIdentifier() + "-bg-sync", e); //$NON-NLS-1$ } @@ -67,8 +72,6 @@ abstract public class SyncBackgroundService extends Service { return; getSyncProvider().synchronize(context); - - stopSelf(); } @Override @@ -76,6 +79,11 @@ abstract public class SyncBackgroundService extends Service { return null; } + public synchronized void stop() { + started.set(false); + stopSelf(); + } + // --- alarm management /** diff --git a/api/src/com/todoroo/astrid/sync/SyncProvider.java b/api/src/com/todoroo/astrid/sync/SyncProvider.java index 53cded1d1..7894d3917 100644 --- a/api/src/com/todoroo/astrid/sync/SyncProvider.java +++ b/api/src/com/todoroo/astrid/sync/SyncProvider.java @@ -11,7 +11,6 @@ import java.util.HashMap; import android.app.Activity; import android.app.Notification; -import android.app.Service; import android.content.Context; import android.widget.Toast; @@ -162,7 +161,7 @@ public abstract class SyncProvider { }); } initiateManual((Activity)context); - } else if(context instanceof Service) { + } else if(context instanceof SyncBackgroundService) { // display notification final int notificationId = updateNotification(context, notification); final NotificationManager nm = new NotificationManager.AndroidNotificationManager(context); @@ -175,6 +174,7 @@ public abstract class SyncProvider { initiateBackground(); } finally { nm.cancel(notificationId); + ((SyncBackgroundService)context).stop(); } } }).start();