locmem.cc
1 /******************************************************************** 2 * Description: locmem.cc 3 * Implements LOCMEM which is a derived class of CMS that serves 4 * primarily to provide addresses that match when matching buffer 5 * names are passed to the constructor. It is useful in allowing 6 * control modules to use the same inteface to communicate as would 7 * be required if they were not running in the same process even 8 * though to use LOCMEM they must be. 9 * 10 * Derived from a work by Fred Proctor & Will Shackleford 11 * 12 * Author: 13 * License: LGPL Version 2 14 * System: Linux 15 * 16 * Copyright (c) 2004 All rights reserved. 17 * 18 * Last change: 19 ********************************************************************/ 20 21 #include "locmem.hh" // class LOCMEM 22 #include "cms.hh" // class CMS 23 #include "linklist.hh" // class LinkedList 24 #include "rcs_print.hh" // rcs_print_error() 25 26 #ifdef __cplusplus 27 extern "C" { 28 #endif 29 30 #include <stdlib.h> // malloc() 31 #include <string.h> // strcpy(), strcmp() 32 33 #ifdef __cplusplus 34 } 35 #endif 36 LinkedList *LOCMEM::buffers_list = (LinkedList *) NULL; 37 38 LOCMEM::LOCMEM(const char *bufline, const char *procline, int set_to_server, 39 int set_to_master):CMS(bufline, procline, set_to_server) 40 { 41 my_node = (BUFFERS_LIST_NODE *) NULL; 42 lm_addr = NULL; 43 44 if (set_to_master == 1) { 45 is_local_master = 1; 46 } 47 if (set_to_master == -1) { 48 is_local_master = 0; 49 } 50 51 if (is_local_master) { 52 if (buffers_list == NULL) { 53 buffers_list = new LinkedList; 54 } 55 if (buffers_list == NULL) { 56 rcs_print_error("LOCMEM: Can't create buffers_list.\n"); 57 status = CMS_CREATE_ERROR; 58 return; 59 } 60 my_node = new BUFFERS_LIST_NODE; 61 lm_addr = my_node->addr = malloc(size); 62 if (my_node == NULL || lm_addr == NULL) { 63 rcs_print_error("Can't malloc needed space.\n"); 64 status = CMS_CREATE_ERROR; 65 return; 66 } 67 my_node->size = size; 68 strcpy(my_node->name, BufferName); 69 memset(my_node->addr, 0, size); 70 buffer_id = buffers_list->store_at_tail(my_node, sizeof(my_node), 0); 71 return; 72 } 73 74 if (buffers_list == NULL) { 75 rcs_print_error("LOCMEM: buffers_list is NULL.\n"); 76 status = CMS_NO_MASTER_ERROR; 77 return; 78 } 79 80 /* Search for a matching buffer name. */ 81 my_node = (BUFFERS_LIST_NODE *) buffers_list->get_head(); 82 while (my_node != NULL) { 83 if (!strcmp(BufferName, my_node->name)) { 84 /* Found it!!! */ 85 if (my_node->size != size) { 86 rcs_print_error("LOCMEM - size mismatch for buffer %s.\n", 87 BufferName); 88 status = CMS_CONFIG_ERROR; 89 return; 90 } 91 buffer_id = buffers_list->get_current_id(); 92 lm_addr = my_node->addr; 93 return; 94 } 95 my_node = (BUFFERS_LIST_NODE *) buffers_list->get_next(); 96 } 97 rcs_print_error("LOCMEM: buffer not found on buffers_list.\n"); 98 status = CMS_NO_MASTER_ERROR; 99 return; 100 101 } 102 103 LOCMEM::~LOCMEM() 104 { 105 if (NULL != buffers_list) { 106 buffers_list->delete_node(buffer_id); 107 if (0 == buffers_list->list_size) { 108 delete buffers_list; 109 buffers_list = (LinkedList *) NULL; 110 } 111 } 112 } 113 114 CMS_STATUS LOCMEM::main_access(void *local_address, int *serial_number) 115 { 116 internal_access(lm_addr, size, local_address, serial_number); 117 return status; 118 }