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
26WvMagicCircle::~WvMagicCircle()
27{
28 // nothing special
29}
30
31
32size_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
44size_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
72size_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
94size_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}
virtual void seterr(int _errnum)
Set the errnum variable – we have an error.
Definition: wverror.cc:144
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
A WvLog stream accepts log messages from applications and forwards them to all registered WvLogRcv's.
Definition: wvlog.h:57
WvMagicCircle(size_t size)
Creates a shared memory circular queue.