From 0086c22da2cdd7121386513fa808e9699dd92218 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Tue, 2 Apr 2013 15:16:59 +0800 Subject: [PATCH] Kernel/IPStack - Added lock to buffer structure so drivers can do async Tx --- KernelLand/Modules/IPStack/buffer.c | 15 ++++++++++++++- KernelLand/Modules/IPStack/include/buffer.h | 3 +++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/KernelLand/Modules/IPStack/buffer.c b/KernelLand/Modules/IPStack/buffer.c index 0048420e..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 diff --git a/KernelLand/Modules/IPStack/include/buffer.h b/KernelLand/Modules/IPStack/include/buffer.h index ad0516ab..749fc181 100644 --- a/KernelLand/Modules/IPStack/include/buffer.h +++ b/KernelLand/Modules/IPStack/include/buffer.h @@ -67,5 +67,8 @@ extern int IPStack_Buffer_GetBuffer(tIPStackBuffer *Buffer, int PrevID, size_t * */ extern void *IPStack_Buffer_CompactBuffer(tIPStackBuffer *Buffer, size_t *Length); +extern void IPStack_Buffer_LockBuffer(tIPStackBuffer *Buffer); +extern void IPStack_Buffer_UnlockBuffer(tIPStackBuffer *Buffer); + #endif -- 2.20.1