]> pilppa.org Git - libplpbus.git/blobdiff - src/plpbus/OrbServerImpl.cc
small cleanups for error handling and memory leaks
[libplpbus.git] / src / plpbus / OrbServerImpl.cc
index 4317ff110e61fea7c073371dd734ccff2d149177..9a48aba32fd12eba13b916924b871c9bcec902c4 100644 (file)
@@ -36,13 +36,14 @@ OrbServerImpl::~OrbServerImpl()
 void OrbServerImpl::send_message_and_request_response(OrbClient_ptr response_listener_param,
                                                const char* msg_req)
 {
-       char    *msg_rsp;
+       const char *msg_rsp;
 
        msg_rsp = NULL;
        if (CORBA::is_nil(response_listener_param) == false) {
                if (_listener != NULL) {
                        log_debug("send_message_and_request_response(): %s, server callback != NULL\n", msg_req);
                        _listener->request_received(msg_req, &msg_rsp);
+                       log_debug("send_message_and_request_response(), request_received\n");
                        response_listener_param->receive_response_message(msg_rsp);
                }
                else {
@@ -55,28 +56,31 @@ void OrbServerImpl::send_message_and_request_response(OrbClient_ptr response_lis
 }
 
 char *OrbServerImpl::send_message_and_wait_response(const char* msg_req_param, ::CORBA::Long& err_flg) {
-       char    *msg_rsp;
-       char    *ret_val;
+       const char      *msg_rsp;
+       char            *ret_val;
 
        err_flg = 0;
        msg_rsp = NULL;
        if (_listener != NULL) {
                log_debug("send_message_and_wait_response(): %s, server_callback != NULL\n", msg_req_param);
                _listener->request_received(msg_req_param, &msg_rsp);
+               //ret_val       = CORBA::string_dup(msg_rsp);
+               ret_val = CORBA::string_dup(msg_rsp);
        }
        else {
                log_error("send_message_and_wait_response() error, server callback == NULL\n");
-               msg_rsp = strdup(msg_req_param);
+               ret_val = CORBA::string_dup(msg_req_param);
                err_flg = -1;
        }
-       ret_val = CORBA::string_dup(msg_rsp);
        return ret_val;
 }
 
 void OrbServerImpl::send_dataitem_message_and_request_response(OrbClient_ptr response_listener_param,
                                                        const ::DataItemSequence& msg_req_param) {
-       BusMessage      *msg_req;
-       BusMessage      *msg_rsp;
+       BusMessage              *msg_req;
+       BusMessage              *msg_rsp;
+       DataItemSequence        *seq;
+       int                     err_flg;
 
        if (CORBA::is_nil(response_listener_param) == false) {
                if (_listener != NULL) {
@@ -85,10 +89,15 @@ void OrbServerImpl::send_dataitem_message_and_request_response(OrbClient_ptr res
                        log_debug("msg_req:\n");
                        msg_req->printout();
                        msg_rsp = NULL;
-                       _listener->request_received(msg_req, &msg_rsp);
-                       log_debug("msg_rsp length: %ld\n", msg_rsp->_dataItemSeq.length());
+                       err_flg = 0;
+                       msg_rsp = new BusMessage(msg_req->get_type(&err_flg));
+                       _listener->request_received(msg_req, msg_rsp);
+                       seq     = (DataItemSequence *)msg_rsp->_dataItemSeq;
+                       log_debug("msg_rsp length: %ld\n", seq->length());
                        msg_rsp->printout();
-                       response_listener_param->receive_response_dataitem_sequence(msg_rsp->_dataItemSeq);
+                       response_listener_param->receive_response_dataitem_sequence(*seq);
+                       delete(msg_req);
+                       delete(msg_rsp);
                }
                else {
                        log_error("send_dataitem_message_and_request_response() error, server_callback == NULL\n");
@@ -97,15 +106,24 @@ void OrbServerImpl::send_dataitem_message_and_request_response(OrbClient_ptr res
 }
 
 CORBA::Long OrbServerImpl::send_dataitem_message_and_wait_response(const DataItemSequence& req_seq_param,
-               DataItemSequence_out rsp_seq_param) {
-       BusMessage      *msg_req;
-       BusMessage      *msg_rsp;
+                                                               DataItemSequence_out rsp_seq_param) {
+       BusMessage              *msg_req;
+       BusMessage              *msg_rsp;
+       DataItemSequence        *seq;
+       int                     err_flg;
 
-       msg_req = new BusMessageInternal(req_seq_param);
+       seq     = NULL;
        msg_rsp = NULL;
-       _listener->request_received(msg_req, &msg_rsp);
-       //rsp_seq_param = new DataItemSequence_out(msg_rsp._dataItemSeq);
-       rsp_seq_param._data     = &(msg_rsp->_dataItemSeq);
+       msg_req = new BusMessageInternal(req_seq_param);
+       msg_rsp = new BusMessage(msg_req->get_type(&err_flg));
+       _listener->request_received(msg_req, msg_rsp);
+       if (msg_rsp != NULL) {
+               seq     = (DataItemSequence *)msg_rsp->_dataItemSeq;
+       }
+       else {
+               seq     = new DataItemSequence();
+       }
+       rsp_seq_param._data     = seq;
 
        return 0;
 }
@@ -125,7 +143,7 @@ void OrbServerImpl::add_event_listener(OrbClient_ptr client_param,
                srvr_thread->start();
        }
        else {
-               cerr << "Failed to add event listener, listener NULL.\n";
+               log_error("Failed to add event listener, listener NULL.\n");
        }
 }
 
@@ -133,15 +151,18 @@ void OrbServerImpl::shutdown()
 {
        omni_mutex_lock sync(server_thread_mutex);
        if (is_shutdown_pending() == 0) {
-               cout << "shutdown request received!" << endl;
+               log_debug("shutdown request received!\n");
                // Tell the servers to exit, and wait for them to do so.
                _shutdown_pending       = 1;
                while(_server_thread_count > 0) {
-                       server_thread_shutdown_signal.wait();
+                       server_thread_shutdown_signal.timedwait(5, 0);
+                       log_debug("signal received\n");
                }
                // Shutdown the ORB (but do not wait for completion).  This also
                // causes the main thread to unblock from CORBA::ORB::run().
+               log_debug("calling orb shutdown\n");
                _orb->shutdown(0);
+               log_debug("orb shutdown called\n");
        }
 }
 
@@ -159,7 +180,7 @@ int OrbServerImpl::init() {
                retVal  = 0;
        }
        else {
-               cout << "init() failed"  << endl;
+               log_error("init() failed\n");
        }
        return retVal;
 }
@@ -179,14 +200,17 @@ int OrbServerImpl::launch(const char *server_name)
        //this->_remove_ref();
        naming_context  = get_service_naming_context(CONST_CONTEXT_NAME__PLPBUS, CONST_CONTEXT_KIND__PLPBUS);
        if (naming_context != NULL) {
-               ok_flg  = bind_naming_context_and_service(naming_context, server_ref, server_name, CONST_CONTEXT_KIND__PLPBUS);
+               ok_flg  = bind_naming_context_and_service(naming_context,
+                                                       server_ref,
+                                                       server_name,
+                                                       CONST_CONTEXT_KIND__PLPBUS);
                if (ok_flg == true) {
-                       cout << "Registered to naming service: " << server_name << endl;
+                       log_debug("Registered to naming service: %s\n", server_name);
                        _orb->run();
                        ret_val = 0;
                }
                else {
-                       cout << "Failed to register to naming service: " << server_name << endl;
+                       log_error("Failed to register to naming service: %s\n", server_name);
                }
        }
        return ret_val;
@@ -219,7 +243,7 @@ PortableServer::POA_var OrbServerImpl::create_poa(CORBA::ORB_var orb) {
                }
        }
        else {
-               cerr << "Failed to create RootPOA." << endl;
+               log_error("Failed to create RootPOA.\n");
        }
        return ret_val;
 }
@@ -265,9 +289,7 @@ CosNaming::NamingContext_var OrbServerImpl::get_service_naming_context(const cha
                                        }
                                }
                                else {
-                                       log_debug("get_service_naming_context() 8\n");
                                        ret_val = CosNaming::NamingContext::_narrow(service_obj);
-                                       log_debug("get_service_naming_context() 9\n");
                                        if (CORBA::is_nil(ret_val) ) {
                                                log_error("Failed to get existing context from name service for %s, narrowing failed.\n", service_name_param);
                                        }
@@ -321,23 +343,23 @@ bool OrbServerImpl::bind_naming_context_and_service(CosNaming::NamingContext_var
                         * service existed already for the naming context with similar description.
                         * Replace the existing one with a new one.
                         */
-                       cout << "service " << service_name_param << " existed, replacing it." << endl;
+                       log_warning("service %s exist, replacing it\n", service_name_param);
                        service_context_param->rebind(context_data, service_ref_param);
                        retVal  = true;
                }
        }
        catch (CosNaming::NamingContext::InvalidName&) {
-               cerr << "Could not register service to name server, invalid service name." << endl;
+               log_error("Could not register service to name server, invalid service name.\n");
        }
        catch (CosNaming::NamingContext::NotFound&) {
-               cerr << "Could not register service to name server, service object reference is invalid." << endl;
+               log_error("Could not register service to name server, service object reference is invalid.\n");
        }
        catch (CosNaming::NamingContext::CannotProceed&) {
                // This should not happen!
-               cerr << "Could not register service to name server, unknown error." << endl;
+               log_error("Could not register service to name server, unknown error.\n");
        }
        catch(CORBA::SystemException& ex) {
-               cerr << "Could not register service to name server, unknown error." << endl;
+               log_error("Could not register service to name server, unknown error.\n");
        }
        return retVal;
 }
@@ -347,9 +369,8 @@ int OrbServerImpl::add_server_listener(IServerListener *listener_param)
        int     retVal;
 
        retVal          = 0;
-       cout << "register_request_received_callback() started"  << endl;
+       log_debug("register_request_received_callback() started\n");
        _listener       = listener_param;
-       cout << "register_callback() done"  << endl;
        return retVal;
 }
 
@@ -358,15 +379,20 @@ int OrbServerImpl::is_shutdown_pending() {
 }
 
 void OrbServerImpl::server_thread_closed() {
-       bool send_signal = false;
+       bool    send_signal;
 
+       log_debug("server_thread_closed() started\n");
+       send_signal = false;
        server_thread_mutex.lock();
+       log_debug("server_thread_closed(), server_thread_count: %d\n", _server_thread_count);
        _server_thread_count--;
        if (_server_thread_count == 0) {
                send_signal     = true;
        }
        server_thread_mutex.unlock();
        if (send_signal == true) {
+               log_debug("server_thread_closed(), sending signal\n");
                server_thread_shutdown_signal.signal();
+               log_debug("server_thread_closed(), signal send\n");
        }
 }