@@ -253,17 +253,23 @@ class DoubleBufferedEPOutHandler : public EPHandler {
253
253
release ();
254
254
}
255
255
256
- // Read one byte from the buffer, if the buffer is empty -1 is returned
257
- int read () {
256
+ virtual uint32_t recv (void *_data, uint32_t len)
257
+ {
258
+ uint8_t *data = reinterpret_cast <uint8_t *>(_data);
259
+
258
260
// R/W: current, first0/1, ready0/1, notify
259
261
// R : last0/1, data0/1
260
262
if (current == 0 ) {
261
263
synchronized {
262
264
if (!ready0) {
263
- return - 1 ;
265
+ return 0 ;
264
266
}
265
267
}
266
268
// when ready0==true the buffer is not being filled and last0 is constant
269
+ uint32_t i;
270
+ for (i=0 ; i<len && first0 < last0; i++) {
271
+ data[i] = data0[first0++];
272
+ }
267
273
if (first0 == last0) {
268
274
first0 = 0 ;
269
275
current = 1 ;
@@ -274,16 +280,19 @@ class DoubleBufferedEPOutHandler : public EPHandler {
274
280
release ();
275
281
}
276
282
}
277
- return -1 ;
278
283
}
279
- return data0[first0++] ;
284
+ return i ;
280
285
} else {
281
286
synchronized {
282
287
if (!ready1) {
283
- return - 1 ;
288
+ return 0 ;
284
289
}
285
290
}
286
291
// when ready1==true the buffer is not being filled and last1 is constant
292
+ uint32_t i;
293
+ for (i=0 ; i<len && first1 < last1; i++) {
294
+ data[i] = data1[first1++];
295
+ }
287
296
if (first1 == last1) {
288
297
first1 = 0 ;
289
298
current = 0 ;
@@ -294,9 +303,8 @@ class DoubleBufferedEPOutHandler : public EPHandler {
294
303
release ();
295
304
}
296
305
}
297
- return -1 ;
298
306
}
299
- return data1[first1++] ;
307
+ return i ;
300
308
}
301
309
}
302
310
@@ -340,19 +348,6 @@ class DoubleBufferedEPOutHandler : public EPHandler {
340
348
}
341
349
}
342
350
343
- virtual uint32_t recv (void *_data, uint32_t len)
344
- {
345
- // TODO Write an optimized version of this one
346
- uint8_t *data = reinterpret_cast <uint8_t *>(_data);
347
- uint32_t i;
348
- for (i=0 ; i<len; i++) {
349
- int c = read ();
350
- if (c == -1 ) break ;
351
- data[i] = c;
352
- }
353
- return i;
354
- }
355
-
356
351
// Returns how many bytes are stored in the buffers
357
352
virtual uint32_t available () const {
358
353
return (last0 - first0) + (last1 - first1);
0 commit comments