@@ -276,9 +276,14 @@ class DoubleBufferedEPOutHandler : public EPHandler {
276
276
virtual ~DoubleBufferedEPOutHandler () {
277
277
}
278
278
279
- uint32_t _recv (uint32_t len )
279
+ uint32_t _recv ()
280
280
{
281
281
uint32_t i = 0 ;
282
+ uint32_t len = 0 ;
283
+
284
+ synchronized {
285
+ len = _rx_buffer.availableForStore ();
286
+ }
282
287
283
288
// R/W: current, first0/1, ready0/1, notify
284
289
// R : last0/1, data0/1
@@ -329,33 +334,32 @@ class DoubleBufferedEPOutHandler : public EPHandler {
329
334
}
330
335
331
336
virtual uint32_t recv (void *_data, uint32_t len) {
332
- _recv (_rx_buffer. availableForStore () );
337
+ _recv ();
333
338
uint32_t i = 0 ;
334
339
uint8_t *data = reinterpret_cast <uint8_t *>(_data);
335
- for (; i < len; i++) {
336
- if (! _rx_buffer.available ()) {
337
- break ;
340
+ synchronized {
341
+ for (; i < len && _rx_buffer.available (); i++ ) {
342
+ data[i] = _rx_buffer. read_char () ;
338
343
}
339
- data[i] = _rx_buffer.read_char ();
340
344
}
341
345
return i;
342
346
}
343
347
344
- virtual uint32_t _available () const {
345
- if (current == 0 ) {
346
- bool ready = false ;
347
- synchronized {
348
- ready = ready0;
349
- }
350
- return ready ? (last0 - first0) : 0 ;
351
- } else {
352
- bool ready = false ;
353
- synchronized {
354
- ready = ready1;
355
- }
356
- return ready ? (last1 - first1) : 0 ;
357
- }
358
- }
348
+ virtual uint32_t _available () const {
349
+ if (current == 0 ) {
350
+ bool ready = ready0 ;
351
+ synchronized {
352
+ ready = ready0;
353
+ }
354
+ return ready ? (last0 - first0) : 0 ;
355
+ } else {
356
+ bool ready = false ;
357
+ synchronized {
358
+ ready = ready1;
359
+ }
360
+ return ready ? (last1 - first1) : 0 ;
361
+ }
362
+ }
359
363
360
364
virtual void handleEndpoint ()
361
365
{
@@ -396,12 +400,12 @@ class DoubleBufferedEPOutHandler : public EPHandler {
396
400
397
401
// Returns how many bytes are stored in the buffers
398
402
virtual uint32_t available () {
399
- _recv (_rx_buffer. availableForStore () );
403
+ _recv ();
400
404
return _rx_buffer.available ();
401
405
}
402
406
403
407
virtual int peek () {
404
- _recv (_rx_buffer. availableForStore () );
408
+ _recv ();
405
409
return _rx_buffer.peek ();
406
410
}
407
411
@@ -415,7 +419,7 @@ class DoubleBufferedEPOutHandler : public EPHandler {
415
419
RingBuffer _rx_buffer;
416
420
417
421
const uint32_t ep;
418
- uint32_t current, incoming;
422
+ volatile uint32_t current, incoming;
419
423
420
424
__attribute__ ((__aligned__(4 ))) volatile uint8_t data0[size];
421
425
uint32_t first0;
0 commit comments