donut snapshot
diff --git a/services/java/com/android/server/HeadsetObserver.java b/services/java/com/android/server/HeadsetObserver.java
index c9066be..3fc1e0e 100644
--- a/services/java/com/android/server/HeadsetObserver.java
+++ b/services/java/com/android/server/HeadsetObserver.java
@@ -21,6 +21,8 @@
 import android.content.Intent;
 import android.os.Handler;
 import android.os.Message;
+import android.os.PowerManager;
+import android.os.PowerManager.WakeLock;
 import android.os.UEventObserver;
 import android.util.Log;
 import android.media.AudioManager;
@@ -38,15 +40,19 @@
     private static final String HEADSET_STATE_PATH = "/sys/class/switch/h2w/state";
     private static final String HEADSET_NAME_PATH = "/sys/class/switch/h2w/name";
 
-    private Context mContext;
-
     private int mHeadsetState;
     private String mHeadsetName;
     private boolean mAudioRouteNeedsUpdate;
     private AudioManager mAudioManager;
 
+    private final Context mContext;
+    private final WakeLock mWakeLock;  // held while there is a pending route change
+
     public HeadsetObserver(Context context) {
         mContext = context;
+        PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
+        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "HeadsetObserver");
+        mWakeLock.setReferenceCounted(false);
 
         startObserving(HEADSET_UEVENT_MATCH);
 
@@ -103,6 +109,7 @@
                 // immediate, so delay the route change by 1000ms.
                 // This could be improved once the audio sub-system provides an
                 // interface to clear the audio pipeline.
+                mWakeLock.acquire();
                 mHandler.sendEmptyMessageDelayed(0, 1000);
             } else {
                 updateAudioRoute();
@@ -138,7 +145,8 @@
         @Override
         public void handleMessage(Message msg) {
             updateAudioRoute();
+            mWakeLock.release();
         }
-    };        
+    };
 
 }