[Freeswitch-svn] [commit] r6117 - freeswitch/trunk/src/mod/endpoints/mod_opal

Freeswitch SVN lzwierko at freeswitch.org
Wed Oct 31 19:45:46 EDT 2007


Author: lzwierko
Date: Wed Oct 31 19:45:46 2007
New Revision: 6117

Modified:
   freeswitch/trunk/src/mod/endpoints/mod_opal/mod_opal.cpp
   freeswitch/trunk/src/mod/endpoints/mod_opal/opal_backend.cpp

Log:


Modified: freeswitch/trunk/src/mod/endpoints/mod_opal/mod_opal.cpp
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_opal/mod_opal.cpp	(original)
+++ freeswitch/trunk/src/mod/endpoints/mod_opal/mod_opal.cpp	Wed Oct 31 19:45:46 2007
@@ -63,9 +63,196 @@
 /**
  * Declaration of private variables 
  */
-static FSOpalManager *opal_manager = NULL;
 static switch_memory_pool_t *opal_pool = NULL;
-static switch_endpoint_interface_t *opalh323_endpoint_interface;
+static switch_endpoint_interface_t *opalh323_endpoint_interface = NULL;
+
+/** 
+ * Declaration of PProces ancestor for OpalManager starting 
+ *
+ */
+class OpalStartProcess : public PProcess
+{
+  PCLASSINFO(OpalStartProcess, PProcess)
+
+  public:
+    
+      
+    /** 
+     * This dunction creates new instace of 
+     * OpalStartProcess and starts it's task
+     */
+    static void createInstance(
+            const char* i_moduleName,
+            switch_memory_pool_t *i_memoryPool,
+            switch_endpoint_interface_t *i_endpointInterface)
+    {       
+        assert(!s_startProcess);
+        assert(i_moduleName);
+        assert(i_memoryPool);
+        assert(i_endpointInterface);        
+               
+        PProcess::PreInitialise(0, NULL, NULL);
+        s_startProcess = new OpalStartProcess(i_moduleName,i_memoryPool,i_endpointInterface);
+        assert(s_startProcess);
+        if(!s_startProcess)
+        {
+            return;
+        }
+        s_startProcess->_main(); /* run process */    
+        delete s_startProcess;   /* delete opal manager instance */ 
+        s_startProcess = NULL;   /* clear pointer */
+    }
+    
+    static OpalStartProcess* getInstance()
+    {
+        assert(s_startProcess);
+        return s_startProcess;
+    }
+    
+    OpalStartProcess(
+        const char* i_moduleName,
+        switch_memory_pool_t *i_memoryPool,
+        switch_endpoint_interface_t *i_endpointInterface
+    ):             
+        PProcess("FreeSWITCH", "mod_opal"),
+        m_pStopCondition(NULL),  
+        m_pWaitCondition(NULL),
+        m_pModuleName(i_moduleName),
+        m_pMemoryPool(i_memoryPool),
+        m_pEndpointInterface(i_endpointInterface)
+    {                    
+           
+        
+            switch_status_t status = switch_thread_cond_create(&m_pStopCondition, m_pMemoryPool);
+            assert(status==SWITCH_STATUS_SUCCESS);
+            if(status!=SWITCH_STATUS_SUCCESS) 
+            {
+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Can not init stop condition.");
+                return;
+            }
+            
+            status = switch_thread_cond_create(&m_pWaitCondition, m_pMemoryPool);
+            assert(status==SWITCH_STATUS_SUCCESS);
+            if(status!=SWITCH_STATUS_SUCCESS) 
+            {
+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Can not init wait condition.");
+                return;
+            }
+            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "OpalStartProcess created\n");
+    }
+        
+    ~OpalStartProcess()
+    {
+        switch_thread_cond_destroy(m_pWaitCondition);
+        switch_thread_cond_destroy(m_pStopCondition);
+                
+        m_pModuleName        = NULL;
+        m_pMemoryPool        = NULL;
+        m_pEndpointInterface = NULL; 
+        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "OpalStartProcess deleted\n");
+    }
+    
+    FSOpalManager *getManager()
+    {
+        assert(!m_pFSOpalManager);
+        return m_pFSOpalManager;
+    }
+      
+    /* main task of this PProcess */
+    void Main()
+    {                
+        /* backend initialization */
+        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Begin opal backend init\n");
+        m_pFSOpalManager = new FSOpalManager();
+        assert(m_pFSOpalManager);
+        if(!m_pFSOpalManager) {
+            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Can not create opal manger\n");
+            return;
+        }
+        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Opal manager created\n");
+        
+        if(!m_pFSOpalManager->initialize(m_pModuleName, m_pMemoryPool, m_pEndpointInterface)) 
+        {
+            delete m_pFSOpalManager;
+            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Can not initialize opal manger\n");
+            return; /* if can't initialize return general error */
+        }
+        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Opal manager initilaized and running\n");       
+        WaitUntilStopped();        
+        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "OpalStartProcess received stop signal\n");
+        delete m_pFSOpalManager;
+        m_pFSOpalManager = NULL;        
+        switch_thread_cond_signal(m_pWaitCondition); /* signal task waiting that it's all over ... */        
+    }
+        
+    /** 
+     * Waits until this process is terminated
+     * which means it exits Main() function
+     */
+    void WaitProcess()
+    {
+        switch_mutex_t* mutex = NULL;
+        switch_status_t status = switch_mutex_init(&mutex,SWITCH_MUTEX_NESTED,m_pMemoryPool);
+        if(status!=SWITCH_STATUS_SUCCESS)
+        {
+            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Error acquiring mutex!\n");
+            assert(0);
+            return;
+        }
+        switch_mutex_lock(mutex);
+        switch_thread_cond_wait(m_pWaitCondition,mutex);
+        switch_mutex_unlock(mutex);
+        switch_mutex_destroy(mutex);        
+    }
+    
+    /** 
+     * Waits until this process is terminated
+     * which means it exits Main() function
+     */
+    void StopProcessAndWait()
+    {
+        switch_mutex_lock(m_pStopMutex)
+        switch_thread_cond_signal(m_pStopCondition);
+    }
+    
+  protected:              
+      
+      /*
+       * After entering this functon, process 
+       * locks o condition
+       * and stays there until signalled 
+       */
+      
+      void WaitUntilStopped()
+      {
+          switch_mutex_t* mutex = NULL;
+          switch_status_t status = switch_mutex_init(&mutex, SWITCH_MUTEX_NESTED, m_pMemoryPool);
+          if(status!=SWITCH_STATUS_SUCCESS) 
+          {
+              switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"Error acquiring mutex!\n");
+              assert(0);
+              return;
+          }
+          switch_mutex_lock(mutex);
+          switch_thread_cond_wait(m_pStopCondition, mutex);
+          switch_mutex_unlock(mutex);
+          switch_mutex_destroy(mutex);            
+      }
+      
+      static OpalStartProcess     *s_startProcess;
+      
+      const char                  *m_pModuleName;
+      switch_memory_pool_t        *m_pMemoryPool;
+      switch_endpoint_interface_t *m_pEndpointInterface;              
+      FSOpalManager               *m_pFSOpalManager;
+      switch_thread_cond_t        *m_pStopCondition; /* the main thread waits on this condition until is to be stopped */
+      switch_thread_cond_t        *m_pWaitCondition; /* condition for managing thread to wait on until this process exits */
+      switch_mutex_t              *m_pStopMutex;
+      switch_mutex_t              *m_pWaitMutex;
+      
+        
+};
+OpalStartProcess* OpalStartProcess::s_startProcess = NULL;
 
 /*
  * IO routines handlers set declaration 
@@ -99,19 +286,19 @@
  */
 SWITCH_MODULE_LOAD_FUNCTION(mod_opal_load);
 SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_opal_shutdown);
-SWITCH_MODULE_DEFINITION(mod_opal, mod_opal_load, mod_opal_shutdown, NULL);
+SWITCH_MODULE_RUNTIME_FUNCTION(mod_opal_runtime);
+SWITCH_MODULE_DEFINITION(mod_opal, mod_opal_load, mod_opal_shutdown, mod_opal_runtime);
 
 /*
  * This function is called on module load
- * It sets up: 
- * 1. frontend - interface to FreeSWITCH core
- * 2. backend - inerface to OPAL core
+ * It sets up frontend interface to FS
  *
  */
 SWITCH_MODULE_LOAD_FUNCTION(mod_opal_load)
 {
        
     switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"Starting loading mod_opal\n");
+    opal_pool = pool;
     /* frontend initialization*/
     *module_interface =NULL;
     *module_interface = switch_loadable_module_create_module_interface(pool, modname);
@@ -123,28 +310,22 @@
         return SWITCH_STATUS_MEMERR;
     }
     opalh323_endpoint_interface = (switch_endpoint_interface_t*)switch_loadable_module_create_interface(*module_interface, SWITCH_ENDPOINT_INTERFACE);
-    opalh323_endpoint_interface->interface_name = "OPALH323";
+    opalh323_endpoint_interface->interface_name = "OpalH323";
     opalh323_endpoint_interface->io_routines = &opalh323_io_routines;
     opalh323_endpoint_interface->state_handler = &opalh323_event_handlers;
-   
-    /* backend initialization */
-    opal_manager = new FSOpalManager();
-    assert(opal_manager);
-    if(!opal_manager)
-    {
-        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"Can not create opal manger\n");
-        return SWITCH_STATUS_MEMERR;
-    }
-    
-    if(!opal_manager->initialize(modname,pool,opalh323_endpoint_interface))
-    {
-        delete opal_manager;
-        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"Can not initialize opal manger\n");
-        return SWITCH_STATUS_FALSE; /* if can't initialize return general error */
-    }      
-    
-    /* indicate that the module should continue to be loaded */
-    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE,"mod_opal loaded ok!\n");
+       
+    return SWITCH_STATUS_SUCCESS;
+}
+
+/*
+ * This function is called after module initilization
+ * It sets up and run backend interface to opal
+ *
+ */
+
+SWITCH_MODULE_RUNTIME_FUNCTION(mod_opal_runtime)
+{
+    OpalStartProcess::createInstance(modname,opal_pool,opalh323_endpoint_interface);
     return SWITCH_STATUS_SUCCESS;
 }
 
@@ -157,7 +338,9 @@
 SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_opal_shutdown)
 {
     /* deallocate OPAL manager */
-    delete opal_manager;    
+    
+    OpalStartProcess::getInstance()->StopProcess(); /* terminate process */
+    OpalStartProcess::getInstance()->WaitProcess(); /* wait here until stopped */
     return SWITCH_STATUS_SUCCESS;
 }
 
@@ -170,62 +353,62 @@
         switch_core_session_t **new_session, 
         switch_memory_pool_t **pool)
 {
-     return opal_manager->io_outgoing_channel(session,outbound_profile,new_session,pool);
+     return  OpalStartProcess::getInstance()->getManager()->io_outgoing_channel(session,outbound_profile,new_session,pool);
 }
 
 static switch_status_t opalh323_read_frame(switch_core_session_t *session, switch_frame_t **frame, int timeout, switch_io_flag_t flags, int stream_id)
 {
-    return opal_manager->io_read_frame(session,frame,timeout,flags,stream_id);
+    return OpalStartProcess::getInstance()->getManager()->io_read_frame(session,frame,timeout,flags,stream_id);
 }
 
 static switch_status_t opalh323_write_frame(switch_core_session_t *session, switch_frame_t *frame, int timeout, switch_io_flag_t flags, int stream_id)
 {
-    return opal_manager->io_write_frame(session,frame,timeout,flags,stream_id);
+    return OpalStartProcess::getInstance()->getManager()->io_write_frame(session,frame,timeout,flags,stream_id);
 }
 
 static switch_status_t opalh323_kill_channel(switch_core_session_t *session, int sig)
 {
-    return opal_manager->io_kill_channel(session,sig);
+    return OpalStartProcess::getInstance()->getManager()->io_kill_channel(session,sig);
 }
 
 static switch_status_t opalh323_waitfor_read(switch_core_session_t *session, int ms, int stream_id)
 {
-    return opal_manager->io_waitfor_read(session,ms,stream_id);
+    return OpalStartProcess::getInstance()->getManager()->io_waitfor_read(session,ms,stream_id);
 }
 
 static switch_status_t opalh323_waitfor_write(switch_core_session_t *session, int ms, int stream_id)
 {
-    return opal_manager->io_waitfor_write(session,ms,stream_id);
+    return OpalStartProcess::getInstance()->getManager()->io_waitfor_write(session,ms,stream_id);
 }
 
 static switch_status_t opalh323_send_dtmf(switch_core_session_t *session, char *dtmf)
 {
-    return opal_manager->io_send_dtmf(session,dtmf);
+    return OpalStartProcess::getInstance()->getManager()->io_send_dtmf(session,dtmf);
 }
 
 static switch_status_t opalh323_receive_message(switch_core_session_t *session, switch_core_session_message_t *msg)
 {
-    return opal_manager->io_receive_message(session,msg);
+    return OpalStartProcess::getInstance()->getManager()->io_receive_message(session,msg);
 }
 
 static switch_status_t opalh323_receive_event(switch_core_session_t *session, switch_event_t *event)
 {
-    return opal_manager->io_receive_event(session,event);
+    return OpalStartProcess::getInstance()->getManager()->io_receive_event(session,event);
 }
 
 static switch_status_t opalh323_state_change(switch_core_session_t *session)
 {
-    return opal_manager->io_state_change(session);
+    return OpalStartProcess::getInstance()->getManager()->io_state_change(session);
 }
 
 static switch_status_t opalh323_read_video_frame(switch_core_session_t *session, switch_frame_t **frame, int timeout, switch_io_flag_t flag, int stream_id)
 {
-    return opal_manager->io_read_video_frame(session,frame,timeout,flag,stream_id);
+    return OpalStartProcess::getInstance()->getManager()->io_read_video_frame(session,frame,timeout,flag,stream_id);
 }
 
 static switch_status_t opalh323_write_video_frame(switch_core_session_t *session, switch_frame_t *frame, int timeout, switch_io_flag_t flag, int stream_id)
 {
-    return opal_manager->io_write_video_frame(session,frame,timeout,flag,stream_id);
+    return OpalStartProcess::getInstance()->getManager()->io_write_video_frame(session,frame,timeout,flag,stream_id);
 }
 
 /*
@@ -234,30 +417,30 @@
 
 static switch_status_t opalh323_on_init(switch_core_session_t *session)
 {
-    return opal_manager->callback_on_init(session);
+    return OpalStartProcess::getInstance()->getManager()->callback_on_init(session);
 }
 
 static switch_status_t opalh323_on_ring(switch_core_session_t *session)
 {
-    return opal_manager->callback_on_ring(session);
+    return OpalStartProcess::getInstance()->getManager()->callback_on_ring(session);
 }
 
 static switch_status_t opalh323_on_execute(switch_core_session_t *session)
 {
-    return opal_manager->callback_on_execute(session);
+    return OpalStartProcess::getInstance()->getManager()->callback_on_execute(session);
 }
 
 static switch_status_t opalh323_on_hangup(switch_core_session_t *session)
 {
-    return opal_manager->callback_on_hangup(session);
+    return OpalStartProcess::getInstance()->getManager()->callback_on_hangup(session);
 }
 
 static switch_status_t opalh323_on_loopback(switch_core_session_t *session)
 {
-    return opal_manager->callback_on_loopback(session);
+    return OpalStartProcess::getInstance()->getManager()->callback_on_loopback(session);
 }
 
 static switch_status_t opalh323_on_transmit(switch_core_session_t *session)
 {
-    return opal_manager->callback_on_transmit(session);
+    return OpalStartProcess::getInstance()->getManager()->callback_on_transmit(session);
 }

Modified: freeswitch/trunk/src/mod/endpoints/mod_opal/opal_backend.cpp
==============================================================================
--- freeswitch/trunk/src/mod/endpoints/mod_opal/opal_backend.cpp	(original)
+++ freeswitch/trunk/src/mod/endpoints/mod_opal/opal_backend.cpp	Wed Oct 31 19:45:46 2007
@@ -105,16 +105,14 @@
             switch_memory_pool_t* i_memoryPool,
             switch_endpoint_interface_t *i_endpointInterface
             )                
-{       
+{                       
     /* check if not initialized */
-    assert(m_isInitialized);
-    
+    assert(!m_isInitialized);    
     /* check input parameters */
     assert(i_modName);
     assert(i_memoryPool);
     assert(i_endpointInterface);
     
-    
     m_pModuleName = i_modName;
     m_pMemoryPool = i_memoryPool;
     m_pH323EndpointInterface = i_endpointInterface;
@@ -126,7 +124,7 @@
      */
     
     if(switch_core_hash_init(&m_pSessionsHashTable,m_pMemoryPool)!=SWITCH_STATUS_SUCCESS)
-    {
+    {        
         assert(0);
         return false;
     }



More information about the Freeswitch-svn mailing list