[android] destroy endpoint on call -crash GC

F
frogersik
Tue, Feb 7, 2017 9:48 AM

Hi,
Sorry for long post, but it cannot be shorter.
I have huge problem with deinit endpoint during call. I'm using latest
version of pjsip (2.6) build stack with ndk 11. When I call
Endpoint.delete() or Endpoint.libDestroy() I get crash from lib.

My problem is connected with gc
(http://www.pjsip.org/docs/book-latest/html/intro_pjsua2.html#problems-with-garbage-collection)\

Do you know what kind of objects I need to delete before I want to
deinitialize lib?

I want to do that when I lost connection, when I go out from WiFi or
other user interaction with WiFi.

In these case I get two kinds of error:

  1. "conf && port < conf->max_ports" failed (log in attachment)
  2. "Calling pjlib from unknown/external thread." (log in attachment)

I also attach full log when I disconnect WiFi during call. As you can
see. I try disconnect audio ports but it doesn't help.

BR, Andrzej

Here is my deinit procedure:
void deInitialize(final SipService sipService)
{
Log.d(this, "deInitialize deleteAudioMedia();");
deleteAudioMedia();
Log.d(this, "deInitialize deleteCall();");
deleteCall(sipService);
Log.d(this, "deInitialize deleteAccount();");
deleteAccount();
try
{
IntVector transportVector = ep.transportEnum();
for (int i = 0; i < transportVector.size(); i++)
{
Log.d(this, "deInitialize transportClose();");
ep.transportClose(i);
}
}
catch (Exception e)
{
Log.e(this, e);
}
Log.d(this, "deInitialize sipTpConfig.delete();");
sipTpConfig.delete();
sipTpConfig = null;
try
{
Thread.sleep(3000);
Log.d(this, "deInitialize ep.libDestroy();");
ep.libDestroy();
}
catch (Exception e)
{
Log.e(this, e);
}
Log.d(this, "deInitialize ep.delete();");
ep.delete();
ep = null;
sipService.notifyStackState(pjsua_state.PJSUA_STATE_NULL);
}

void deleteCall(final SipService sipService)
 {
     try
     {
         ep.hangupAllCalls();
         if (mSipAccount != null)
         {
             Stream.of(mSipAccount.getCallIDs()).filter(callId -> 

callId != -1).forEach(callId -> {
SipCall call = mSipAccount.getCall(callId);
if (call != null)
{
call.delete();
call = null;
}
sipService.notifyCallDisconnected(callId);
});
}
}
catch (Exception e)
{
Log.d(this, "deleteCall", e);
}
}

 void deleteAudioMedia()
 {
     try
     {
         AudioMediaVector audioMediaVector = ep.mediaEnumPorts();
         for (int i = 0; i < audioMediaVector.size(); i++)
         {
             Log.d(this, "audioMedia deleted");
             AudioMedia audioMedia = audioMediaVector.get(i);
             ep.mediaRemove(audioMedia);
             audioMedia.delete();
         }
         Log.d(this, "audDevManager deleted");
         ep.audDevManager().delete();
     }
     catch (Exception e)
     {
         Log.e(this, "deleteAudioMedia", e);
     }
 }

void deleteAccount()
 {
     if (mSipAccount != null)
     {
         try
         {
             mSipAccount.delete();
         }
         catch (final Exception e)
         {
             Log.e(this, e);
         }
     }
     mSipAccount = null;
 }

where

ep - Endpoint
mSipAccount - public class SipAccount extends Account
Hi, Sorry for long post, but it cannot be shorter. I have huge problem with deinit endpoint during call. I'm using latest version of pjsip (2.6) build stack with ndk 11. When I call Endpoint.delete() or Endpoint.libDestroy() I get crash from lib. My problem is connected with gc (http://www.pjsip.org/docs/book-latest/html/intro_pjsua2.html#problems-with-garbage-collection)\ Do you know what kind of objects I need to delete before I want to deinitialize lib? I want to do that when I lost connection, when I go out from WiFi or other user interaction with WiFi. In these case I get two kinds of error: 1. "conf && port < conf->max_ports" failed (log in attachment) 2. "Calling pjlib from unknown/external thread." (log in attachment) I also attach full log when I disconnect WiFi during call. As you can see. I try disconnect audio ports but it doesn't help. BR, Andrzej Here is my deinit procedure: void deInitialize(final SipService sipService) { Log.d(this, "deInitialize deleteAudioMedia();"); deleteAudioMedia(); Log.d(this, "deInitialize deleteCall();"); deleteCall(sipService); Log.d(this, "deInitialize deleteAccount();"); deleteAccount(); try { IntVector transportVector = ep.transportEnum(); for (int i = 0; i < transportVector.size(); i++) { Log.d(this, "deInitialize transportClose();"); ep.transportClose(i); } } catch (Exception e) { Log.e(this, e); } Log.d(this, "deInitialize sipTpConfig.delete();"); sipTpConfig.delete(); sipTpConfig = null; try { Thread.sleep(3000); Log.d(this, "deInitialize ep.libDestroy();"); ep.libDestroy(); } catch (Exception e) { Log.e(this, e); } Log.d(this, "deInitialize ep.delete();"); ep.delete(); ep = null; sipService.notifyStackState(pjsua_state.PJSUA_STATE_NULL); } void deleteCall(final SipService sipService) { try { ep.hangupAllCalls(); if (mSipAccount != null) { Stream.of(mSipAccount.getCallIDs()).filter(callId -> callId != -1).forEach(callId -> { SipCall call = mSipAccount.getCall(callId); if (call != null) { call.delete(); call = null; } sipService.notifyCallDisconnected(callId); }); } } catch (Exception e) { Log.d(this, "deleteCall", e); } } void deleteAudioMedia() { try { AudioMediaVector audioMediaVector = ep.mediaEnumPorts(); for (int i = 0; i < audioMediaVector.size(); i++) { Log.d(this, "audioMedia deleted"); AudioMedia audioMedia = audioMediaVector.get(i); ep.mediaRemove(audioMedia); audioMedia.delete(); } Log.d(this, "audDevManager deleted"); ep.audDevManager().delete(); } catch (Exception e) { Log.e(this, "deleteAudioMedia", e); } } void deleteAccount() { if (mSipAccount != null) { try { mSipAccount.delete(); } catch (final Exception e) { Log.e(this, e); } } mSipAccount = null; } where ep - Endpoint mSipAccount - public class SipAccount extends Account
MB
Michael Barthold
Tue, Feb 7, 2017 9:56 AM
// try to force GC to do its job before destroying the library, since it's
// recommended to do that by PJSUA examples
        Runtime.getRuntime().gc();
Thread.sleep(100);

mit freundlichen Grüßen | kind regards

Michael Barthold
Senior Software Architect

-----Ursprüngliche Nachricht-----
Von: pjsip [mailto:pjsip-bounces@lists.pjsip.org] Im Auftrag von frogersik
Gesendet: Dienstag, 7. Februar 2017 10:49
An: pjsip list pjsip@lists.pjsip.org
Betreff: [pjsip] [android] destroy endpoint on call -crash GC

Hi,
Sorry for long post, but it cannot be shorter.
I have huge problem with deinit endpoint during call. I'm using latest version of pjsip (2.6) build stack with ndk 11. When I call
Endpoint.delete() or Endpoint.libDestroy() I get crash from lib.

My problem is connected with gc
(http://www.pjsip.org/docs/book-latest/html/intro_pjsua2.html#problems-with-garbage-collection)\

Do you know what kind of objects I need to delete before I want to deinitialize lib?

I want to do that when I lost connection, when I go out from WiFi or other user interaction with WiFi.

In these case I get two kinds of error:

  1. "conf && port < conf->max_ports" failed (log in attachment) 2. "Calling pjlib from unknown/external thread." (log in attachment)

I also attach full log when I disconnect WiFi during call. As you can see. I try disconnect audio ports but it doesn't help.

BR, Andrzej

Here is my deinit procedure:
void deInitialize(final SipService sipService)
{
Log.d(this, "deInitialize deleteAudioMedia();");
deleteAudioMedia();
Log.d(this, "deInitialize deleteCall();");
deleteCall(sipService);
Log.d(this, "deInitialize deleteAccount();");
deleteAccount();
try
{
IntVector transportVector = ep.transportEnum();
for (int i = 0; i < transportVector.size(); i++)
{
Log.d(this, "deInitialize transportClose();");
ep.transportClose(i);
}
}
catch (Exception e)
{
Log.e(this, e);
}
Log.d(this, "deInitialize sipTpConfig.delete();");
sipTpConfig.delete();
sipTpConfig = null;
try
{
Thread.sleep(3000);
Log.d(this, "deInitialize ep.libDestroy();");
ep.libDestroy();
}
catch (Exception e)
{
Log.e(this, e);
}
Log.d(this, "deInitialize ep.delete();");
ep.delete();
ep = null;
sipService.notifyStackState(pjsua_state.PJSUA_STATE_NULL);
}

void deleteCall(final SipService sipService)
 {
     try
     {
         ep.hangupAllCalls();
         if (mSipAccount != null)
         {
             Stream.of(mSipAccount.getCallIDs()).filter(callId -> callId != -1).forEach(callId -> {
                 SipCall call = mSipAccount.getCall(callId);
                 if (call != null)
                 {
                     call.delete();
                     call = null;
                 }
                 sipService.notifyCallDisconnected(callId);
             });
         }
     }
     catch (Exception e)
     {
         Log.d(this, "deleteCall", e);
     }
 }

 void deleteAudioMedia()
 {
     try
     {
         AudioMediaVector audioMediaVector = ep.mediaEnumPorts();
         for (int i = 0; i < audioMediaVector.size(); i++)
         {
             Log.d(this, "audioMedia deleted");
             AudioMedia audioMedia = audioMediaVector.get(i);
             ep.mediaRemove(audioMedia);
             audioMedia.delete();
         }
         Log.d(this, "audDevManager deleted");
         ep.audDevManager().delete();
     }
     catch (Exception e)
     {
         Log.e(this, "deleteAudioMedia", e);
     }
 }

void deleteAccount()
 {
     if (mSipAccount != null)
     {
         try
         {
             mSipAccount.delete();
         }
         catch (final Exception e)
         {
             Log.e(this, e);
         }
     }
     mSipAccount = null;
 }

where

ep - Endpoint
mSipAccount - public class SipAccount extends Account
// try to force GC to do its job before destroying the library, since it's // recommended to do that by PJSUA examples Runtime.getRuntime().gc(); Thread.sleep(100); mit freundlichen Grüßen | kind regards Michael Barthold Senior Software Architect -----Ursprüngliche Nachricht----- Von: pjsip [mailto:pjsip-bounces@lists.pjsip.org] Im Auftrag von frogersik Gesendet: Dienstag, 7. Februar 2017 10:49 An: pjsip list <pjsip@lists.pjsip.org> Betreff: [pjsip] [android] destroy endpoint on call -crash GC Hi, Sorry for long post, but it cannot be shorter. I have huge problem with deinit endpoint during call. I'm using latest version of pjsip (2.6) build stack with ndk 11. When I call Endpoint.delete() or Endpoint.libDestroy() I get crash from lib. My problem is connected with gc (http://www.pjsip.org/docs/book-latest/html/intro_pjsua2.html#problems-with-garbage-collection)\ Do you know what kind of objects I need to delete before I want to deinitialize lib? I want to do that when I lost connection, when I go out from WiFi or other user interaction with WiFi. In these case I get two kinds of error: 1. "conf && port < conf->max_ports" failed (log in attachment) 2. "Calling pjlib from unknown/external thread." (log in attachment) I also attach full log when I disconnect WiFi during call. As you can see. I try disconnect audio ports but it doesn't help. BR, Andrzej Here is my deinit procedure: void deInitialize(final SipService sipService) { Log.d(this, "deInitialize deleteAudioMedia();"); deleteAudioMedia(); Log.d(this, "deInitialize deleteCall();"); deleteCall(sipService); Log.d(this, "deInitialize deleteAccount();"); deleteAccount(); try { IntVector transportVector = ep.transportEnum(); for (int i = 0; i < transportVector.size(); i++) { Log.d(this, "deInitialize transportClose();"); ep.transportClose(i); } } catch (Exception e) { Log.e(this, e); } Log.d(this, "deInitialize sipTpConfig.delete();"); sipTpConfig.delete(); sipTpConfig = null; try { Thread.sleep(3000); Log.d(this, "deInitialize ep.libDestroy();"); ep.libDestroy(); } catch (Exception e) { Log.e(this, e); } Log.d(this, "deInitialize ep.delete();"); ep.delete(); ep = null; sipService.notifyStackState(pjsua_state.PJSUA_STATE_NULL); } void deleteCall(final SipService sipService) { try { ep.hangupAllCalls(); if (mSipAccount != null) { Stream.of(mSipAccount.getCallIDs()).filter(callId -> callId != -1).forEach(callId -> { SipCall call = mSipAccount.getCall(callId); if (call != null) { call.delete(); call = null; } sipService.notifyCallDisconnected(callId); }); } } catch (Exception e) { Log.d(this, "deleteCall", e); } } void deleteAudioMedia() { try { AudioMediaVector audioMediaVector = ep.mediaEnumPorts(); for (int i = 0; i < audioMediaVector.size(); i++) { Log.d(this, "audioMedia deleted"); AudioMedia audioMedia = audioMediaVector.get(i); ep.mediaRemove(audioMedia); audioMedia.delete(); } Log.d(this, "audDevManager deleted"); ep.audDevManager().delete(); } catch (Exception e) { Log.e(this, "deleteAudioMedia", e); } } void deleteAccount() { if (mSipAccount != null) { try { mSipAccount.delete(); } catch (final Exception e) { Log.e(this, e); } } mSipAccount = null; } where ep - Endpoint mSipAccount - public class SipAccount extends Account
F
frogersik
Tue, Feb 7, 2017 11:34 AM

I try with GC and add Thread.Sleep after GC helps :) but I'm not sure
that is good way to fix it. Perhaps there will be some situations where
time in sleep will be to short.

but for now it works

Thanks
Andrzej

W dniu 2017-02-07 o 10:56, Michael Barthold pisze:

// try to force GC to do its job before destroying the library, since it's
// recommended to do that by PJSUA examples
         Runtime.getRuntime().gc();
Thread.sleep(100);

mit freundlichen Grüßen | kind regards

Michael Barthold
Senior Software Architect

-----Ursprüngliche Nachricht-----
Von: pjsip [mailto:pjsip-bounces@lists.pjsip.org] Im Auftrag von frogersik
Gesendet: Dienstag, 7. Februar 2017 10:49
An: pjsip list pjsip@lists.pjsip.org
Betreff: [pjsip] [android] destroy endpoint on call -crash GC

Hi,
Sorry for long post, but it cannot be shorter.
I have huge problem with deinit endpoint during call. I'm using latest version of pjsip (2.6) build stack with ndk 11. When I call
Endpoint.delete() or Endpoint.libDestroy() I get crash from lib.

My problem is connected with gc
(http://www.pjsip.org/docs/book-latest/html/intro_pjsua2.html#problems-with-garbage-collection)\

Do you know what kind of objects I need to delete before I want to deinitialize lib?

I want to do that when I lost connection, when I go out from WiFi or other user interaction with WiFi.

In these case I get two kinds of error:

  1. "conf && port < conf->max_ports" failed (log in attachment) 2. "Calling pjlib from unknown/external thread." (log in attachment)

I also attach full log when I disconnect WiFi during call. As you can see. I try disconnect audio ports but it doesn't help.

BR, Andrzej

Here is my deinit procedure:
void deInitialize(final SipService sipService)
{
Log.d(this, "deInitialize deleteAudioMedia();");
deleteAudioMedia();
Log.d(this, "deInitialize deleteCall();");
deleteCall(sipService);
Log.d(this, "deInitialize deleteAccount();");
deleteAccount();
try
{
IntVector transportVector = ep.transportEnum();
for (int i = 0; i < transportVector.size(); i++)
{
Log.d(this, "deInitialize transportClose();");
ep.transportClose(i);
}
}
catch (Exception e)
{
Log.e(this, e);
}
Log.d(this, "deInitialize sipTpConfig.delete();");
sipTpConfig.delete();
sipTpConfig = null;
try
{
Thread.sleep(3000);
Log.d(this, "deInitialize ep.libDestroy();");
ep.libDestroy();
}
catch (Exception e)
{
Log.e(this, e);
}
Log.d(this, "deInitialize ep.delete();");
ep.delete();
ep = null;
sipService.notifyStackState(pjsua_state.PJSUA_STATE_NULL);
}

void deleteCall(final SipService sipService)
  {
      try
      {
          ep.hangupAllCalls();
          if (mSipAccount != null)
          {
              Stream.of(mSipAccount.getCallIDs()).filter(callId -> callId != -1).forEach(callId -> {
                  SipCall call = mSipAccount.getCall(callId);
                  if (call != null)
                  {
                      call.delete();
                      call = null;
                  }
                  sipService.notifyCallDisconnected(callId);
              });
          }
      }
      catch (Exception e)
      {
          Log.d(this, "deleteCall", e);
      }
  }

  void deleteAudioMedia()
  {
      try
      {
          AudioMediaVector audioMediaVector = ep.mediaEnumPorts();
          for (int i = 0; i < audioMediaVector.size(); i++)
          {
              Log.d(this, "audioMedia deleted");
              AudioMedia audioMedia = audioMediaVector.get(i);
              ep.mediaRemove(audioMedia);
              audioMedia.delete();
          }
          Log.d(this, "audDevManager deleted");
          ep.audDevManager().delete();
      }
      catch (Exception e)
      {
          Log.e(this, "deleteAudioMedia", e);
      }
  }

void deleteAccount()
  {
      if (mSipAccount != null)
      {
          try
          {
              mSipAccount.delete();
          }
          catch (final Exception e)
          {
              Log.e(this, e);
          }
      }
      mSipAccount = null;
  }

where

ep - Endpoint
mSipAccount - public class SipAccount extends Account

Visit our blog: http://blog.pjsip.org

pjsip mailing list
pjsip@lists.pjsip.org
http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org

I try with GC and add Thread.Sleep after GC helps :) but I'm not sure that is good way to fix it. Perhaps there will be some situations where time in sleep will be to short. but for now it works Thanks Andrzej W dniu 2017-02-07 o 10:56, Michael Barthold pisze: > // try to force GC to do its job before destroying the library, since it's > // recommended to do that by PJSUA examples > Runtime.getRuntime().gc(); > Thread.sleep(100); > > mit freundlichen Grüßen | kind regards > > Michael Barthold > Senior Software Architect > > > -----Ursprüngliche Nachricht----- > Von: pjsip [mailto:pjsip-bounces@lists.pjsip.org] Im Auftrag von frogersik > Gesendet: Dienstag, 7. Februar 2017 10:49 > An: pjsip list <pjsip@lists.pjsip.org> > Betreff: [pjsip] [android] destroy endpoint on call -crash GC > > Hi, > Sorry for long post, but it cannot be shorter. > I have huge problem with deinit endpoint during call. I'm using latest version of pjsip (2.6) build stack with ndk 11. When I call > Endpoint.delete() or Endpoint.libDestroy() I get crash from lib. > > My problem is connected with gc > (http://www.pjsip.org/docs/book-latest/html/intro_pjsua2.html#problems-with-garbage-collection)\ > > Do you know what kind of objects I need to delete before I want to deinitialize lib? > > I want to do that when I lost connection, when I go out from WiFi or other user interaction with WiFi. > > In these case I get two kinds of error: > 1. "conf && port < conf->max_ports" failed (log in attachment) 2. "Calling pjlib from unknown/external thread." (log in attachment) > > I also attach full log when I disconnect WiFi during call. As you can see. I try disconnect audio ports but it doesn't help. > > BR, Andrzej > > Here is my deinit procedure: > void deInitialize(final SipService sipService) > { > Log.d(this, "deInitialize deleteAudioMedia();"); > deleteAudioMedia(); > Log.d(this, "deInitialize deleteCall();"); > deleteCall(sipService); > Log.d(this, "deInitialize deleteAccount();"); > deleteAccount(); > try > { > IntVector transportVector = ep.transportEnum(); > for (int i = 0; i < transportVector.size(); i++) > { > Log.d(this, "deInitialize transportClose();"); > ep.transportClose(i); > } > } > catch (Exception e) > { > Log.e(this, e); > } > Log.d(this, "deInitialize sipTpConfig.delete();"); > sipTpConfig.delete(); > sipTpConfig = null; > try > { > Thread.sleep(3000); > Log.d(this, "deInitialize ep.libDestroy();"); > ep.libDestroy(); > } > catch (Exception e) > { > Log.e(this, e); > } > Log.d(this, "deInitialize ep.delete();"); > ep.delete(); > ep = null; > sipService.notifyStackState(pjsua_state.PJSUA_STATE_NULL); > } > > > void deleteCall(final SipService sipService) > { > try > { > ep.hangupAllCalls(); > if (mSipAccount != null) > { > Stream.of(mSipAccount.getCallIDs()).filter(callId -> callId != -1).forEach(callId -> { > SipCall call = mSipAccount.getCall(callId); > if (call != null) > { > call.delete(); > call = null; > } > sipService.notifyCallDisconnected(callId); > }); > } > } > catch (Exception e) > { > Log.d(this, "deleteCall", e); > } > } > > void deleteAudioMedia() > { > try > { > AudioMediaVector audioMediaVector = ep.mediaEnumPorts(); > for (int i = 0; i < audioMediaVector.size(); i++) > { > Log.d(this, "audioMedia deleted"); > AudioMedia audioMedia = audioMediaVector.get(i); > ep.mediaRemove(audioMedia); > audioMedia.delete(); > } > Log.d(this, "audDevManager deleted"); > ep.audDevManager().delete(); > } > catch (Exception e) > { > Log.e(this, "deleteAudioMedia", e); > } > } > > void deleteAccount() > { > if (mSipAccount != null) > { > try > { > mSipAccount.delete(); > } > catch (final Exception e) > { > Log.e(this, e); > } > } > mSipAccount = null; > } > > where > > ep - Endpoint > mSipAccount - public class SipAccount extends Account > > > _______________________________________________ > Visit our blog: http://blog.pjsip.org > > pjsip mailing list > pjsip@lists.pjsip.org > http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org >