00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "rcs_defs.hh"
00011 #include "locmem.hh"
00012 #include "cms.hh"
00013 #include "linklist.hh"
00014 #include "rcs_prnt.hh"
00015 #include "dbg_mem.h"
00016
00017 #ifdef EXTERN_C_STD_HEADERS
00018 extern "C"
00019 {
00020 #endif
00021
00022 #include <stdlib.h>
00023 #include <string.h>
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
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
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 }