@@ -570,12 +570,25 @@ void CALLED_FROM_INTERRUPT jshPushIOEvent(
570570 jshPushEvent (channel , (uint8_t * )& t , 4 );
571571}
572572
573+ /// Debugging only - prints the IO buffer, one item per line
574+ void jshDumpIOEvents () {
575+ for (int i = ioTail ;;i ++ ) {
576+ const char * name = "" ;
577+ if (i == ioHead ) name = (i == ioLastHead ) ? "ioHead + ioLastHead" : "ioHead" ;
578+ else if (i == ioLastHead ) name = "ioLastHead" ;
579+ if (i == ioTail ) name = "ioTail" ;
580+ jsiConsolePrintf ("%d: %d %s\n" , i , ioBuffer [i ], name );
581+ if (i == ioHead ) break ;
582+ }
583+ }
584+
573585// pop an IO event, returns EV_NONE on failure
574586IOEventFlags jshPopIOEvent (uint8_t * data , unsigned int * length ) {
575587 if (ioHead == ioTail ) return EV_NONE ;
576588 if (ioLastHead == ioTail ) ioLastHead = ioHead ; // if we're processing last head now, reset it
577589 IOBufferIdx idx = ioTail ;
578590 unsigned int len = (unsigned int )ioBuffer [idx ];
591+ assert (len <= IOEVENT_MAX_LEN );
579592 idx = (IOBufferIdx )((idx + 1 ) & IOBUFFERMASK );
580593 IOEventFlags evt = (IOEventFlags )ioBuffer [idx ];
581594 idx = (IOBufferIdx )((idx + 1 ) & IOBUFFERMASK );
@@ -594,6 +607,7 @@ IOEventFlags jshPopIOEventOfType(IOEventFlags eventType, uint8_t *data, unsigned
594607 IOBufferIdx i = ioTail ;
595608 while (ioHead != i ) {
596609 uint32_t len = (uint32_t )ioBuffer [i ];
610+ assert (len <= IOEVENT_MAX_LEN );
597611 IOBufferIdx j = (IOBufferIdx )((i + 1 ) & IOBUFFERMASK );
598612 IOEventFlags evt = (IOEventFlags )ioBuffer [j ];
599613 if (IOEVENTFLAGS_GETTYPE (evt ) == eventType ) {
@@ -608,19 +622,23 @@ IOEventFlags jshPopIOEventOfType(IOEventFlags eventType, uint8_t *data, unsigned
608622 if (data ) data [n ] = ioBuffer [j ];
609623 j = (IOBufferIdx )((j + 1 ) & IOBUFFERMASK );
610624 }
611- // work backwards and shift all items in queue down
612- IOBufferIdx dst = (IOBufferIdx )((i + len + 1 ) & IOBUFFERMASK ); // to: last element of this event
613- IOBufferIdx src = (IOBufferIdx )((i + IOBUFFERMASK ) & IOBUFFERMASK ); // from: item before current
614- while (true) {
615- ioBuffer [dst ] = ioBuffer [src ];
616- if (src == ioTail )
617- break ;
618- // move backwards
619- src = (IOBufferIdx )((src + IOBUFFERMASK ) & IOBUFFERMASK );
620- dst = (IOBufferIdx )((dst + IOBUFFERMASK ) & IOBUFFERMASK );
625+ if (i == ioTail ) { // if we were at the start, just move onwards
626+ ioTail = j ;
627+ } else { // not at the start, must shift back
628+ // work backwards and shift all items in queue down
629+ IOBufferIdx dst = (IOBufferIdx )((i + len + 1 ) & IOBUFFERMASK ); // to: last element of this event
630+ IOBufferIdx src = (IOBufferIdx )((i + IOBUFFERMASK ) & IOBUFFERMASK ); // from: item before current
631+ while (true) {
632+ ioBuffer [dst ] = ioBuffer [src ];
633+ if (src == ioTail )
634+ break ;
635+ // move backwards
636+ src = (IOBufferIdx )((src + IOBUFFERMASK ) & IOBUFFERMASK );
637+ dst = (IOBufferIdx )((dst + IOBUFFERMASK ) & IOBUFFERMASK );
638+ }
639+ // finally update the tail pointer, and return
640+ ioTail = dst ;
621641 }
622- // finally update the tail pointer, and return
623- ioTail = dst ;
624642 ioLastHead = ioHead ; // reset last head - if we're removing stuff in the middle it's easier not to optimise!
625643 jshInterruptOn ();
626644 return evt ;
0 commit comments