00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "rcs_defs.hh"
00011
00012 #ifdef EXTERN_C_STD_HEADERS
00013 extern "C"
00014 {
00015 #endif
00016
00017 #include <string.h>
00018
00019 #if defined(WIN32) && !defined(gnuwin32)
00020 #if defined(WIN32) && !defined(USE_OLD_WINSOCK)
00021
00022
00023 #include <winsock2.h>
00024 #endif
00025
00026 #include <windows.h>
00027 #else
00028 #include <signal.h>
00029 #include <sys/types.h>
00030 #include <unistd.h>
00031 #include <sys/wait.h>
00032 #include <stdlib.h>
00033 #ifdef VXWORKS
00034 #include <taskLib.h>
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"
00047
00048
00049
00050 #include "rcs_prnt.hh"
00051 #include "timer.hh"
00052 #include "rcs_exit.hh"
00053 #include "dbg_mem.h"
00054 #include "cmsdiag.hh"
00055
00056 #ifdef sunos5
00057 #include <thread.h>
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
00184 cms->in_buffer_id = _req->last_id_read;
00185
00186
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
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
00220
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
00270 cmscopy->in_buffer_id = _req->last_id_read;
00271
00272
00273 nmlcopy->blocking_read (blocking_timeout);
00274
00275
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
00309
00310 return (temp_read_reply);
00311 }
00312
00313
00314
00315 REMOTE_WRITE_REPLY *
00316 NML_SERVER_LOCAL_PORT::writer (REMOTE_WRITE_REQUEST * _req)
00317 {
00318 NMLmsg *temp;
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
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
00336
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);
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 }