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

locmem.cc

Go to the documentation of this file.
00001 /************************************************************************
00002 File: locmem.cc
00003 Purpose: Implements LOCMEM which is a derived class of CMS that serves primarily
00004 to provide addresses that match when matching buffer names are passed to
00005 the constructor. It is useful in allowing control modules to use the
00006 same inteface to communicate as would be required if they were not
00007 running in the same process even though to use LOCMEM they must be.
00008 **********************************************************************/
00009 
00010 #include "rcs_defs.hh"          // EXTERN_C_STD_HEADERS
00011 #include "locmem.hh"            // class LOCMEM
00012 #include "cms.hh"               // class CMS
00013 #include "linklist.hh"          // class RCS_LINKED_LIST
00014 #include "rcs_prnt.hh"          // rcs_print_error()
00015 #include "dbg_mem.h"            // DEBUG_MALLOC, DEBUG_FREE
00016 
00017 #ifdef EXTERN_C_STD_HEADERS
00018 extern "C"
00019 {
00020 #endif
00021 
00022 #include <stdlib.h>             // malloc()
00023 #include <string.h>             // strcpy(), strcmp()
00024 
00025 #ifdef EXTERN_C_STD_HEADERS
00026 }
00027 #endif
00028 
00029 RCS_LINKED_LIST *
00030   LOCMEM::buffers_list = (RCS_LINKED_LIST *) NULL;
00031 
00032 LOCMEM::LOCMEM (char *bufline, char *procline, int set_to_server,
00033                 int set_to_master):
00034 CMS (bufline, procline, set_to_server)
00035 {
00036   my_node = (BUFFERS_LIST_NODE *) NULL;
00037   lm_addr = NULL;
00038 
00039   if (set_to_master == 1)
00040     {
00041       is_local_master = 1;
00042     }
00043   if (set_to_master == -1)
00044     {
00045       is_local_master = 0;
00046     }
00047 
00048   if (is_local_master)
00049     {
00050       if (buffers_list == NULL)
00051         {
00052           buffers_list = new RCS_LINKED_LIST;
00053         }
00054       if (buffers_list == NULL)
00055         {
00056           rcs_print_error ("LOCMEM: Can't create buffers_list.\n");
00057           status = CMS_CREATE_ERROR;
00058           return;
00059         }
00060       my_node = new BUFFERS_LIST_NODE;
00061       lm_addr = my_node->addr = DEBUG_MALLOC (size);
00062       if (my_node == NULL || lm_addr == NULL)
00063         {
00064           rcs_print_error ("Can't malloc needed space.\n");
00065           status = CMS_CREATE_ERROR;
00066           return;
00067         }
00068       my_node->size = size;
00069       strcpy (my_node->name, BufferName);
00070       memset (my_node->addr, 0, size);
00071       buffer_id = buffers_list->store_at_tail (my_node, sizeof (my_node), 0);
00072       return;
00073     }
00074 
00075   if (buffers_list == NULL)
00076     {
00077       rcs_print_error ("LOCMEM: buffers_list is NULL.\n");
00078       status = CMS_NO_MASTER_ERROR;
00079       return;
00080     }
00081 
00082   /* Search for a matching buffer name. */
00083   my_node = (BUFFERS_LIST_NODE *) buffers_list->get_head ();
00084   while (my_node != NULL)
00085     {
00086       if (!strcmp (BufferName, my_node->name))
00087         {
00088           /* Found it!!! */
00089           if (my_node->size != size)
00090             {
00091               rcs_print_error ("LOCMEM - size mismatch for buffer %s.\n",
00092                                BufferName);
00093               status = CMS_CONFIG_ERROR;
00094               return;
00095             }
00096           buffer_id = buffers_list->get_current_id ();
00097           lm_addr = my_node->addr;
00098           return;
00099         }
00100       my_node = (BUFFERS_LIST_NODE *) buffers_list->get_next ();
00101     }
00102   rcs_print_error ("LOCMEM: buffer not found on buffers_list.\n");
00103   status = CMS_NO_MASTER_ERROR;
00104   return;
00105 
00106 }
00107 
00108 
00109 LOCMEM::~LOCMEM ()
00110 {
00111   if (NULL != buffers_list)
00112     {
00113       buffers_list->delete_node (buffer_id);
00114       if (0 == buffers_list->list_size)
00115         {
00116           delete buffers_list;
00117           buffers_list = (RCS_LINKED_LIST *) NULL;
00118         }
00119     }
00120 }
00121 
00122 CMS_STATUS
00123 LOCMEM::main_access (void *local_address)
00124 {
00125   internal_access (lm_addr, size, local_address);
00126   return status;
00127 }

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