Program: 21859
Project: 21859
Buggy source:
/** 
 * Destroy the current CLIENT SIDE instance of an activity.  This may be called both when actually finishing an activity, or when performing a configuration switch where we destroy the current client-side object but then create a new client-side object for this same HistoryRecord.
 */
final boolean destroyActivityLocked(ActivityRecord r,boolean removeFromApp){
  if (DEBUG_SWITCH)   Slog.v(TAG,"String_Node_Str" + r + "String_Node_Str"+ (r.app != null ? r.app.processName : "String_Node_Str"));
  EventLog.writeEvent(EventLogTags.AM_DESTROY_ACTIVITY,System.identityHashCode(r),r.task.taskId,r.shortComponentName);
  boolean removedFromHistory=false;
  cleanUpActivityLocked(r,false);
  final boolean hadApp=r.app != null;
  if (hadApp) {
    if (removeFromApp) {
      int idx=r.app.activities.indexOf(r);
      if (idx >= 0) {
        r.app.activities.remove(idx);
      }
      if (mService.mHeavyWeightProcess == r.app && r.app.activities.size() <= 0) {
        mService.mHeavyWeightProcess=null;
        mService.mHandler.sendEmptyMessage(ActivityManagerService.CANCEL_HEAVY_NOTIFICATION_MSG);
      }
      if (r.persistent) {
        mService.decPersistentCountLocked(r.app);
      }
      if (r.app.activities.size() == 0) {
        mService.updateLruProcessLocked(r.app,true,false);
      }
    }
    boolean skipDestroy=false;
    try {
      if (DEBUG_SWITCH)       Slog.i(TAG,"String_Node_Str" + r);
      r.app.thread.scheduleDestroyActivity(r,r.finishing,r.configChangeFlags);
    }
 catch (    Exception e) {
      if (r.finishing) {
        removeActivityFromHistoryLocked(r);
        removedFromHistory=true;
        skipDestroy=true;
      }
    }
    r.app=null;
    r.nowVisible=false;
    if (r.finishing && !skipDestroy) {
      r.state=ActivityState.DESTROYING;
      Message msg=mHandler.obtainMessage(DESTROY_TIMEOUT_MSG);
      msg.obj=r;
      mHandler.sendMessageDelayed(msg,DESTROY_TIMEOUT);
    }
 else {
      r.state=ActivityState.DESTROYED;
    }
  }
 else {
    if (r.finishing) {
      removeActivityFromHistoryLocked(r);
      removedFromHistory=true;
    }
 else {
      r.state=ActivityState.DESTROYED;
    }
  }
  r.configChangeFlags=0;
  if (!mLRUActivities.remove(r) && hadApp) {
    Slog.w(TAG,"String_Node_Str" + r + "String_Node_Str");
  }
  return removedFromHistory;
}

Fixed version (ground truth):
/** 
 * Destroy the current CLIENT SIDE instance of an activity.  This may be called both when actually finishing an activity, or when performing a configuration switch where we destroy the current client-side object but then create a new client-side object for this same HistoryRecord.
 */
final boolean destroyActivityLocked(ActivityRecord r,boolean removeFromApp){
  if (DEBUG_SWITCH)   Slog.v(TAG,"String_Node_Str" + r + "String_Node_Str"+ (r.app != null ? r.app.processName : "String_Node_Str"));
  EventLog.writeEvent(EventLogTags.AM_DESTROY_ACTIVITY,System.identityHashCode(r),r.task.taskId,r.shortComponentName);
  boolean removedFromHistory=false;
  cleanUpActivityLocked(r,false);
  final boolean hadApp=r.app != null;
  if (hadApp) {
    if (removeFromApp) {
      int idx=r.app.activities.indexOf(r);
      if (idx >= 0) {
        r.app.activities.remove(idx);
      }
      if (mService.mHeavyWeightProcess == r.app && r.app.activities.size() <= 0) {
        mService.mHeavyWeightProcess=null;
        mService.mHandler.sendEmptyMessage(ActivityManagerService.CANCEL_HEAVY_NOTIFICATION_MSG);
      }
      if (r.app.activities.size() == 0) {
        mService.updateLruProcessLocked(r.app,true,false);
      }
    }
    boolean skipDestroy=false;
    try {
      if (DEBUG_SWITCH)       Slog.i(TAG,"String_Node_Str" + r);
      r.app.thread.scheduleDestroyActivity(r,r.finishing,r.configChangeFlags);
    }
 catch (    Exception e) {
      if (r.finishing) {
        removeActivityFromHistoryLocked(r);
        removedFromHistory=true;
        skipDestroy=true;
      }
    }
    r.app=null;
    r.nowVisible=false;
    if (r.finishing && !skipDestroy) {
      r.state=ActivityState.DESTROYING;
      Message msg=mHandler.obtainMessage(DESTROY_TIMEOUT_MSG);
      msg.obj=r;
      mHandler.sendMessageDelayed(msg,DESTROY_TIMEOUT);
    }
 else {
      r.state=ActivityState.DESTROYED;
    }
  }
 else {
    if (r.finishing) {
      removeActivityFromHistoryLocked(r);
      removedFromHistory=true;
    }
 else {
      r.state=ActivityState.DESTROYED;
    }
  }
  r.configChangeFlags=0;
  if (!mLRUActivities.remove(r) && hadApp) {
    Slog.w(TAG,"String_Node_Str" + r + "String_Node_Str");
  }
  return removedFromHistory;
}