X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FIPStack%2Fbuffer.c;h=2555a6359d3b8a7ee214192aad8edef04a5e7f40;hb=46e22b3d5a938ccd9f41e85aa4ec012721119934;hp=b8462e60a238d78f0ca39cb0d3e50e3c1508a22d;hpb=33495f1efd207f0af4f804858f247db0983fcb8f;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/IPStack/buffer.c b/KernelLand/Modules/IPStack/buffer.c index b8462e60..2555a635 100644 --- a/KernelLand/Modules/IPStack/buffer.c +++ b/KernelLand/Modules/IPStack/buffer.c @@ -14,6 +14,8 @@ struct sIPStackBuffer int MaxSubBufffers; int nSubBuffers; size_t TotalLength; + tMutex lBufferLock; + struct _subbuffer { const void *Data; @@ -34,12 +36,14 @@ tIPStackBuffer *IPStack_Buffer_CreateBuffer(int MaxBuffers) ret->MaxSubBufffers = MaxBuffers; ret->nSubBuffers = 0; ret->TotalLength = 0; + memset(&ret->lBufferLock, 0, sizeof(ret->lBufferLock)); memset(ret->SubBuffers, 0, MaxBuffers * sizeof(ret->SubBuffers[0])); return ret; } void IPStack_Buffer_ClearBuffer(tIPStackBuffer *Buffer) { + IPStack_Buffer_LockBuffer(Buffer); for( int i = 0; i < Buffer->nSubBuffers; i ++ ) { if( Buffer->SubBuffers[i].Cb == NULL ) @@ -51,8 +55,8 @@ void IPStack_Buffer_ClearBuffer(tIPStackBuffer *Buffer) Buffer->SubBuffers[i].Data ); } - // TODO: Fire callbacks? Buffer->nSubBuffers = 0; + IPStack_Buffer_UnlockBuffer(Buffer); } void IPStack_Buffer_DestroyBuffer(tIPStackBuffer *Buffer) @@ -62,6 +66,15 @@ void IPStack_Buffer_DestroyBuffer(tIPStackBuffer *Buffer) free(Buffer); } +void IPStack_Buffer_LockBuffer(tIPStackBuffer *Buffer) +{ + Mutex_Acquire(&Buffer->lBufferLock); +} +void IPStack_Buffer_UnlockBuffer(tIPStackBuffer *Buffer) +{ + Mutex_Release(&Buffer->lBufferLock); +} + void IPStack_Buffer_AppendSubBuffer(tIPStackBuffer *Buffer, size_t HeaderLen, size_t FooterLen, const void *Data, tIPStackBufferCb Cb, void *Arg @@ -147,7 +160,7 @@ int IPStack_Buffer_GetBuffer(tIPStackBuffer *Buffer, int Index, size_t *Length, return -1; } - if( Index > Buffer->nSubBuffers ) + if( Index >= Buffer->nSubBuffers ) { // Appended buffers Index -= Buffer->nSubBuffers; @@ -166,11 +179,12 @@ int IPStack_Buffer_GetBuffer(tIPStackBuffer *Buffer, int Index, size_t *Length, } else { - Index = Buffer->nSubBuffers - Index; + int rv = Index + 1; + Index = Buffer->nSubBuffers - Index - 1; // Prepended buffers *DataPtr = Buffer->SubBuffers[Index].Data; *Length = Buffer->SubBuffers[Index].PreLength; - return Buffer->nSubBuffers - (Index - 1); + return rv; } }