WvStreams
wvmagiccircle.cc
1 /*
2  * Worldvisions Weaver Software:
3  * Copyright (C) 1997-2002 Net Integration Technologies, Inc.
4  *
5  * A circular queue that can be accessed across fork().
6  */
7 #include "wvmagiccircle.h"
8 #include <assert.h>
9 
10 
12  : shm(_size + 1 + 2*sizeof(int)),
13  head(((int*)shm.buf)[0]), tail(((int*)shm.buf)[1])
14 {
15  assert((int)_size > 0);
16 
17  head = tail = 0;
18  size = _size + 1; // a circular queue uses one extra byte
19  circle = shm.cbuf + 2*sizeof(int);
20 
21  if (shm.geterr())
22  seterr(shm);
23 }
24 
25 
26 WvMagicCircle::~WvMagicCircle()
27 {
28  // nothing special
29 }
30 
31 
32 size_t WvMagicCircle::used()
33 {
34  int x = tail - head;
35  if (x < 0)
36  x += size;
37  assert(x >= 0);
38  assert(x < size);
39 
40  return x;
41 }
42 
43 
44 size_t WvMagicCircle::put(const void *data, size_t len)
45 {
46  size_t max = left();
47  size_t chunk1;
48 
49  if (len > max)
50  len = max;
51 
52  chunk1 = size - tail;
53  if (len < chunk1)
54  chunk1 = len;
55 
56 #if 0
57  WvLog log("put", WvLog::Info);
58  log("put: head %s, tail %s, size %s, len %s, chunk1 %s\n",
59  head, tail, size, len, chunk1);
60 #endif
61 
62  memcpy(circle + tail, data, chunk1);
63  if (chunk1 < len)
64  memcpy(circle, (char *)data + chunk1, len - chunk1);
65 
66  tail = (tail + len) % size;
67 
68  return len;
69 }
70 
71 
72 size_t WvMagicCircle::get(void *data, size_t len)
73 {
74  size_t max = used();
75  size_t chunk1;
76 
77  if (len > max)
78  len = max;
79 
80  chunk1 = size - head;
81  if (chunk1 > len)
82  chunk1 = len;
83 
84  memcpy(data, circle + head, chunk1);
85  if (chunk1 < len)
86  memcpy((char *)data + chunk1, circle, len - chunk1);
87 
88  head = (head + len) % size;
89 
90  return len;
91 }
92 
93 
94 size_t WvMagicCircle::skip(size_t len)
95 {
96  size_t max = used();
97 
98  if (len > max)
99  len = max;
100 
101  head = (head + len) % size;
102 
103  return len;
104 }
WvErrorBase::geterr
virtual int geterr() const
If isok() is false, return the system error number corresponding to the error, -1 for a special error...
Definition: wverror.h:48
WvErrorBase::seterr
virtual void seterr(int _errnum)
Set the errnum variable – we have an error.
Definition: wverror.cc:144
WvLog
A WvLog stream accepts log messages from applications and forwards them to all registered WvLogRcv's.
Definition: wvlog.h:56
WvMagicCircle::WvMagicCircle
WvMagicCircle(size_t size)
Creates a shared memory circular queue.
Definition: wvmagiccircle.cc:11