int MaxSubBufffers;
int nSubBuffers;
size_t TotalLength;
+ tMutex lBufferLock;
+
struct _subbuffer
{
const void *Data;
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 )
Buffer->SubBuffers[i].Data
);
}
- // TODO: Fire callbacks?
Buffer->nSubBuffers = 0;
+ IPStack_Buffer_UnlockBuffer(Buffer);
}
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
return -1;
}
- *DataPtr = (Uint8*)Buffer->SubBuffers[Index].Data + Buffer->SubBuffers[Index].PreLength;
- *Length = Buffer->SubBuffers[Index].PostLength;
+ if( DataPtr )
+ *DataPtr = (Uint8*)Buffer->SubBuffers[Index].Data + Buffer->SubBuffers[Index].PreLength;
+ if( Length )
+ *Length = Buffer->SubBuffers[Index].PostLength;
return (Index + 1) + Buffer->nSubBuffers;
}
int rv = Index + 1;
Index = Buffer->nSubBuffers - Index - 1;
// Prepended buffers
- *DataPtr = Buffer->SubBuffers[Index].Data;
- *Length = Buffer->SubBuffers[Index].PreLength;
+ if( DataPtr )
+ *DataPtr = Buffer->SubBuffers[Index].Data;
+ if( Length )
+ *Length = Buffer->SubBuffers[Index].PreLength;
return rv;
}
}