]> sjero.net Git - linphone/commitdiff
maximum time spent in linphone_core_refresh_registers for iOS.
authorSimon Morlat <simon.morlat@linphone.org>
Thu, 13 Sep 2012 12:54:38 +0000 (14:54 +0200)
committerSimon Morlat <simon.morlat@linphone.org>
Thu, 13 Sep 2012 12:54:38 +0000 (14:54 +0200)
coreapi/sal_eXosip2.c

index d3ce16929b274522ebb95a1b89a6a98510a5f187..695d8568d4bddef4203fcb83e680bb5c313fc2ae 100644 (file)
@@ -2222,12 +2222,26 @@ int sal_register(SalOp *h, const char *proxy, const char *from, int expires){
 int sal_register_refresh(SalOp *op, int expires){
        osip_message_t *msg=NULL;
        const char *contact=sal_op_get_contact(op);
-
+       int tries=0;
+       
        if (op->rid==-1){
                ms_error("Unexistant registration context, not possible to refresh.");
                return -1;
        }
+#ifdef HAVE_EXOSIP_TRYLOCK
+       /*iOS hack: in the keep alive handler, we have no more than 10 seconds to refresh registers, otherwise the application is suspended forever.
+        * In order to prevent this case that can occur when the exosip thread is busy with DNS while network isn't in a good shape, we try to take
+        * the exosip lock in a non blocking way, and give up if it takes too long*/
+       while (eXosip_trylock()!=0){
+               ms_usleep(100000);
+               if (tries>30) {/*after 3 seconds, give up*/
+                       ms_warning("Could not obtain exosip lock in a reasonable time, giving up.");
+                       return -1;
+               }
+       }
+#else
        eXosip_lock();
+#endif
        eXosip_register_build_register(op->rid,expires,&msg);
        if (msg!=NULL){
                if (contact) register_set_contact(msg,contact);