LMMS
Loading...
Searching...
No Matches
thread-link.cpp
Go to the documentation of this file.
1#include "../thread-link.h"
2
3namespace rtosc {
4#ifdef off_t
5#undef off_t
6#endif
7#define off_t signed long
8
9
10//Ringbuffer internal structure
11//XXX possible undefined behavior depending on future semantics of volatile
13 char *buffer;
14 volatile off_t write;
15 volatile off_t read;
16 size_t size;
17};
18
20
21static size_t ring_read_size(ringbuffer_t *ring)
22{
23 const size_t w = ring->write;
24 const size_t r = ring->read;
25
26 return (w-r+ring->size) % ring->size;
27}
28static size_t ring_write_size(ringbuffer_t *ring)
29{
30 //leave one forbidden element
31 const size_t w = ring->write;
32 const size_t r = ring->read;
33 if(r == w)
34 return ring->size - 1;
35 return ((r - w + ring->size) % ring->size) - 1;
36}
37static void ring_write(ringbuffer_t *ring, const char *data, size_t len)
38{
39 assert(ring_write_size(ring) >= len);
40 const off_t next_write = (ring->write + len)%ring->size;
41
42 //discontinuous write
43 if(next_write < ring->write) {
44 const size_t w1 = ring->size - ring->write - 1;
45 const size_t w2 = len - w1;
46 memcpy(ring->buffer+ring->write, data, w1);
47 memcpy(ring->buffer, data+w1, w2);
48 } else { //contiguous
49 memcpy(ring->buffer+ring->write, data, len);
50 }
51 ring->write = next_write;
52}
53static void ring_read(ringbuffer_t *ring, char *data, size_t len)
54{
55 assert(ring_read_size(ring) >= len);
56 const off_t next_read = (ring->read + len)%ring->size;
57
58 //discontinuous read
59 if(next_read < ring->read) {
60 const size_t r1 = ring->size - ring->read - 1;
61 const size_t r2 = len - r1;
62 memcpy(data, ring->buffer+ring->read, r1);
63 memcpy(data+r1, ring->buffer, r2);
64 } else { //contiguous
65 memcpy(data, ring->buffer+ring->read, len);
66 }
67 ring->read = next_read;
68}
70{
71 assert(r);
72 size_t read_size = ring_read_size(ring);
73 off_t read = ring->read;
74 r[0].data = ring->buffer+ring->read;
75 if(read_size+read > ring->size) { //discontinuous
76 size_t r2 = (read_size+1+read)%ring->size;
77 size_t r1 = read_size - r2;
78 r[0].len = r1;
79 r[1].data = ring->buffer;
80 r[1].len = r2;
81 } else {
82 r[0].len = read_size;
83 r[1].data = NULL;
84 r[1].len = 0;
85 }
86}
87
88ThreadLink::ThreadLink(size_t max_message_length, size_t max_messages)
89 :MaxMsg(max_message_length),
90 BufferSize(MaxMsg*max_messages),
91 write_buffer(new char[MaxMsg]),
92 read_buffer(new char[MaxMsg]),
94{
95 ring->buffer = new char[BufferSize];
96 ring->size = BufferSize;
97 ring->read = 0;
98 ring->write = 0;
99 memset(write_buffer, 0, MaxMsg);
100 memset(read_buffer, 0, MaxMsg);
101}
102
104{
105 delete[] ring->buffer;
106 delete ring;
107 delete[] write_buffer;
108 delete[] read_buffer;
109}
110
111void ThreadLink::write(const char *dest, const char *args, ...)
112{
113 va_list va;
114 va_start(va,args);
115 const size_t len =
116 rtosc_vmessage(write_buffer,MaxMsg,dest,args,va);
117 va_end(va);
118 if(ring_write_size(ring) >= len)
120}
121
122void ThreadLink::writeArray(const char *dest, const char *args, const rtosc_arg_t *aargs)
123{
124 const size_t len =
125 rtosc_amessage(write_buffer, MaxMsg, dest, args, aargs);
126 if(ring_write_size(ring) >= len)
128}
129
133void ThreadLink::raw_write(const char *msg)
134{
135 const size_t len = rtosc_message_length(msg, -1);//assumed valid
136 if(ring_write_size(ring) >= len)
137 ring_write(ring,msg,len);
138}
139
143bool ThreadLink::hasNext(void) const
144{
145 return ring_read_size(ring);
146}
147
152 ring_t r[2];
154 const size_t len =
156 assert(ring_read_size(ring) >= len);
157 assert(len <= MaxMsg);
159 return read_buffer;
160}
161
166{
167 return read_buffer;
168}
169
173char *ThreadLink::buffer(void) {return write_buffer;}
177size_t ThreadLink::buffer_size(void) const {return BufferSize;}
178
179};
#define NULL
Definition CarlaBridgeFormat.cpp:30
assert(0)
UINT_D64 w
Definition inflate.c:942
static void r2(register WDL_FFT_REAL *a)
Definition fft.c:1089
JSAMPIMAGE data
Definition jpeglib.h:945
const char * msg
Definition missing_descriptor.c:20
Definition globals.h:37
const char * msg_t
Definition ports.h:48
internal_ringbuffer_t ringbuffer_t
Definition thread-link.cpp:19
static size_t ring_write_size(ringbuffer_t *ring)
Definition thread-link.cpp:28
static void ring_read(ringbuffer_t *ring, char *data, size_t len)
Definition thread-link.cpp:53
static void ring_read_vector(ringbuffer_t *ring, ring_t *r)
Definition thread-link.cpp:69
static void ring_write(ringbuffer_t *ring, const char *data, size_t len)
Definition thread-link.cpp:37
static size_t ring_read_size(ringbuffer_t *ring)
Definition thread-link.cpp:21
size_t rtosc_message_length(const char *msg, size_t len)
Definition rtosc.c:848
size_t rtosc_vmessage(char *buffer, size_t len, const char *address, const char *arguments, va_list ap)
Definition rtosc.c:497
size_t rtosc_amessage(char *buffer, size_t len, const char *address, const char *arguments, const rtosc_arg_t *args)
Definition rtosc.c:515
size_t rtosc_message_ring_length(ring_t *ring)
Definition rtosc.c:762
Definition rtosc.h:229
Definition thread-link.cpp:12
volatile off_t read
Definition thread-link.cpp:15
size_t size
Definition thread-link.cpp:16
char * buffer
Definition thread-link.cpp:13
volatile off_t write
Definition thread-link.cpp:14
Definition rtosc.h:46
memcpy(hh, h, RAND_HEAD_LEN)
int r
Definition crypt.c:458
read(f, &c, 1)