/ src / libnml / buffer / locmem.cc
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  }