Merge branch 'master' of git://cadel.mutabah.net/acess2
[tpg/acess2.git] / KernelLand / Modules / IPStack / buffer.c
index b8462e6..2555a63 100644 (file)
@@ -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;
        }
 }
 

UCC git Repository :: git.ucc.asn.au