MiniballSort
Loading...
Searching...
No Matches
DataSpy.cc
Go to the documentation of this file.
1
7
8
9#include <DataSpy.hh>
10
13int DataSpy::Open( int id ) {
14
15 if( id < 0 || id >= MAX_ID ) {
16 perror ("dataSpyOpen - id number out of range");
17 return -1;
18 }
19
20#if( defined SOLARIS || defined POSIX )
21
22 // create a file mapped object (MASTER) or obtain ID of existing object
23 //sprintf( object_name, "SHM_%d", shmkey+id );
24 snprintf( object_name, sizeof(object_name), "SHM_%d", shmkey+id );
25
26 shmid[id] = shm_open( object_name, O_RDONLY, (mode_t)0 );
27 if( shmid[id] == -1 ) {
28 perror("shm_open");
29 exit(1);
30 }
31
32#else
33
34 shmid[id] = shmget(shmkey+id, 0, SHM_R);
35 if (shmid[id] == -1) {perror("shmget"); return -1;}
36
37#endif
38
39#if( defined SOLARIS || defined POSIX )
40
41 // attach the memory segment
42 shm_bufferarea[id] = mmap((void *) NULL, (size_t) SHMSIZE, PROT_READ, MAP_SHARED, shmid[id], (off_t) 0);
43 if( shm_bufferarea[id] == (void *) MAP_FAILED ) {
44 perror("mmap");
45 exit(1);
46 }
47
48 close( shmid[id] );
49
50#else
51
52 shm_bufferarea[id] = shmat( shmid[id], (void *) 0, SHM_RDONLY );
53 if( shm_bufferarea[id] == (void *) -1 ) {
54 perror("shmat");
55 exit(1);
56 }
57
58#endif
59
60 std::cout << "DataSpy Shared buffer area " << id << " (/SHM_" << shmkey+id << ") located at " << (unsigned long)shm_bufferarea[id] << std::endl;
61
63
66
67 // Flush all old buffers by setting current index ...
70
71 std::cout << "DataSpy Current age " << current_age[id] << " index " << next_index[id] << std::endl;
72
73 return 0;
74
75}
76
80int DataSpy::Close( int id ) {
81
82 if( id < 0 || id >= MAX_ID ) {
83
84 perror( "DataSpy::Close - id number out of range" );
85 return -1;
86
87 }
88
89#if (defined SOLARIS || defined POSIX)
90
91 // detach the memory segment
92 (void)munmap(shm_bufferarea[id], (size_t) SHMSIZE);
93
94#else
95
96 (void)shmdt(shm_bufferarea[id]);
97
98#endif
99
100 std::cout << "DataSpy Shared buffer area " << id << " located at " << (unsigned long)shm_bufferarea[id] << " detached" << std::endl;
101
102 return 0;
103
104}
105
112int DataSpy::ReadWithSeq( int id, char *data, unsigned int length, int *seq ) {
113
114 int *bufferaddress;
115 unsigned int len;
116 int *ptr;
117
118
119 if( id < 0 || id >= MAX_ID ) {
120 perror( "DataSpy::Read - id number out of range" );
121 return -1;
122 }
123
124 len = 0;
126
127retry:
128
129 if( baseaddress->buffer_age[next_index[id]] != 0 ) {
130
131 if( baseaddress->buffer_age[next_index[id]] >= current_age[id] ) {
132
134
136 if( !len ) len = MAX_BUFFER_SIZE;
137
138 bufferaddress = (int *) ((char *)shm_bufferarea[id] + buffers_offset[id] + (len * next_index[id]));
139
140 if( length < len ) len = length;
141
142 if( verbose )
143 printf( "DataSpy::Read id %d: Age %lld Index %d Buffer length %d\n",
144 id, current_age[id], next_index[id], len );
145
146 // copy data from shared memory to user buffer
147 ptr = (int*)data;
148 for( unsigned int i = 0; i < (len >> 2); i++ )
149 ptr[i] = bufferaddress[i];
150 *seq = (int)current_age[id];
151
152 // check if the entry could have changed while copying (can happen) and if so retry
153 if( current_age[id] != baseaddress->buffer_age[next_index[id]] ) {
154
155 if( verbose ) {
156 std::cout << "DataSpy::Read id " << id << ": Copied oldage " << current_age[id];
157 std::cout << "newage " << baseaddress->buffer_age[next_index[id]] << std::endl;
158 }
159
160 goto retry;
161
162 }
163
164 next_index[id] = (1+next_index[id]) & (number_of_buffers[id] -1);
165
166 }
167
168 }
169
170 else {
171
172 if( verbose )
173 std::cout << "DataSpy::Read - id " << id << " has no data" << std::endl;
174
175 }
176
177 if( verbose )
178 std::cout << "DataSpy::Read - id " << id << " length " << len << std::endl;
179
180 return len; /* return actual length of data block */
181
182}
186int DataSpy::Read( int id, char *data, unsigned int length ) {
187
188 int seq;
189
190 return ReadWithSeq( id, data, length, &seq );
191
192}
193/*****************************************************************************/
#define SHMSIZE
Definition DataSpy.hh:37
#define MAX_ID
Definition DataSpy.hh:34
#define MAX_BUFFER_SIZE
Definition DataSpy.hh:35
BUFFER_HEADER * baseaddress
Definition DataSpy.hh:86
int number_of_buffers[MAX_ID]
Definition DataSpy.hh:88
int Open(int id)
Definition DataSpy.cc:13
int Read(int id, char *data, unsigned int length)
Definition DataSpy.cc:186
int ReadWithSeq(int id, char *data, unsigned int length, int *seq)
Definition DataSpy.cc:112
int buffers_offset[MAX_ID]
Definition DataSpy.hh:89
int Close(int id)
Definition DataSpy.cc:80
void * shm_bufferarea[MAX_ID]
Definition DataSpy.hh:84
int shmid[MAX_ID]
Definition DataSpy.hh:85
key_t shmkey
Definition DataSpy.hh:81
int next_index[MAX_ID]
Definition DataSpy.hh:90
int verbose
Definition DataSpy.hh:93
unsigned long long current_age[MAX_ID]
Definition DataSpy.hh:91
unsigned long long buffer_age[MAX_BUFFERS]
Definition DataSpy.hh:57
unsigned long long buffer_currentage
Definition DataSpy.hh:56