X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fadt.c;h=ef2ae058d94bf3b8930d6b67189b840f4facd269;hb=ac01ae9668972f7fc8223d8fd68168f27c7baec0;hp=849b6c27aa327ff18a10cf7ba192c23fbee3e24e;hpb=9d85201216cb35e1b1e051b1d7cdc38eaa5befa4;p=tpg%2Facess2.git diff --git a/Kernel/adt.c b/Kernel/adt.c index 849b6c27..ef2ae058 100644 --- a/Kernel/adt.c +++ b/Kernel/adt.c @@ -1,8 +1,13 @@ /* + * Acess2 Kernel + * + * adt.c + * - Complex data type code */ #include #include + // === CODE === // --- Ring Buffers --- tRingBuffer *RingBuffer_Create(size_t Space) @@ -16,42 +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, void *Source, size_t 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; } +