1 | //
|
---|
2 | // mstate.cc
|
---|
3 | //
|
---|
4 | // Copyright (C) 1996 Limit Point Systems, Inc.
|
---|
5 | //
|
---|
6 | // Author: Curtis Janssen <cljanss@limitpt.com>
|
---|
7 | // Maintainer: LPS
|
---|
8 | //
|
---|
9 | // This file is part of the SC Toolkit.
|
---|
10 | //
|
---|
11 | // The SC Toolkit is free software; you can redistribute it and/or modify
|
---|
12 | // it under the terms of the GNU Library General Public License as published by
|
---|
13 | // the Free Software Foundation; either version 2, or (at your option)
|
---|
14 | // any later version.
|
---|
15 | //
|
---|
16 | // The SC Toolkit is distributed in the hope that it will be useful,
|
---|
17 | // but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
18 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
19 | // GNU Library General Public License for more details.
|
---|
20 | //
|
---|
21 | // You should have received a copy of the GNU Library General Public License
|
---|
22 | // along with the SC Toolkit; see the file COPYING.LIB. If not, write to
|
---|
23 | // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
---|
24 | //
|
---|
25 | // The U.S. Government is granted a limited license as per AL 91-7.
|
---|
26 | //
|
---|
27 |
|
---|
28 | #ifdef __GNUC__
|
---|
29 | #pragma implementation
|
---|
30 | #endif
|
---|
31 |
|
---|
32 | #include <util/misc/bug.h>
|
---|
33 | #include <util/misc/formio.h>
|
---|
34 | #include <util/group/mstate.h>
|
---|
35 |
|
---|
36 | #include <util/state/translate.h>
|
---|
37 |
|
---|
38 | using namespace std;
|
---|
39 | using namespace sc;
|
---|
40 |
|
---|
41 | #define DEBUG 0
|
---|
42 |
|
---|
43 | // This sets up a communication buffer. It is made up of a of
|
---|
44 | // an integer that gives the number of bytes used in the buffer
|
---|
45 | // by the data region of size bufsize.
|
---|
46 | static
|
---|
47 | void
|
---|
48 | obtain_buffer(int*& nbuf_buffer, char*& send_buffer, int& nheader,
|
---|
49 | char*& buffer, int& bufsize, int size)
|
---|
50 | {
|
---|
51 | if (size == bufsize) return;
|
---|
52 | if (send_buffer) delete[] (int*) send_buffer;
|
---|
53 |
|
---|
54 | bufsize = size;
|
---|
55 |
|
---|
56 | int min_bytes_to_allocate = bufsize + sizeof(int);
|
---|
57 | int ints_to_allocate = min_bytes_to_allocate/sizeof(int);
|
---|
58 | if (min_bytes_to_allocate%sizeof(int)) ints_to_allocate++;
|
---|
59 |
|
---|
60 | nheader = sizeof(int);
|
---|
61 | int * isend_buffer = new int[ints_to_allocate];
|
---|
62 | send_buffer = (char*) isend_buffer;
|
---|
63 | buffer = (char*) & isend_buffer[1];
|
---|
64 | nbuf_buffer = isend_buffer;
|
---|
65 | }
|
---|
66 |
|
---|
67 | static
|
---|
68 | void
|
---|
69 | release_buffer(char* send_buffer)
|
---|
70 | {
|
---|
71 | if (send_buffer) delete[] (int*)send_buffer;
|
---|
72 | }
|
---|
73 |
|
---|
74 | ///////////////////////////////////////////////////////////////////////////
|
---|
75 | // MsgStateSend member functions
|
---|
76 |
|
---|
77 | MsgStateSend::MsgStateSend(const Ref<MessageGrp>&grp_):
|
---|
78 | grp(grp_)
|
---|
79 | {
|
---|
80 | nbuf = 0;
|
---|
81 | bufsize = 0;
|
---|
82 | send_buffer = 0;
|
---|
83 | node_to_node_ = 1;
|
---|
84 | obtain_buffer(nbuf_buffer,send_buffer,nheader,buffer,bufsize,8192);
|
---|
85 | }
|
---|
86 |
|
---|
87 | MsgStateSend::~MsgStateSend()
|
---|
88 | {
|
---|
89 | release_buffer(send_buffer);
|
---|
90 | }
|
---|
91 |
|
---|
92 | void
|
---|
93 | MsgStateSend::set_buffer_size(int size)
|
---|
94 | {
|
---|
95 | flush();
|
---|
96 | obtain_buffer(nbuf_buffer,send_buffer,nheader,buffer,bufsize,size);
|
---|
97 | }
|
---|
98 |
|
---|
99 | int
|
---|
100 | MsgStateSend::put_array_void(const void* vd, int n)
|
---|
101 | {
|
---|
102 | const char* d = (const char*) vd;
|
---|
103 | int remaining = n;
|
---|
104 |
|
---|
105 | while (remaining) {
|
---|
106 | if (nbuf == bufsize) flush();
|
---|
107 | int ncurrent;
|
---|
108 | if (bufsize - nbuf < remaining) {
|
---|
109 | ncurrent = bufsize - nbuf;
|
---|
110 | }
|
---|
111 | else {
|
---|
112 | ncurrent = remaining;
|
---|
113 | }
|
---|
114 | memcpy(&buffer[nbuf],d,ncurrent);
|
---|
115 | remaining -= ncurrent;
|
---|
116 | nbuf += ncurrent;
|
---|
117 | d = &d[ncurrent];
|
---|
118 | }
|
---|
119 | return n;
|
---|
120 | }
|
---|
121 |
|
---|
122 | int
|
---|
123 | MsgStateSend::put(const ClassDesc*cd)
|
---|
124 | {
|
---|
125 | int index = grp->classdesc_to_index(cd);
|
---|
126 | return StateOut::put(index);
|
---|
127 | }
|
---|
128 |
|
---|
129 | int
|
---|
130 | MsgStateSend::put(char d)
|
---|
131 | {
|
---|
132 | return StateOut::put(d);
|
---|
133 | }
|
---|
134 |
|
---|
135 | int
|
---|
136 | MsgStateSend::put(unsigned int d)
|
---|
137 | {
|
---|
138 | return StateOut::put(d);
|
---|
139 | }
|
---|
140 |
|
---|
141 | int
|
---|
142 | MsgStateSend::put(int d)
|
---|
143 | {
|
---|
144 | return StateOut::put(d);
|
---|
145 | }
|
---|
146 |
|
---|
147 | int
|
---|
148 | MsgStateSend::put(float d)
|
---|
149 | {
|
---|
150 | return StateOut::put(d);
|
---|
151 | }
|
---|
152 |
|
---|
153 |
|
---|
154 | int
|
---|
155 | MsgStateSend::put(double d)
|
---|
156 | {
|
---|
157 | return StateOut::put(d);
|
---|
158 | }
|
---|
159 |
|
---|
160 | int
|
---|
161 | MsgStateSend::put(const char* d, int n)
|
---|
162 | {
|
---|
163 | return StateOut::put(d, n);
|
---|
164 | }
|
---|
165 |
|
---|
166 | int
|
---|
167 | MsgStateSend::put(const unsigned int* d, int n)
|
---|
168 | {
|
---|
169 | return StateOut::put(d, n);
|
---|
170 | }
|
---|
171 |
|
---|
172 | int
|
---|
173 | MsgStateSend::put(const int* d, int n)
|
---|
174 | {
|
---|
175 | return StateOut::put(d, n);
|
---|
176 | }
|
---|
177 |
|
---|
178 | int
|
---|
179 | MsgStateSend::put(const float* d, int n)
|
---|
180 | {
|
---|
181 | return StateOut::put(d, n);
|
---|
182 | }
|
---|
183 |
|
---|
184 | int
|
---|
185 | MsgStateSend::put(const double* d, int n)
|
---|
186 | {
|
---|
187 | return StateOut::put(d, n);
|
---|
188 | }
|
---|
189 |
|
---|
190 | ///////////////////////////////////////////////////////////////////////////
|
---|
191 | // MsgStateBufRecv member functions
|
---|
192 |
|
---|
193 | static ClassDesc MsgStateBufRecv_cd(
|
---|
194 | typeid(MsgStateBufRecv),"MsgStateBufRecv",1,"public StateIn",
|
---|
195 | 0, 0, 0);
|
---|
196 |
|
---|
197 | MsgStateBufRecv::MsgStateBufRecv()
|
---|
198 | {
|
---|
199 | grp = MessageGrp::get_default_messagegrp();
|
---|
200 | nbuf = 0;
|
---|
201 | ibuf = 0;
|
---|
202 | send_buffer = 0;
|
---|
203 | bufsize = 0;
|
---|
204 | obtain_buffer(nbuf_buffer,send_buffer,nheader,buffer,bufsize,8192);
|
---|
205 | }
|
---|
206 |
|
---|
207 | MsgStateBufRecv::MsgStateBufRecv(const Ref<MessageGrp>&grp_):
|
---|
208 | grp(grp_)
|
---|
209 | {
|
---|
210 | nbuf = 0;
|
---|
211 | ibuf = 0;
|
---|
212 | send_buffer = 0;
|
---|
213 | bufsize = 0;
|
---|
214 | obtain_buffer(nbuf_buffer,send_buffer,nheader,buffer,bufsize,8192);
|
---|
215 | }
|
---|
216 |
|
---|
217 | MsgStateBufRecv::~MsgStateBufRecv()
|
---|
218 | {
|
---|
219 | if (ibuf && (nbuf != ibuf)) {
|
---|
220 | ExEnv::errn() << scprintf("MsgStateBufRecv::~MsgStateBufRecv(): buffer still has"
|
---|
221 | " %d bytes of data on %d\n", nbuf - ibuf, grp->me());
|
---|
222 | }
|
---|
223 | release_buffer(send_buffer);
|
---|
224 | }
|
---|
225 |
|
---|
226 | void
|
---|
227 | MsgStateBufRecv::set_buffer_size(int size)
|
---|
228 | {
|
---|
229 | if (ibuf && (nbuf != ibuf)) {
|
---|
230 | ExEnv::errn() << "MsgStateBufRecv::set_buffer_size(): old buffer has data"
|
---|
231 | << endl;
|
---|
232 | }
|
---|
233 | obtain_buffer(nbuf_buffer, send_buffer, nheader, buffer, bufsize, size);
|
---|
234 | }
|
---|
235 |
|
---|
236 | int
|
---|
237 | MsgStateBufRecv::get_array_void(void* vd, int n)
|
---|
238 | {
|
---|
239 | char* d = (char*) vd;
|
---|
240 |
|
---|
241 | int remaining = n;
|
---|
242 |
|
---|
243 | while (remaining) {
|
---|
244 | if (ibuf == nbuf) next_buffer();
|
---|
245 | int ncurrent;
|
---|
246 | if (nbuf - ibuf < remaining) {
|
---|
247 | ncurrent = nbuf - ibuf;
|
---|
248 | }
|
---|
249 | else {
|
---|
250 | ncurrent = remaining;
|
---|
251 | }
|
---|
252 | memcpy(d,&buffer[ibuf],ncurrent);
|
---|
253 | remaining -= ncurrent;
|
---|
254 | ibuf += ncurrent;
|
---|
255 | d = &d[ncurrent];
|
---|
256 | }
|
---|
257 |
|
---|
258 | return n;
|
---|
259 | }
|
---|
260 |
|
---|
261 | ///////////////////////////////////////////////////////////////////////////
|
---|
262 | // MsgStateRecv member functions
|
---|
263 |
|
---|
264 | MsgStateRecv::MsgStateRecv(const Ref<MessageGrp>&grp_):
|
---|
265 | MsgStateBufRecv(grp_)
|
---|
266 | {
|
---|
267 | node_to_node_ = 1;
|
---|
268 | }
|
---|
269 |
|
---|
270 | MsgStateRecv::~MsgStateRecv()
|
---|
271 | {
|
---|
272 | }
|
---|
273 |
|
---|
274 | int
|
---|
275 | MsgStateRecv::version(const ClassDesc* cd)
|
---|
276 | {
|
---|
277 | if (!cd) return -1;
|
---|
278 | return cd->version();
|
---|
279 | }
|
---|
280 |
|
---|
281 | int
|
---|
282 | MsgStateRecv::get(const ClassDesc**cd)
|
---|
283 | {
|
---|
284 | int index;
|
---|
285 | int r = StateIn::get(index);
|
---|
286 | *cd = grp->index_to_classdesc(index);
|
---|
287 | if (!*cd) {
|
---|
288 | ExEnv::errn() << "MsgStateRecvt::get(const ClassDesc**cd): "
|
---|
289 | << "class not available on this processor:"
|
---|
290 | << endl;
|
---|
291 | ExEnv::errn() << " index = " << index << endl;
|
---|
292 | abort();
|
---|
293 | }
|
---|
294 | return r;
|
---|
295 | }
|
---|
296 |
|
---|
297 | int
|
---|
298 | MsgStateRecv::get(char& d, const char *key)
|
---|
299 | {
|
---|
300 | return StateIn::get(d,key);
|
---|
301 | }
|
---|
302 |
|
---|
303 | int
|
---|
304 | MsgStateRecv::get(int& d, const char *key)
|
---|
305 | {
|
---|
306 | return StateIn::get(d,key);
|
---|
307 | }
|
---|
308 |
|
---|
309 | int
|
---|
310 | MsgStateRecv::get(unsigned int& d, const char *key)
|
---|
311 | {
|
---|
312 | return StateIn::get(d,key);
|
---|
313 | }
|
---|
314 |
|
---|
315 | int
|
---|
316 | MsgStateRecv::get(float& d, const char *key)
|
---|
317 | {
|
---|
318 | return StateIn::get(d,key);
|
---|
319 | }
|
---|
320 |
|
---|
321 | int
|
---|
322 | MsgStateRecv::get(double& d, const char *key)
|
---|
323 | {
|
---|
324 | return StateIn::get(d,key);
|
---|
325 | }
|
---|
326 |
|
---|
327 | int
|
---|
328 | MsgStateRecv::get(char*& d)
|
---|
329 | {
|
---|
330 | return StateIn::get(d);
|
---|
331 | }
|
---|
332 |
|
---|
333 | int
|
---|
334 | MsgStateRecv::get(unsigned int*& d)
|
---|
335 | {
|
---|
336 | return StateIn::get(d);
|
---|
337 | }
|
---|
338 |
|
---|
339 | int
|
---|
340 | MsgStateRecv::get(int*& d)
|
---|
341 | {
|
---|
342 | return StateIn::get(d);
|
---|
343 | }
|
---|
344 |
|
---|
345 | int
|
---|
346 | MsgStateRecv::get(float*& d)
|
---|
347 | {
|
---|
348 | return StateIn::get(d);
|
---|
349 | }
|
---|
350 |
|
---|
351 | int
|
---|
352 | MsgStateRecv::get(double*& d)
|
---|
353 | {
|
---|
354 | return StateIn::get(d);
|
---|
355 | }
|
---|
356 |
|
---|
357 | ///////////////////////////////////////////////////////////////////////////
|
---|
358 | // StateSend member functions
|
---|
359 |
|
---|
360 | StateSend::StateSend(const Ref<MessageGrp>&grp_):
|
---|
361 | MsgStateSend(grp_),
|
---|
362 | target_(0)
|
---|
363 | {
|
---|
364 | }
|
---|
365 |
|
---|
366 | StateSend::~StateSend()
|
---|
367 | {
|
---|
368 | flush();
|
---|
369 | }
|
---|
370 |
|
---|
371 | void
|
---|
372 | StateSend::flush()
|
---|
373 | {
|
---|
374 | if (nbuf == 0) return;
|
---|
375 | *nbuf_buffer = nbuf;
|
---|
376 | translate_->translator()->to_external(nbuf_buffer,1);
|
---|
377 | grp->raw_send(target_, send_buffer, nbuf + nheader);
|
---|
378 | nbuf = 0;
|
---|
379 | }
|
---|
380 |
|
---|
381 | void
|
---|
382 | StateSend::target(int t)
|
---|
383 | {
|
---|
384 | target_ = t;
|
---|
385 | ps_.clear();
|
---|
386 | }
|
---|
387 |
|
---|
388 | ///////////////////////////////////////////////////////////////////////////
|
---|
389 | // StateRecv member functions
|
---|
390 |
|
---|
391 | StateRecv::StateRecv(const Ref<MessageGrp>&grp_):
|
---|
392 | MsgStateRecv(grp_),
|
---|
393 | source_(0)
|
---|
394 | {
|
---|
395 | }
|
---|
396 |
|
---|
397 | void
|
---|
398 | StateRecv::next_buffer()
|
---|
399 | {
|
---|
400 | grp->raw_recv(source_, send_buffer, bufsize+nheader);
|
---|
401 | translate_->translator()->to_native(nbuf_buffer,1);
|
---|
402 | nbuf = *nbuf_buffer;
|
---|
403 | ibuf = 0;
|
---|
404 | }
|
---|
405 |
|
---|
406 | void
|
---|
407 | StateRecv::source(int s)
|
---|
408 | {
|
---|
409 | source_ = s;
|
---|
410 | ps_.clear();
|
---|
411 | }
|
---|
412 |
|
---|
413 | ///////////////////////////////////////////////////////////////////////////
|
---|
414 | // BcastStateSend member functions
|
---|
415 |
|
---|
416 | BcastStateSend::BcastStateSend(const Ref<MessageGrp>&grp_):
|
---|
417 | MsgStateSend(grp_)
|
---|
418 | {
|
---|
419 | }
|
---|
420 |
|
---|
421 | BcastStateSend::~BcastStateSend()
|
---|
422 | {
|
---|
423 | flush();
|
---|
424 | }
|
---|
425 |
|
---|
426 | void
|
---|
427 | BcastStateSend::flush()
|
---|
428 | {
|
---|
429 | if (nbuf == 0) return;
|
---|
430 | *nbuf_buffer = nbuf;
|
---|
431 | translate_->translator()->to_external(nbuf_buffer,1);
|
---|
432 | grp->raw_bcast(send_buffer, nbuf + nheader, grp->me());
|
---|
433 | nbuf = 0;
|
---|
434 | }
|
---|
435 |
|
---|
436 | ///////////////////////////////////////////////////////////////////////////
|
---|
437 | // BcastStateRecv member functions
|
---|
438 |
|
---|
439 | BcastStateRecv::BcastStateRecv(const Ref<MessageGrp>&grp_, int s):
|
---|
440 | MsgStateRecv(grp_)
|
---|
441 | {
|
---|
442 | source(s);
|
---|
443 | }
|
---|
444 |
|
---|
445 | void
|
---|
446 | BcastStateRecv::source(int s)
|
---|
447 | {
|
---|
448 | if (s == grp->me()) {
|
---|
449 | ExEnv::errn() << scprintf("BcastStateRecv::source(%d): cannot receive my own"
|
---|
450 | " broadcast\n", s);
|
---|
451 | abort();
|
---|
452 | }
|
---|
453 | source_ = s;
|
---|
454 | ps_.clear();
|
---|
455 | }
|
---|
456 |
|
---|
457 | void
|
---|
458 | BcastStateRecv::next_buffer()
|
---|
459 | {
|
---|
460 | grp->raw_bcast(send_buffer, bufsize+nheader, source_);
|
---|
461 | translate_->translator()->to_native(nbuf_buffer,1);
|
---|
462 | nbuf = *nbuf_buffer;
|
---|
463 | ibuf = 0;
|
---|
464 | }
|
---|
465 |
|
---|
466 | ///////////////////////////////////////////////////////////////////////////
|
---|
467 | // BcastState member functions
|
---|
468 |
|
---|
469 | BcastState::BcastState(const Ref<MessageGrp> &grp, int source)
|
---|
470 | {
|
---|
471 | if (grp->n() == 1) {
|
---|
472 | recv_ = 0;
|
---|
473 | send_ = 0;
|
---|
474 | }
|
---|
475 | else if (grp->me() == source) {
|
---|
476 | recv_ = 0;
|
---|
477 | send_ = new BcastStateSend(grp);
|
---|
478 | }
|
---|
479 | else {
|
---|
480 | recv_ = new BcastStateRecv(grp,source);
|
---|
481 | send_ = 0;
|
---|
482 | }
|
---|
483 | }
|
---|
484 |
|
---|
485 | BcastState::~BcastState()
|
---|
486 | {
|
---|
487 | delete recv_;
|
---|
488 | delete send_;
|
---|
489 | }
|
---|
490 |
|
---|
491 | void
|
---|
492 | BcastState::bcast(int &a)
|
---|
493 | {
|
---|
494 | if (recv_) recv_->get(a);
|
---|
495 | else if (send_) send_->put(a);
|
---|
496 | }
|
---|
497 |
|
---|
498 | void
|
---|
499 | BcastState::bcast(double &a)
|
---|
500 | {
|
---|
501 | if (recv_) recv_->get(a);
|
---|
502 | else if (send_) send_->put(a);
|
---|
503 | }
|
---|
504 |
|
---|
505 | void
|
---|
506 | BcastState::bcast(int *&a, int n)
|
---|
507 | {
|
---|
508 | if (recv_) recv_->get(a);
|
---|
509 | else if (send_) send_->put(a,n);
|
---|
510 | }
|
---|
511 |
|
---|
512 | void
|
---|
513 | BcastState::bcast(double *&a, int n)
|
---|
514 | {
|
---|
515 | if (recv_) recv_->get(a);
|
---|
516 | else if (send_) send_->put(a,n);
|
---|
517 | }
|
---|
518 |
|
---|
519 | void
|
---|
520 | BcastState::flush()
|
---|
521 | {
|
---|
522 | if (send_) send_->flush();
|
---|
523 | }
|
---|
524 |
|
---|
525 | void
|
---|
526 | BcastState::set_buffer_size(int n)
|
---|
527 | {
|
---|
528 | if (send_) send_->set_buffer_size(n);
|
---|
529 | if (recv_) recv_->set_buffer_size(n);
|
---|
530 | }
|
---|
531 |
|
---|
532 | void
|
---|
533 | BcastState::forget_references()
|
---|
534 | {
|
---|
535 | if (send_) send_->forget_references();
|
---|
536 | }
|
---|
537 |
|
---|
538 | ///////////////////////////////////////////////////////////////////////////
|
---|
539 | // BcastStateRecv member functions
|
---|
540 |
|
---|
541 | static ClassDesc BcastStateInBin_cd(
|
---|
542 | typeid(BcastStateInBin),"BcastStateInBin",1,"public MsgStateBufRecv",
|
---|
543 | 0, create<BcastStateInBin>, 0);
|
---|
544 |
|
---|
545 | BcastStateInBin::BcastStateInBin(const Ref<MessageGrp>&grp_,
|
---|
546 | const char *filename):
|
---|
547 | MsgStateBufRecv(grp_)
|
---|
548 | {
|
---|
549 | opened_ = 0;
|
---|
550 | open(filename);
|
---|
551 | }
|
---|
552 |
|
---|
553 | BcastStateInBin::BcastStateInBin(const Ref<KeyVal> &keyval)
|
---|
554 | {
|
---|
555 | char *path = keyval->pcharvalue("file");
|
---|
556 | if (!path) {
|
---|
557 | ExEnv::errn() << "StateInBin(const Ref<KeyVal>&): no path given" << endl;
|
---|
558 | }
|
---|
559 | opened_ = 0;
|
---|
560 | open(path);
|
---|
561 | delete[] path;
|
---|
562 | }
|
---|
563 |
|
---|
564 | BcastStateInBin::~BcastStateInBin()
|
---|
565 | {
|
---|
566 | close();
|
---|
567 | }
|
---|
568 |
|
---|
569 | void
|
---|
570 | BcastStateInBin::next_buffer()
|
---|
571 | {
|
---|
572 | if (grp->me() == 0) {
|
---|
573 | // fill the buffer
|
---|
574 | #if HAVE_SGETN
|
---|
575 | *nbuf_buffer = buf_->sgetn(buffer,bufsize);
|
---|
576 | #else
|
---|
577 | *nbuf_buffer = buf_->xsgetn(buffer,bufsize);
|
---|
578 | #endif
|
---|
579 | if (*nbuf_buffer == 0) {
|
---|
580 | ExEnv::errn() << "BcastStateInBin: read failed" << endl;
|
---|
581 | abort();
|
---|
582 | }
|
---|
583 | translate_->translator()->to_external(nbuf_buffer,1);
|
---|
584 | }
|
---|
585 | grp->raw_bcast(send_buffer, bufsize+nheader);
|
---|
586 | translate_->translator()->to_native(nbuf_buffer,1);
|
---|
587 | nbuf = *nbuf_buffer;
|
---|
588 | ibuf = 0;
|
---|
589 | }
|
---|
590 |
|
---|
591 | void
|
---|
592 | BcastStateInBin::close()
|
---|
593 | {
|
---|
594 | if(opened_) delete buf_;
|
---|
595 | opened_=0; buf_=0;
|
---|
596 | nbuf = 0;
|
---|
597 | ibuf = 0;
|
---|
598 |
|
---|
599 | classidmap_.clear();
|
---|
600 | nextclassid_ = 0;
|
---|
601 | classdatamap_.clear();
|
---|
602 | ps_.clear();
|
---|
603 | }
|
---|
604 |
|
---|
605 | int
|
---|
606 | BcastStateInBin::open(const char *path)
|
---|
607 | {
|
---|
608 | file_position_ = 0;
|
---|
609 |
|
---|
610 | if (grp->me() == 0) {
|
---|
611 | if (opened_) close();
|
---|
612 |
|
---|
613 | filebuf *fbuf = new filebuf();
|
---|
614 | fbuf->open(path, ios::in);
|
---|
615 | if (!fbuf->is_open()) {
|
---|
616 | ExEnv::errn() << "ERROR: BcastStateInBin: problems opening " << path << endl;
|
---|
617 | abort();
|
---|
618 | }
|
---|
619 | buf_ = fbuf;
|
---|
620 | opened_ = 1;
|
---|
621 | }
|
---|
622 |
|
---|
623 | nbuf = 0;
|
---|
624 | ibuf = 0;
|
---|
625 |
|
---|
626 | get_header();
|
---|
627 | find_and_get_directory();
|
---|
628 |
|
---|
629 | return 0;
|
---|
630 | }
|
---|
631 |
|
---|
632 | int
|
---|
633 | BcastStateInBin::tell()
|
---|
634 | {
|
---|
635 | return file_position_;
|
---|
636 | }
|
---|
637 |
|
---|
638 | void
|
---|
639 | BcastStateInBin::seek(int loc)
|
---|
640 | {
|
---|
641 | file_position_ = loc;
|
---|
642 | #if defined(HAVE_PUBSEEKOFF)
|
---|
643 | if (grp->me() == 0) {
|
---|
644 | buf_->pubseekoff(loc,ios::beg,ios::in);
|
---|
645 | # if DEBUG
|
---|
646 | ExEnv::outn() << "pubseekoff to " << loc << endl;
|
---|
647 | # endif
|
---|
648 | }
|
---|
649 | #elif defined(HAVE_SEEKOFF)
|
---|
650 | if (grp->me() == 0) {
|
---|
651 | buf_->seekoff(loc,ios::beg,ios::in);
|
---|
652 | # if DEBUG
|
---|
653 | ExEnv::outn() << "seekoff to " << loc << endl;
|
---|
654 | # endif
|
---|
655 | }
|
---|
656 | #endif
|
---|
657 | nbuf = 0;
|
---|
658 | ibuf = 0;
|
---|
659 | }
|
---|
660 |
|
---|
661 | int
|
---|
662 | BcastStateInBin::seekable()
|
---|
663 | {
|
---|
664 | #if defined(HAVE_PUBSEEKOFF) || defined(HAVE_SEEKOFF)
|
---|
665 | return 1;
|
---|
666 | #else
|
---|
667 | return 0;
|
---|
668 | #endif
|
---|
669 | }
|
---|
670 |
|
---|
671 | int
|
---|
672 | BcastStateInBin::use_directory()
|
---|
673 | {
|
---|
674 | return seekable();
|
---|
675 | }
|
---|
676 |
|
---|
677 | int
|
---|
678 | BcastStateInBin::get_array_void(void* vd, int n)
|
---|
679 | {
|
---|
680 | MsgStateBufRecv::get_array_void(vd, n);
|
---|
681 | file_position_ += n;
|
---|
682 | #if DEBUG
|
---|
683 | ExEnv::outn() << "Read " << n << " bytes:";
|
---|
684 | for (int i=0; i<n; i++) {
|
---|
685 | ExEnv::outn() << " " << (int) ((unsigned char*)vd)[i];
|
---|
686 | }
|
---|
687 | ExEnv::outn() << endl;
|
---|
688 | #endif
|
---|
689 | return n;
|
---|
690 | }
|
---|
691 |
|
---|
692 | /////////////////////////////////////////////////////////////////////////////
|
---|
693 |
|
---|
694 | // Local Variables:
|
---|
695 | // mode: c++
|
---|
696 | // c-file-style: "CLJ"
|
---|
697 | // End:
|
---|