Main Page   Class Hierarchy   Alphabetical List   Data Structures   File List   Data Fields   Globals  

nml_srv.cc

Go to the documentation of this file.
00001 /*************************************************************************
00002 * File:nml_srv.cc                                                        *
00003 * Authors: Fred Proctor, Will Shackleford                                *
00004 * Purpose: C++  file for RPC server that reads and writes                *
00005 *          to a local NML buffer for remote processes.                   *
00006 * Includes:                                                              *
00007 *          1. class NML_SERVER member functions.                         *
00008 *************************************************************************/
00009 
00010 #include "rcs_defs.hh"          /* EXTERN_C_STD_HEADERS  */
00011 
00012 #ifdef EXTERN_C_STD_HEADERS
00013 extern "C"
00014 {
00015 #endif
00016 
00017 #include <string.h>             /* memcpy() */
00018 
00019 #if defined(WIN32) && !defined(gnuwin32)
00020 #if defined(WIN32) && !defined(USE_OLD_WINSOCK)
00021 // Lame problem if windows.h is included before winsock2.h many redefined
00022 // compiler errors result.
00023 #include <winsock2.h>
00024 #endif
00025 
00026 #include <windows.h>            /* GetCurrentProcessId(), GetCurrentThreadID() */
00027 #else
00028 #include <signal.h>             /* kill() */
00029 #include <sys/types.h>
00030 #include <unistd.h>             /* getpid() */
00031 #include <sys/wait.h>           /* waitpid() */
00032 #include <stdlib.h>             /* atexit() */
00033 #ifdef VXWORKS
00034 #include <taskLib.h>            /* taskIdSelf() */
00035 #endif
00036 #endif
00037 
00038 #ifdef EXTERN_C_STD_HEADERS
00039 }
00040 #endif
00041 
00042 #include "nml.hh"
00043 #include "nmlmsg.hh"
00044 #include "cms.hh"
00045 #include "nml_srv.hh"
00046 #include "rem_msg.hh"           /* struct REMOTE_READ_REQUEST, */
00047                                 /* struct REMOTE_WRITE_REQUEST, */
00048                                 /* struct REMOTE_READ_REPLY, */
00049                                 /* struct REMOTE_WRITE_REPLY, */
00050 #include "rcs_prnt.hh"          /* rcs_print_error() */
00051 #include "timer.hh"             // esleep()
00052 #include "rcs_exit.hh"          // rcs_exit
00053 #include "dbg_mem.h"            // DEBUG_MALLOC, DEBUG_FREE
00054 #include "cmsdiag.hh"
00055 
00056 #ifdef sunos5
00057 #include <thread.h>             // thr_exit
00058 #endif
00059 
00060 
00061 NML_SERVER::NML_SERVER (NML * _nml, int _set_to_master):
00062 CMS_SERVER ()
00063 {
00064   NML_SERVER_LOCAL_PORT *new_local_port = NULL;
00065   being_deleted = 0;
00066   if (NULL != _nml)
00067     {
00068       if (NULL != _nml->cms)
00069         {
00070           if (CMS_REMOTE_TYPE != _nml->cms->ProcessType)
00071             {
00072               NML *new_nml;
00073               if (_nml->cms->isserver &&
00074                   (0 == _set_to_master ||
00075                    (_nml->cms->is_local_master == 1 && _set_to_master == 1) ||
00076                    (_nml->cms->is_local_master == 0 && _set_to_master == -1)))
00077                 {
00078                   new_nml = _nml;
00079                   if (NULL != new_nml)
00080                     {
00081                       new_local_port = new NML_SERVER_LOCAL_PORT (new_nml);
00082                       add_local_port (new_local_port);
00083                     }
00084                   new_local_port->local_channel_reused = 1;
00085                 }
00086               else
00087                 {
00088                   new_nml = new NML (_nml, 1, -1);
00089                   if (NULL != new_nml)
00090                     {
00091                       new_local_port = new NML_SERVER_LOCAL_PORT (new_nml);
00092                       add_local_port (new_local_port);
00093                     }
00094                   new_local_port->local_channel_reused = 0;
00095                 }
00096             }
00097           else
00098             {
00099               rcs_print_error
00100                 ("NML_SERVER:(ERROR) ProcessType was REMOTE.\n");
00101               _nml = (NML *) NULL;
00102             }
00103         }
00104       else
00105         {
00106           rcs_print_error ("NML_SERVER:(ERROR) cms was NULL.\n");
00107         }
00108     }
00109   else
00110     {
00111       rcs_print_error ("NML_SERVER:(ERROR) nml_ptr was NULL.\n");
00112     }
00113   add_to_nml_server_list ();
00114 }
00115 
00116 void
00117 NML_SERVER::add_to_nml_server_list ()
00118 {
00119   if (NULL == NML_Default_Super_Server)
00120     {
00121       NML_Default_Super_Server = new NML_SUPER_SERVER;
00122     }
00123   if (NULL != NML_Default_Super_Server)
00124     {
00125       NML_Default_Super_Server->add_to_list (this);
00126     }
00127 }
00128 
00129 NML_SERVER::~NML_SERVER ()
00130 {
00131   being_deleted = 1;
00132   delete_from_list ();
00133 }
00134 
00135 void
00136 NML_SERVER::delete_from_list ()
00137 {
00138   CMS_SERVER::delete_from_list ();
00139   if (NULL != NML_Default_Super_Server)
00140     {
00141       if (NULL != NML_Default_Super_Server->servers)
00142         {
00143           NML_Default_Super_Server->servers->
00144             delete_node (super_server_list_id);
00145         }
00146     }
00147 }
00148 
00149 NML_SERVER_LOCAL_PORT::NML_SERVER_LOCAL_PORT (NML * _nml):
00150 CMS_SERVER_LOCAL_PORT ((CMS *) NULL)
00151 {
00152   local_channel_reused = 1;
00153   nml = _nml;
00154   if (NULL != nml)
00155     {
00156       cms = nml->cms;
00157       if (NULL != cms)
00158         {
00159           buffer_number = cms->buffer_number;
00160         }
00161     }
00162 }
00163 
00164 NML_SERVER_LOCAL_PORT::~NML_SERVER_LOCAL_PORT ()
00165 {
00166   if (NULL != nml && !local_channel_reused)
00167     {
00168       delete nml;
00169     }
00170   nml = (NML *) NULL;
00171   cms = (CMS *) NULL;
00172 }
00173 
00174 REMOTE_READ_REPLY *
00175 NML_SERVER_LOCAL_PORT::reader (REMOTE_READ_REQUEST * _req)
00176 {
00177   if ((NULL == cms) || (NULL == nml))
00178     {
00179       rcs_print_error ("NMLserver:reader: CMS object is NULL.\n");
00180       return ((REMOTE_READ_REPLY *) NULL);
00181     }
00182 
00183   /* Setup CMS channel from request arguments. */
00184   cms->in_buffer_id = _req->last_id_read;
00185 
00186   /* Read and encode the buffer. */
00187   switch (_req->access_type)
00188     {
00189     case CMS_READ_ACCESS:
00190       nml->read ();
00191       break;
00192     case CMS_PEEK_ACCESS:
00193       nml->peek ();
00194       break;
00195     default:
00196       rcs_print_error ("NML_SERVER: Invalid access type.(%d)\n",
00197                        _req->access_type);
00198       break;
00199     }
00200 
00201 
00202   /* Setup reply structure to be returned to remote process. */
00203   read_reply.status = (int) cms->status;
00204   if (cms->status == CMS_READ_OLD)
00205     {
00206       read_reply.size = 0;
00207       read_reply.data = NULL;
00208       read_reply.write_id = _req->last_id_read;
00209       read_reply.was_read = 1;
00210     }
00211   else
00212     {
00213       read_reply.size = cms->header.in_buffer_size;
00214       read_reply.data = (unsigned char *) cms->encoded_data;
00215       read_reply.write_id = cms->in_buffer_id;
00216       read_reply.was_read = cms->header.was_read;
00217     }
00218 
00219   /* Reply structure contains the latest shared memory info-- now
00220      return it to cms_dispatch  for return to caller */
00221   return (&read_reply);
00222 }
00223 
00224 
00225 REMOTE_READ_REPLY *
00226 NML_SERVER_LOCAL_PORT::blocking_read (REMOTE_READ_REQUEST * _req)
00227 {
00228   if ((NULL == cms) || (NULL == nml))
00229     {
00230       rcs_print_error ("NMLserver:blocking_read: CMS object is NULL.\n");
00231       return ((REMOTE_READ_REPLY *) NULL);
00232     }
00233   nml->cms->first_diag_store = 0;
00234   if (_req->type != REMOTE_CMS_BLOCKING_READ_REQUEST_TYPE)
00235     {
00236       rcs_print_error ("NMLserver::blocking_read: Invalid request type(%d)\n",
00237                        _req->type);
00238       return NULL;
00239     }
00240   double orig_bytes_moved = 0.0;
00241 
00242   REMOTE_BLOCKING_READ_REQUEST *breq = (REMOTE_BLOCKING_READ_REQUEST *) _req;
00243   breq->_nml = new NML (nml, 1, -1);
00244   NML *nmlcopy = (NML *) breq->_nml;
00245   CMS *cmscopy = nmlcopy->cms;
00246   double blocking_timeout = (double) (breq->timeout_millis / 1000.0);
00247   REMOTE_READ_REPLY *temp_read_reply = new REMOTE_READ_REPLY ();
00248   breq->_reply = temp_read_reply;
00249   long data_size = (long) cmscopy->max_encoded_message_size;
00250   temp_read_reply->data = DEBUG_MALLOC (data_size);
00251   breq->_data = temp_read_reply->data;
00252   if ((NULL == cmscopy) || (NULL == nmlcopy))
00253     {
00254       rcs_print_error ("NMLserver:blocking_read: CMS object is NULL.\n");
00255       return ((REMOTE_READ_REPLY *) NULL);
00256     }
00257   if (NULL != cmscopy->handle_to_global_data)
00258     {
00259       orig_bytes_moved = cmscopy->handle_to_global_data->total_bytes_moved;
00260     }
00261   if (NULL == temp_read_reply->data)
00262     {
00263       rcs_print_error
00264         ("NMLserver:blocking_read: temp_read_reply->data object is NULL.\n");
00265       return ((REMOTE_READ_REPLY *) NULL);
00266     }
00267   nmlcopy->cms->set_encoded_data (temp_read_reply->data, data_size);
00268 
00269   /* Setup CMS channel from request arguments. */
00270   cmscopy->in_buffer_id = _req->last_id_read;
00271 
00272   /* Read and encode the buffer. */
00273   nmlcopy->blocking_read (blocking_timeout);
00274 
00275   /* Setup reply structure to be returned to remote process. */
00276   temp_read_reply->status = (int) cmscopy->status;
00277   if (cmscopy->status == CMS_READ_OLD)
00278     {
00279       temp_read_reply->size = 0;
00280       if (NULL != temp_read_reply->data)
00281         {
00282           breq->_data = NULL;
00283           DEBUG_FREE (temp_read_reply->data);
00284           temp_read_reply->data = NULL;
00285         }
00286       temp_read_reply->write_id = _req->last_id_read;
00287       temp_read_reply->was_read = 1;
00288     }
00289   else
00290     {
00291       temp_read_reply->size = cmscopy->header.in_buffer_size;
00292       temp_read_reply->write_id = cmscopy->in_buffer_id;
00293       temp_read_reply->was_read = cmscopy->header.was_read;
00294     }
00295   if (NULL != nml->cms->handle_to_global_data &&
00296       NULL != cmscopy->handle_to_global_data)
00297     {
00298       nml->cms->handle_to_global_data->total_bytes_moved
00299         +=
00300         (cmscopy->handle_to_global_data->total_bytes_moved -
00301          orig_bytes_moved);
00302       nml->cms->first_diag_store = cmscopy->first_diag_store;
00303     }
00304   breq->_nml = NULL;
00305   delete nmlcopy;
00306 
00307 
00308   /* Reply structure contains the latest shared memory info-- now
00309      return it to cms_dispatch  for return to caller */
00310   return (temp_read_reply);
00311 }
00312 
00313 
00314 /* REMOTE local_port function for writes */
00315 REMOTE_WRITE_REPLY *
00316 NML_SERVER_LOCAL_PORT::writer (REMOTE_WRITE_REQUEST * _req)
00317 {
00318   NMLmsg *temp;                 /* Temporary Pointer */
00319 
00320   if ((NULL == cms) || (NULL == nml))
00321     {
00322       rcs_print_error ("NMLserver:writer: CMS object is NULL.\n");
00323       return ((REMOTE_WRITE_REPLY *) NULL);
00324     }
00325 
00326   temp = (NMLmsg *) cms->data;
00327   /* Check to see if remote process writing too much into local buffer. */
00328   if (_req->size > cms_encoded_data_explosion_factor * cms->size)
00329     {
00330       rcs_print_error
00331         ("CMSserver:cms_writer: CMS buffer size is too small.\n");
00332       return ((REMOTE_WRITE_REPLY *) NULL);
00333     }
00334 
00335   /* Copy the encoded data to the location set up in CMS. */
00336   // memcpy(cms->encoded_data, _req->data, _req->size);
00337   cms->header.in_buffer_size = _req->size;
00338   temp->size = _req->size;
00339 
00340   switch (_req->access_type)
00341     {
00342     case CMS_WRITE_ACCESS:
00343       nml->write (*temp);
00344       break;
00345     case CMS_WRITE_IF_READ_ACCESS:
00346       nml->write_if_read (*temp);
00347       break;
00348     default:
00349       rcs_print_error ("NML_SERVER: Invalid Access type. (%d)\n",
00350                        _req->access_type);
00351       break;
00352     }
00353 
00354   write_reply.status = (int) cms->status;
00355   write_reply.was_read = cms->header.was_read;
00356   return (&write_reply);
00357 }
00358 
00359 
00360 
00361 REMOTE_SET_DIAG_INFO_REPLY *
00362 NML_SERVER_LOCAL_PORT::set_diag_info (REMOTE_SET_DIAG_INFO_REQUEST * _req)
00363 {
00364   if (NULL == _req)
00365     {
00366       return (NULL);
00367     }
00368   CMS_DIAG_PROC_INFO *dpi = cms->get_diag_proc_info ();
00369   if (NULL == dpi)
00370     {
00371       return (NULL);
00372     }
00373   if (orig_info == NULL)
00374     {
00375       orig_info = new CMS_DIAG_PROC_INFO ();
00376       *orig_info = *dpi;
00377     }
00378   strncpy (dpi->name, _req->process_name, 16);
00379   strncpy (dpi->host_sysinfo, _req->host_sysinfo, 32);
00380   if (cms->total_connections > _req->c_num && _req->c_num >= 0)
00381     {
00382       cms->connection_number = _req->c_num;
00383     }
00384   if (NULL != cms->handle_to_global_data)
00385     {
00386       cms->handle_to_global_data->total_bytes_moved = _req->bytes_moved;
00387     }
00388   dpi->pid = _req->pid;
00389   dpi->rcslib_ver = _req->rcslib_ver;
00390   cms->set_diag_proc_info (dpi);
00391   return (NULL);
00392 }
00393 
00394 REMOTE_GET_DIAG_INFO_REPLY *
00395 NML_SERVER_LOCAL_PORT::get_diag_info (REMOTE_GET_DIAG_INFO_REQUEST * _req)
00396 {
00397   get_diag_info_reply.cdi = cms->get_diagnostics_info ();
00398   get_diag_info_reply.status = cms->status;
00399   return (&get_diag_info_reply);
00400 }
00401 
00402 REMOTE_GET_MSG_COUNT_REPLY *
00403 NML_SERVER_LOCAL_PORT::get_msg_count (REMOTE_GET_DIAG_INFO_REQUEST * _req)
00404 {
00405   return (NULL);
00406 }
00407 
00408 void
00409 NML_SERVER_LOCAL_PORT::reset_diag_info ()
00410 {
00411   if (NULL != orig_info)
00412     {
00413       CMS_DIAG_PROC_INFO *dpi = cms->get_diag_proc_info ();
00414       *dpi = *orig_info;
00415       cms->set_diag_proc_info (dpi);
00416     }
00417 }
00418 
00419 RCS_EXPORT NML_SUPER_SERVER *NML_Default_Super_Server =
00420   (NML_SUPER_SERVER *) NULL;
00421 
00422 NML_SUPER_SERVER::NML_SUPER_SERVER ()
00423 {
00424   servers = (RCS_LINKED_LIST *) NULL;
00425   unspawned_servers = 0;
00426 
00427   servers = new RCS_LINKED_LIST;
00428 }
00429 
00430 NML_SUPER_SERVER::~NML_SUPER_SERVER ()
00431 {
00432   kill_all_servers ();
00433   delete_all_servers ();
00434   if (NULL != servers)
00435     {
00436       delete servers;
00437       servers = (RCS_LINKED_LIST *) NULL;
00438     }
00439 }
00440 
00441 void
00442 NML_SUPER_SERVER::add_to_list (NML * _nml)
00443 {
00444   NML_SERVER *server = (NML_SERVER *) NULL;
00445   NML_SERVER_LOCAL_PORT *local_port = (NML_SERVER_LOCAL_PORT *) NULL;
00446   NML *new_nml = (NML *) NULL;
00447 
00448   if (NULL != servers)
00449     {
00450       server = (NML_SERVER *) servers->get_head ();
00451       while (NULL != server)
00452         {
00453           if (server->accept_local_port_cms (_nml->cms))
00454             {
00455               break;
00456             }
00457           server = (NML_SERVER *) servers->get_next ();
00458         }
00459       if (NULL == server)
00460         {
00461           server = new NML_SERVER (_nml);
00462           if (NULL == server)
00463             {
00464               rcs_print_error
00465                 ("NML_SERVER: Unable to create server object.\n");
00466             }
00467         }
00468       else
00469         {
00470           if (_nml->cms->isserver)
00471             {
00472               new_nml = _nml;
00473               local_port = new NML_SERVER_LOCAL_PORT (new_nml);
00474               local_port->local_channel_reused = 1;
00475             }
00476           else
00477             {
00478               new_nml = new NML (_nml, 1, -1);
00479               local_port = new NML_SERVER_LOCAL_PORT (new_nml);
00480               local_port->local_channel_reused = 0;
00481             }
00482           if (NULL == local_port)
00483             {
00484               rcs_print_error ("NML_SERVER: Unable to create local port.\n");
00485               return;
00486             }
00487           server->add_local_port (local_port);
00488         }
00489     }
00490 }
00491 
00492 void
00493 NML_SUPER_SERVER::add_to_list (NML_SERVER * _server)
00494 {
00495   if ((NULL != servers) && (NULL != _server))
00496     {
00497       _server->super_server_list_id
00498         = servers->store_at_tail (_server, sizeof (NML_SERVER), 0);
00499       unspawned_servers++;
00500     }
00501 }
00502 
00503 void
00504 NML_SUPER_SERVER::spawn_all_servers ()
00505 {
00506   NML_SERVER *server;
00507 
00508   if (NULL != servers)
00509     {
00510       server = (NML_SERVER *) servers->get_head ();
00511       while (NULL != server)
00512         {
00513           if (server->spawn () > 0 && unspawned_servers > 0)
00514             {
00515               unspawned_servers--;
00516             }
00517           server = (NML_SERVER *) servers->get_next ();
00518         }
00519     }
00520 }
00521 
00522 void
00523 NML_SUPER_SERVER::kill_all_servers ()
00524 {
00525   NML_SERVER *server;
00526 
00527   if (NULL != servers)
00528     {
00529       server = (NML_SERVER *) servers->get_head ();
00530       while (NULL != server)
00531         {
00532 #ifdef WIN32
00533           DWORD pid;
00534           pid = GetCurrentProcessId ();
00535           if (server->spawner_pid != pid || pid == server->server_pid)
00536             {
00537               server = (NML_SERVER *) servers->get_next ();
00538               continue;
00539             }
00540 #endif
00541 #ifdef VXWORKS
00542           int pid;
00543           pid = taskIdSelf ();
00544           if (server->spawner_pid != pid)
00545             {
00546               server = (NML_SERVER *) servers->get_next ();
00547               continue;
00548             }
00549 #endif
00550           if (server->server_spawned)
00551             {
00552               server->kill_server ();
00553             }
00554           server = (NML_SERVER *) servers->get_next ();
00555         }
00556     }
00557 }
00558 
00559 void
00560 NML_SUPER_SERVER::delete_all_servers ()
00561 {
00562 #ifdef VXWORKS
00563   int pid, tid;
00564   pid = taskIdSelf ();
00565   tid = 0;
00566 #endif
00567 #ifdef WIN32
00568   DWORD pid = GetCurrentProcessId ();
00569   DWORD tid = GetCurrentThreadId ();
00570 #endif
00571   NML_SERVER *server;
00572   if (NULL != servers)
00573     {
00574       server = (NML_SERVER *) servers->get_head ();
00575       while (NULL != server)
00576         {
00577 #if defined(VXWORKS) || defined(WIN32)
00578           if (
00579               (server->server_spawned
00580                && (server->spawner_pid != pid || server->spawner_tid != tid))
00581               || (!server->server_spawned
00582                   && (server->server_pid != pid
00583                       || server->server_tid != tid)))
00584             {
00585               server = (NML_SERVER *) servers->get_next ();
00586               continue;
00587             }
00588 #endif
00589           if (!server->server_spawned && unspawned_servers > 0)
00590             {
00591               unspawned_servers--;
00592             }
00593           delete server;
00594           server = (NML_SERVER *) servers->get_next ();
00595         }
00596     }
00597 }
00598 
00599 
00600 int nml_control_C_caught = 0;
00601 int nml_sigint_count = 0;
00602 int dont_kill_servers = 0;
00603 int dont_cleanup_servers = 0;
00604 static int nmlsrv_last_sig = 0;
00605 
00606 #if defined(WIN32) && !defined(gnuwin32)
00607 static int __stdcall
00608 catch_control_C1 (unsigned long sig)
00609 #else
00610 static void
00611 catch_control_C1 (int sig)
00612 #endif
00613 {
00614   nmlsrv_last_sig = sig;
00615   nml_sigint_count++;
00616 #ifndef WIN32
00617   signal (SIGINT, SIG_DFL);
00618 #endif
00619   if (NULL != NML_Default_Super_Server)
00620     {
00621 #ifdef VXWORKS
00622       NML_Default_Super_Server->delete_all_servers ();
00623       if (NULL != NML_Default_Super_Server->servers)
00624         {
00625           if (0 == NML_Default_Super_Server->servers->list_size)
00626             {
00627 #endif
00628               delete NML_Default_Super_Server;
00629               NML_Default_Super_Server = (NML_SUPER_SERVER *) NULL;
00630 #ifdef VXWORKS
00631             }
00632         }
00633 #endif
00634     }
00635 #ifdef VXWORKS
00636   taskLock ();
00637 #endif
00638   dont_kill_servers = 1;
00639   dont_cleanup_servers = 1;
00640   nml_cleanup ();
00641   dont_kill_servers = 0;
00642   dont_cleanup_servers = 0;
00643 #ifdef VXWORKS
00644   taskUnlock ();
00645 #endif
00646 #ifdef UNDER_CE
00647   ExitThread (0);
00648 #else
00649   exit (0);
00650 #endif
00651 #ifdef WIN32
00652   return (0);                   // Just to please the compiler.
00653 #endif
00654 }                               /*  */
00655 
00656 #if defined(WIN32) && !defined(gnuwin32)
00657 static int __stdcall
00658 catch_control_C2 (unsigned long sig)
00659 #else
00660 static void
00661 catch_control_C2 (int sig)
00662 #endif
00663 {
00664   nmlsrv_last_sig = sig;
00665 #ifndef WIN32
00666   signal (SIGINT, SIG_DFL);
00667 #endif
00668   nml_control_C_caught = 1;
00669 #if defined(WIN32) && !defined(gnuwin32)
00670   return (0);
00671 #endif
00672 }
00673 
00674 void
00675 run_nml_server_exit (int i)
00676 {
00677 #ifndef UNDER_CE
00678 #if defined(_WINDOWS) && !defined(gnuwin32)
00679   MessageBox (NULL, "Exiting run_nml_servers().", "NML Message", MB_OK);
00680 #endif
00681 #endif
00682   rcs_exit (i);
00683 }
00684 
00685 void RCS_EXPORT
00686 run_nml_servers ()
00687 {
00688 #if defined(sun4os5) || defined(__MSDOS__) && !defined(WIN32)
00689   atexit (nml_cleanup);
00690 #endif
00691   if (NULL != NML_Default_Super_Server)
00692     {
00693       if (NML_Default_Super_Server->servers != NULL)
00694         {
00695           if (NML_Default_Super_Server->servers->list_size <
00696               NML_Default_Super_Server->unspawned_servers)
00697             {
00698               NML_Default_Super_Server->unspawned_servers =
00699                 NML_Default_Super_Server->servers->list_size;
00700             }
00701           if (NML_Default_Super_Server->unspawned_servers <= 0)
00702             {
00703               rcs_print_error
00704                 ("run_nml_servers(): No buffers without servers already spawned for them.\n");
00705               return;
00706             }
00707           if (NML_Default_Super_Server->unspawned_servers == 1)
00708             {
00709               NML_Default_Super_Server->unspawned_servers = 0;
00710               NML_SERVER *sole_server;
00711               sole_server =
00712                 (NML_SERVER *) NML_Default_Super_Server->servers->get_head ();
00713               while (sole_server != NULL)
00714                 {
00715                   if (NULL != sole_server->remote_port)
00716                     {
00717                       if (!sole_server->remote_port->running &&
00718                           !sole_server->server_spawned)
00719                         {
00720                           break;
00721                         }
00722                     }
00723                   sole_server =
00724                     (NML_SERVER *) NML_Default_Super_Server->servers->
00725                     get_next ();
00726                 }
00727               if (NULL == sole_server)
00728                 {
00729                   rcs_print_error
00730                     ("run_nml_servers() : sole_server is NULL.\n");
00731                   run_nml_server_exit (-1);
00732                 }
00733               else
00734                 {
00735 #ifndef UNDER_CE
00736 #if defined(WIN32) && !defined(gnuwin32)
00737                   SetConsoleCtrlHandler (catch_control_C1, TRUE);
00738 #else
00739 #ifdef sparcworks_sun4
00740                   signal (SIGINT, (void (*)(int,...)) catch_control_C1);
00741 #else
00742                   signal (SIGINT, catch_control_C1);
00743 #endif
00744 #endif
00745 #endif
00746                   sole_server->run (0);
00747                   run_nml_server_exit (-1);
00748                 }
00749             }
00750           else
00751             {
00752               nml_control_C_caught = 0;
00753               NML_Default_Super_Server->spawn_all_servers ();
00754 #ifndef UNDER_CE
00755 #if defined(WIN32) && !defined(gnuwin32)
00756               SetConsoleCtrlHandler (catch_control_C2, TRUE);
00757 #else
00758 #ifdef sparcworks_sun4
00759               signal (SIGINT, (void (*)(int,...)) catch_control_C2);
00760 #else
00761               signal (SIGINT, catch_control_C2);
00762 #endif
00763 #endif
00764 #endif
00765               while (!nml_control_C_caught)
00766                 esleep (2.0);
00767               NML_Default_Super_Server->kill_all_servers ();
00768               nml_cleanup ();
00769               run_nml_server_exit (0);
00770             }
00771         }
00772       else
00773         {
00774           rcs_print_error
00775             ("run_nml_servers(): No buffers without servers already spawned for them.\n");
00776         }
00777     }
00778   else
00779     {
00780       rcs_print_error
00781         ("run_nml_servers(): No buffers without servers already spawned for them.\n");
00782     }
00783   run_nml_server_exit (-1);
00784 }
00785 
00786 void RCS_EXPORT
00787 spawn_nml_servers ()
00788 {
00789   if (NULL != NML_Default_Super_Server)
00790     {
00791       NML_Default_Super_Server->spawn_all_servers ();
00792     }
00793 }
00794 
00795 void RCS_EXPORT
00796 kill_nml_servers ()
00797 {
00798   if (!dont_kill_servers)
00799     {
00800       if (NULL != NML_Default_Super_Server)
00801         {
00802           NML_Default_Super_Server->kill_all_servers ();
00803         }
00804     }
00805 }
00806 
00807 void RCS_EXPORT
00808 nml_server_cleanup ()
00809 {
00810   if (!dont_cleanup_servers)
00811     {
00812       if (NULL != NML_Default_Super_Server)
00813         {
00814           NML_Default_Super_Server->kill_all_servers ();
00815           NML_Default_Super_Server->delete_all_servers ();
00816 #ifdef VXWORKS
00817           if (NULL != NML_Default_Super_Server->servers)
00818             {
00819               if (0 == NML_Default_Super_Server->servers->list_size)
00820                 {
00821 #endif
00822                   delete NML_Default_Super_Server;
00823                   NML_Default_Super_Server = (NML_SUPER_SERVER *) NULL;
00824 #ifdef VXWORKS
00825                 }
00826             }
00827 #endif
00828         }
00829     }
00830 }

Generated on Sun Dec 2 15:56:50 2001 for rcslib by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001