Revision
14633
Author
gmaruzz
Date
2009-08-25 06:51:55 -0500 (Tue, 25 Aug 2009)

Log Message

celliax: hupall works, hangup works, locking seems to works. There will be a way to push/pop a function that will be called on thread eit (die) to remove dangling locks? Maybe not needed, we don't kill threads. Heh. :-) 

Modified Paths

Diff

Modified: freeswitch/branches/gmaruzz/mod_celliax/celliax.h (14632 => 14633)


--- freeswitch/branches/gmaruzz/mod_celliax/celliax.h	2009-08-25 10:07:07 UTC (rev 14632)
+++ freeswitch/branches/gmaruzz/mod_celliax/celliax.h	2009-08-25 11:51:55 UTC (rev 14633)
@@ -483,8 +483,10 @@
 
 #define PUSHA_UNLOCKA(x)    if(option_debug > 100) ERRORA("PUSHA_UNLOCKA: %p\n", SKYPIAX_P_LOG, (void *)x);
 #define POPPA_UNLOCKA(x)    if(option_debug > 100) ERRORA("POPPA_UNLOCKA: %p\n", SKYPIAX_P_LOG, (void *)x);
-#define LOKKA(x)    if(option_debug > 100) ERRORA("LOKKA: %p\n", SKYPIAX_P_LOG, (void *)x);
-#define UNLOCKA(x)    if(option_debug > 100) ERRORA("UNLOCKA: %p\n", SKYPIAX_P_LOG, (void *)x);
+//#define LOKKA(x)    if(option_debug > 100) ERRORA("LOKKA: %p\n", SKYPIAX_P_LOG, (void *)x);
+#define LOKKA(x)    switch_mutex_lock(x);
+#define UNLOCKA(x)  switch_mutex_unlock(x);  
+//#define UNLOCKA(x)    if(option_debug > 100) ERRORA("UNLOCKA: %p\n", SKYPIAX_P_LOG, (void *)x);
 
 #define celliax_queue_control(x, y) ERRORA("celliax_queue_control: %p, %d\n", SKYPIAX_P_LOG, (void *)x, y);
 

Modified: freeswitch/branches/gmaruzz/mod_celliax/celliax_protocol.c (14632 => 14633)


--- freeswitch/branches/gmaruzz/mod_celliax/celliax_protocol.c	2009-08-25 10:07:07 UTC (rev 14632)
+++ freeswitch/branches/gmaruzz/mod_celliax/celliax_protocol.c	2009-08-25 11:51:55 UTC (rev 14633)
@@ -1869,8 +1869,8 @@
 
   timeout.tv_sec = timeout_sec;
   timeout.tv_usec = timeout_usec;
-  PUSHA_UNLOCKA(&tech_pvt->controldev_lock);
-  LOKKA(&tech_pvt->controldev_lock);
+  PUSHA_UNLOCKA(tech_pvt->controldev_lock);
+  LOKKA(tech_pvt->controldev_lock);
 
   while ((select_err = select(tech_pvt->controldevfd + 1, &read_fds, NULL, NULL, &timeout)) > 0) {
     timeout.tv_sec = timeout_sec;   //reset the timeout, linux modify it
@@ -1884,7 +1884,7 @@
          SKYPIAX_P_LOG, tech_pvt->controldevice_name);
       tech_pvt->controldev_dead = 1;
       close(tech_pvt->controldevfd);
-      UNLOCKA(&tech_pvt->controldev_lock);
+      UNLOCKA(tech_pvt->controldev_lock);
       if (tech_pvt->owner) {
         tech_pvt->owner->hangupcause = SKYPIAX_CAUSE_FAILURE;
         celliax_queue_control(tech_pvt->owner, SKYPIAX_CONTROL_HANGUP);
@@ -2889,8 +2889,8 @@
     }
   }
 
-  UNLOCKA(&tech_pvt->controldev_lock);
-  POPPA_UNLOCKA(&tech_pvt->controldev_lock);
+  UNLOCKA(tech_pvt->controldev_lock);
+  POPPA_UNLOCKA(tech_pvt->controldev_lock);
   if (select_err == -1) {
     ERRORA("select returned -1 on %s, setting controldev_dead, error was: %s\n",
            SKYPIAX_P_LOG, tech_pvt->controldevice_name, strerror(errno));
@@ -3087,16 +3087,16 @@
   if (option_debug > 1)
     DEBUGA_SKYPE("celliax_serial_write_AT_noack: %s\n", SKYPIAX_P_LOG, data);
 
-  PUSHA_UNLOCKA(&tech_pvt->controldev_lock);
-  LOKKA(&tech_pvt->controldev_lock);
+  PUSHA_UNLOCKA(tech_pvt->controldev_lock);
+  LOKKA(tech_pvt->controldev_lock);
   if (celliax_serial_write_AT(tech_pvt, data) != strlen(data)) {
 
     ERRORA("Error sending data... (%s)\n", SKYPIAX_P_LOG, strerror(errno));
-    UNLOCKA(&tech_pvt->controldev_lock);
+    UNLOCKA(tech_pvt->controldev_lock);
     return -1;
   }
-  UNLOCKA(&tech_pvt->controldev_lock);
-  POPPA_UNLOCKA(&tech_pvt->controldev_lock);
+  UNLOCKA(tech_pvt->controldev_lock);
+  POPPA_UNLOCKA(tech_pvt->controldev_lock);
 
   return 0;
 }
@@ -3105,19 +3105,19 @@
 {
   int at_result = AT_ERROR;
 
-  PUSHA_UNLOCKA(&tech_pvt->controldev_lock);
-  LOKKA(&tech_pvt->controldev_lock);
+  PUSHA_UNLOCKA(tech_pvt->controldev_lock);
+  LOKKA(tech_pvt->controldev_lock);
   if (option_debug > 1)
     DEBUGA_SKYPE("sending: %s\n", SKYPIAX_P_LOG, data);
   if (celliax_serial_write_AT(tech_pvt, data) != strlen(data)) {
     ERRORA("Error sending data... (%s) \n", SKYPIAX_P_LOG, strerror(errno));
-    UNLOCKA(&tech_pvt->controldev_lock);
+    UNLOCKA(tech_pvt->controldev_lock);
     return -1;
   }
 
   at_result = celliax_serial_read_AT(tech_pvt, 1, 500000, 2, NULL, 1); // 2.5 sec timeout
-  UNLOCKA(&tech_pvt->controldev_lock);
-  POPPA_UNLOCKA(&tech_pvt->controldev_lock);
+  UNLOCKA(tech_pvt->controldev_lock);
+  POPPA_UNLOCKA(tech_pvt->controldev_lock);
 
   return at_result;
 
@@ -3127,19 +3127,19 @@
 {
   int at_result = AT_ERROR;
 
-  PUSHA_UNLOCKA(&tech_pvt->controldev_lock);
-  LOKKA(&tech_pvt->controldev_lock);
+  PUSHA_UNLOCKA(tech_pvt->controldev_lock);
+  LOKKA(tech_pvt->controldev_lock);
   if (option_debug > 1)
     DEBUGA_SKYPE("sending: %s\n", SKYPIAX_P_LOG, data);
   if (celliax_serial_write_AT_nocr(tech_pvt, data) != strlen(data)) {
     ERRORA("Error sending data... (%s) \n", SKYPIAX_P_LOG, strerror(errno));
-    UNLOCKA(&tech_pvt->controldev_lock);
+    UNLOCKA(tech_pvt->controldev_lock);
     return -1;
   }
 
   at_result = celliax_serial_read_AT(tech_pvt, 1, 500000, 20, NULL, 1);    // 20.5 sec timeout
-  UNLOCKA(&tech_pvt->controldev_lock);
-  POPPA_UNLOCKA(&tech_pvt->controldev_lock);
+  UNLOCKA(tech_pvt->controldev_lock);
+  POPPA_UNLOCKA(tech_pvt->controldev_lock);
 
   return at_result;
 
@@ -3151,19 +3151,19 @@
 {
   int at_result = AT_ERROR;
 
-  PUSHA_UNLOCKA(&tech_pvt->controldev_lock);
-  LOKKA(&tech_pvt->controldev_lock);
+  PUSHA_UNLOCKA(tech_pvt->controldev_lock);
+  LOKKA(tech_pvt->controldev_lock);
   if (option_debug > 1)
     DEBUGA_SKYPE("sending: %s, expecting: %s\n", SKYPIAX_P_LOG, data, expected_string);
   if (celliax_serial_write_AT(tech_pvt, data) != strlen(data)) {
     ERRORA("Error sending data... (%s) \n", SKYPIAX_P_LOG, strerror(errno));
-    UNLOCKA(&tech_pvt->controldev_lock);
+    UNLOCKA(tech_pvt->controldev_lock);
     return -1;
   }
 
   at_result = celliax_serial_read_AT(tech_pvt, 1, 500000, seconds, expected_string, expect_crlf);  // 20.5 sec timeout, used for querying the SIM and sending SMSs
-  UNLOCKA(&tech_pvt->controldev_lock);
-  POPPA_UNLOCKA(&tech_pvt->controldev_lock);
+  UNLOCKA(tech_pvt->controldev_lock);
+  POPPA_UNLOCKA(tech_pvt->controldev_lock);
 
   return at_result;
 
@@ -3174,14 +3174,14 @@
 {
   int at_result = AT_ERROR;
 
-  PUSHA_UNLOCKA(&tech_pvt->controldev_lock);
-  LOKKA(&tech_pvt->controldev_lock);
+  PUSHA_UNLOCKA(tech_pvt->controldev_lock);
+  LOKKA(tech_pvt->controldev_lock);
   if (option_debug > 1)
     DEBUGA_SKYPE("expecting: %s\n", SKYPIAX_P_LOG, expected_string);
 
   at_result = celliax_serial_read_AT(tech_pvt, 1, 500000, seconds, expected_string, expect_crlf);  // 20.5 sec timeout, used for querying the SIM and sending SMSs
-  UNLOCKA(&tech_pvt->controldev_lock);
-  POPPA_UNLOCKA(&tech_pvt->controldev_lock);
+  UNLOCKA(tech_pvt->controldev_lock);
+  POPPA_UNLOCKA(tech_pvt->controldev_lock);
 
   return at_result;
 
@@ -3529,11 +3529,11 @@
   }
 #ifndef ASTERISK_VERSION_1_4
   /* subtract one to the usage count of Celliax-type channels */
-  LOKKA(&celliax_usecnt_lock);
+  LOKKA(celliax_usecnt_lock);
   celliax_usecnt--;
   if (celliax_usecnt < 0)
     ERRORA("Usecnt < 0???\n", SKYPIAX_P_LOG);
-  UNLOCKA(&celliax_usecnt_lock);
+  UNLOCKA(celliax_usecnt_lock);
   ast_update_use_count();
 #else /* ASTERISK_VERSION_1_4 */
 	ast_module_unref(ast_module_info->self);
@@ -3654,8 +3654,8 @@
     }
   }
 
-  PUSHA_UNLOCKA(&tech_pvt->controldev_lock);
-  LOKKA(&tech_pvt->controldev_lock);
+  PUSHA_UNLOCKA(tech_pvt->controldev_lock);
+  LOKKA(tech_pvt->controldev_lock);
   res = celliax_serial_write_AT_ack(tech_pvt, "AT");
   if (res) {
     ERRORA("AT was not acknowledged, continuing but maybe there is a problem\n",
@@ -3791,8 +3791,8 @@
     }
   }
 
-  UNLOCKA(&tech_pvt->controldev_lock);
-  POPPA_UNLOCKA(&tech_pvt->controldev_lock);
+  UNLOCKA(tech_pvt->controldev_lock);
+  POPPA_UNLOCKA(tech_pvt->controldev_lock);
   return 0;
 }
 

Modified: freeswitch/branches/gmaruzz/mod_celliax/mod_celliax.c (14632 => 14633)


--- freeswitch/branches/gmaruzz/mod_celliax/mod_celliax.c	2009-08-25 10:07:07 UTC (rev 14632)
+++ freeswitch/branches/gmaruzz/mod_celliax/mod_celliax.c	2009-08-25 11:51:55 UTC (rev 14633)
@@ -1252,6 +1252,9 @@
 				switch_set_string(globals.SKYPIAX_INTERFACES[interface_id].controldevice_name, controldevice_name);
 				globals.SKYPIAX_INTERFACES[interface_id].controldevice_speed = controldevice_speed;
 				globals.SKYPIAX_INTERFACES[interface_id].controldevprotocol = controldevprotocol;
+
+
+	switch_mutex_init(&globals.SKYPIAX_INTERFACES[interface_id].controldev_lock, SWITCH_MUTEX_NESTED, celliax_module_pool);
 /*********************/
 #ifdef NOTDEF
   .interface_state = SKYPIAX_STATE_DOWN;