⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 locmem.cc

📁 Source code for an Numeric Cmputer
💻 CC
字号:
/********************************************************************* Description: locmem.cc*   Implements LOCMEM which is a derived class of CMS that serves*   primarily to provide addresses that match when matching buffer*   names are passed to the constructor. It is useful in allowing*   control modules to use the same inteface to communicate as would*   be required if they were not running in the same process even*   though to use LOCMEM they must be.**   Derived from a work by Fred Proctor & Will Shackleford** Author:* License: LGPL Version 2* System: Linux*    * Copyright (c) 2004 All rights reserved.** Last change: * $Revision: 1.4 $* $Author: paul_c $* $Date: 2005/05/23 16:34:10 $********************************************************************/#include "locmem.hh"		// class LOCMEM#include "cms.hh"		// class CMS#include "linklist.hh"		// class LinkedList#include "rcs_print.hh"		// rcs_print_error()#ifdef __cplusplusextern "C" {#endif#include <stdlib.h>		// malloc()#include <string.h>		// strcpy(), strcmp()#ifdef __cplusplus}#endifLinkedList *LOCMEM::buffers_list = (LinkedList *) NULL;LOCMEM::LOCMEM(char *bufline, char *procline, int set_to_server,    int set_to_master):CMS(bufline, procline, set_to_server){    my_node = (BUFFERS_LIST_NODE *) NULL;    lm_addr = NULL;    if (set_to_master == 1) {	is_local_master = 1;    }    if (set_to_master == -1) {	is_local_master = 0;    }    if (is_local_master) {	if (buffers_list == NULL) {	    buffers_list = new LinkedList;	}	if (buffers_list == NULL) {	    rcs_print_error("LOCMEM: Can't create buffers_list.\n");	    status = CMS_CREATE_ERROR;	    return;	}	my_node = new BUFFERS_LIST_NODE;	lm_addr = my_node->addr = malloc(size);	if (my_node == NULL || lm_addr == NULL) {	    rcs_print_error("Can't malloc needed space.\n");	    status = CMS_CREATE_ERROR;	    return;	}	my_node->size = size;	strcpy(my_node->name, BufferName);	memset(my_node->addr, 0, size);	buffer_id = buffers_list->store_at_tail(my_node, sizeof(my_node), 0);	return;    }    if (buffers_list == NULL) {	rcs_print_error("LOCMEM: buffers_list is NULL.\n");	status = CMS_NO_MASTER_ERROR;	return;    }    /* Search for a matching buffer name. */    my_node = (BUFFERS_LIST_NODE *) buffers_list->get_head();    while (my_node != NULL) {	if (!strcmp(BufferName, my_node->name)) {	    /* Found it!!! */	    if (my_node->size != size) {		rcs_print_error("LOCMEM - size mismatch for buffer %s.\n",		    BufferName);		status = CMS_CONFIG_ERROR;		return;	    }	    buffer_id = buffers_list->get_current_id();	    lm_addr = my_node->addr;	    return;	}	my_node = (BUFFERS_LIST_NODE *) buffers_list->get_next();    }    rcs_print_error("LOCMEM: buffer not found on buffers_list.\n");    status = CMS_NO_MASTER_ERROR;    return;}LOCMEM::~LOCMEM(){    if (NULL != buffers_list) {	buffers_list->delete_node(buffer_id);	if (0 == buffers_list->list_size) {	    delete buffers_list;	    buffers_list = (LinkedList *) NULL;	}    }}CMS_STATUS LOCMEM::main_access(void *local_address){    internal_access(lm_addr, size, local_address);    return status;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -