1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
/********************************************************************
* 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:
********************************************************************/
#include "locmem.hh" // class LOCMEM
#include "cms.hh" // class CMS
#include "linklist.hh" // class LinkedList
#include "rcs_print.hh" // rcs_print_error()
#ifdef __cplusplus
extern "C" {
#endif
#include <stdlib.h> // malloc()
#include <string.h> // strcpy(), strcmp()
#ifdef __cplusplus
}
#endif
LinkedList *LOCMEM::buffers_list = (LinkedList *) NULL;
LOCMEM::LOCMEM(const char *bufline, const 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;
}
|