Program: 35587
Project: 35587
Buggy source:
private void performCall(){
  ncApi.joinCall(credentials,ApiUtils.getUrlForCall(baseUrl,roomToken)).subscribeOn(Schedulers.newThread()).retry(3).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<GenericOverall>(){
    @Override public void onSubscribe(    Disposable d){
    }
    @Override public void onNext(    GenericOverall genericOverall){
      inCall=true;
      if (!hasChatSupport) {
        ApplicationWideCurrentRoomHolder.getInstance().setCurrentRoomId(roomId);
        ApplicationWideCurrentRoomHolder.getInstance().setInCall(true);
        ApplicationWideCurrentRoomHolder.getInstance().setUserInRoom(userEntity);
      }
 else {
        ApplicationWideCurrentRoomHolder.getInstance().setInCall(true);
      }
      ncApi.pingCall(credentials,ApiUtils.getUrlForCallPing(baseUrl,roomToken)).subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).repeatWhen(observable -> observable.delay(5000,TimeUnit.MILLISECONDS)).takeWhile(observable -> inCall).retry(3,observable -> inCall).subscribe(new Observer<GenericOverall>(){
        @Override public void onSubscribe(        Disposable d){
          pingDisposable=d;
        }
        @Override public void onNext(        GenericOverall genericOverall){
        }
        @Override public void onError(        Throwable e){
          dispose(pingDisposable);
        }
        @Override public void onComplete(){
          dispose(pingDisposable);
        }
      }
);
      String urlToken=null;
      if (isMultiSession) {
        urlToken=roomToken;
      }
      ncApi.pullSignalingMessages(credentials,ApiUtils.getUrlForSignaling(baseUrl,urlToken)).subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).repeatWhen(observable -> observable).takeWhile(observable -> inCall).retry(3,observable -> inCall).subscribe(new Observer<SignalingOverall>(){
        @Override public void onSubscribe(        Disposable d){
          signalingDisposable=d;
        }
        @Override public void onNext(        SignalingOverall signalingOverall){
          if (signalingOverall.getOcs().getSignalings() != null) {
            for (int i=0; i < signalingOverall.getOcs().getSignalings().size(); i++) {
              try {
                receivedSignalingMessage(signalingOverall.getOcs().getSignalings().get(i));
              }
 catch (              IOException e) {
                Log.e(TAG,"String_Node_Str" + "String_Node_Str");
              }
            }
          }
        }
        @Override public void onError(        Throwable e){
          dispose(signalingDisposable);
        }
        @Override public void onComplete(){
          dispose(signalingDisposable);
        }
      }
);
    }
    @Override public void onError(    Throwable e){
    }
    @Override public void onComplete(){
    }
  }
);
}

Fixed version (ground truth):
private void performCall(){
  ncApi.joinCall(credentials,ApiUtils.getUrlForCall(baseUrl,roomToken)).subscribeOn(Schedulers.newThread()).retry(3).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<GenericOverall>(){
    @Override public void onSubscribe(    Disposable d){
    }
    @Override public void onNext(    GenericOverall genericOverall){
      inCall=true;
      if (!hasChatSupport) {
        ApplicationWideCurrentRoomHolder.getInstance().setCurrentRoomId(roomId);
        ApplicationWideCurrentRoomHolder.getInstance().setInCall(true);
        ApplicationWideCurrentRoomHolder.getInstance().setUserInRoom(userEntity);
        ncApi.pingCall(credentials,ApiUtils.getUrlForCallPing(baseUrl,roomToken)).subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).repeatWhen(observable -> observable.delay(5000,TimeUnit.MILLISECONDS)).takeWhile(observable -> inCall).retry(3,observable -> inCall).subscribe(new Observer<GenericOverall>(){
          @Override public void onSubscribe(          Disposable d){
            pingDisposable=d;
          }
          @Override public void onNext(          GenericOverall genericOverall){
          }
          @Override public void onError(          Throwable e){
            dispose(pingDisposable);
          }
          @Override public void onComplete(){
            dispose(pingDisposable);
          }
        }
);
      }
 else {
        ApplicationWideCurrentRoomHolder.getInstance().setInCall(true);
      }
      String urlToken=null;
      if (isMultiSession) {
        urlToken=roomToken;
      }
      ncApi.pullSignalingMessages(credentials,ApiUtils.getUrlForSignaling(baseUrl,urlToken)).subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()).repeatWhen(observable -> observable).takeWhile(observable -> inCall).retry(3,observable -> inCall).subscribe(new Observer<SignalingOverall>(){
        @Override public void onSubscribe(        Disposable d){
          signalingDisposable=d;
        }
        @Override public void onNext(        SignalingOverall signalingOverall){
          if (signalingOverall.getOcs().getSignalings() != null) {
            for (int i=0; i < signalingOverall.getOcs().getSignalings().size(); i++) {
              try {
                receivedSignalingMessage(signalingOverall.getOcs().getSignalings().get(i));
              }
 catch (              IOException e) {
                Log.e(TAG,"String_Node_Str" + "String_Node_Str");
              }
            }
          }
        }
        @Override public void onError(        Throwable e){
          dispose(signalingDisposable);
        }
        @Override public void onComplete(){
          dispose(signalingDisposable);
        }
      }
);
    }
    @Override public void onError(    Throwable e){
    }
    @Override public void onComplete(){
    }
  }
);
}