X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fadt.c;h=ef2ae058d94bf3b8930d6b67189b840f4facd269;hb=7e5607004c3221d55c7992148b2f0d958cf28533;hp=77c8d9953492f11a33653266c83cf3ea0029c227;hpb=0f8226381e0a19e8e8e11eafbf4589532e45d430;p=tpg%2Facess2.git diff --git a/Kernel/adt.c b/Kernel/adt.c index 77c8d995..ef2ae058 100644 --- a/Kernel/adt.c +++ b/Kernel/adt.c @@ -21,45 +21,66 @@ tRingBuffer *RingBuffer_Create(size_t Space) size_t RingBuffer_Read(void *Dest, tRingBuffer *Buffer, size_t Length) { - if(Length > Buffer->Length) Length = Buffer->Length; + size_t tmpLen; + + tmpLen = Buffer->Length; // Changed in Write, so cache it for our read + + if(Length > tmpLen) Length = tmpLen; if( Buffer->Start + Length > Buffer->Space ) { int endData = Buffer->Space - Buffer->Start; memcpy(Dest, &Buffer->Data[Buffer->Start], endData); - memcpy((Uint8*)Dest + endData, &Buffer->Data, Length - endData); + memcpy((Uint8*)Dest + endData, Buffer->Data, Length - endData); } else { memcpy(Dest, &Buffer->Data[Buffer->Start], Length); } + + // Lock then modify + SHORTLOCK( &Buffer->Lock ); Buffer->Start += Length; if( Buffer->Start > Buffer->Space ) Buffer->Start -= Buffer->Space; Buffer->Length -= Length; + SHORTREL( &Buffer->Lock ); + return Length; } size_t RingBuffer_Write(tRingBuffer *Buffer, const void *Source, size_t Length) { - size_t bufEnd = Buffer->Start + Buffer->Length; - size_t endSpace = Buffer->Space - bufEnd; + size_t bufEnd, endSpace; + size_t tmpLen, tmpStart; + + // Cache Start and Length because _Read can change these + SHORTLOCK( &Buffer->Lock ); + tmpStart = Buffer->Start; + tmpLen = Buffer->Length; + SHORTREL( &Buffer->Lock ); + + bufEnd = (tmpStart + Buffer->Length) % Buffer->Space; + endSpace = Buffer->Space - bufEnd; // Force to bounds - if(Length > Buffer->Space - Buffer->Length) - Length = Buffer->Space - Buffer->Length; + if(Length > Buffer->Space - tmpLen) Length = Buffer->Space - tmpLen; if(endSpace < Length) { memcpy( &Buffer->Data[bufEnd], Source, endSpace ); memcpy( Buffer->Data, (Uint8*)Source + endSpace, Length - endSpace ); - Buffer->Length = Length - endSpace; } else { memcpy( &Buffer->Data[bufEnd], Source, Length ); - Buffer->Length += Length; } + + // Lock then modify + SHORTLOCK( &Buffer->Lock ); + Buffer->Length += Length; + SHORTREL( &Buffer->Lock ); return Length; } +