[ros-diffs] [janderwald] 40823: - Use a spinlock with list functions over interlocked list functions - Use a bitmap for storing reference count of the mappings as mapping are complete async and not very likely in determined order
Alex Ionescu
ionucu at videotron.ca
Thu May 7 12:54:57 CEST 2009
RtlBitmap?
Best regards,
Alex Ionescu
On Thu, May 7, 2009 at 12:58 AM, <janderwald at svn.reactos.org> wrote:
> Author: janderwald
> Date: Thu May 7 02:58:57 2009
> New Revision: 40823
>
> URL: http://svn.reactos.org/svn/reactos?rev=40823&view=rev
> Log:
> - Use a spinlock with list functions over interlocked list functions
> - Use a bitmap for storing reference count of the mappings as mapping are
> complete async and not very likely in determined order
>
> Modified:
> trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c
> trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c
>
> Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c
> URL:
> http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c?rev=40823&r1=40822&r2=40823&view=diff
>
> ==============================================================================
> --- trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c
> [iso-8859-1] (original)
> +++ trunk/reactos/drivers/wdm/audio/backpln/portcls/irpstream.c
> [iso-8859-1] Thu May 7 02:58:57 2009
> @@ -14,6 +14,7 @@
> KSSTREAM_HEADER *Header;
> PIRP Irp;
>
> + ULONG References;
> ULONG NumTags;
> PVOID * Tag;
> }IRP_MAPPING, *PIRP_MAPPING;
> @@ -141,6 +142,7 @@
> IN PIRP Irp)
> {
> PIRP_MAPPING Mapping;
> + ULONG Index;
> IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
>
> Mapping = AllocateItem(NonPagedPool, sizeof(IRP_MAPPING),
> TAG_PORTCLASS);
> @@ -166,7 +168,6 @@
> {
> Mapping->NumTags++;
> }
> - ASSERT(Mapping->NumTags < 32);
> }
> }
> else
> @@ -181,12 +182,18 @@
> FreeItem(Mapping, TAG_PORTCLASS);
> return STATUS_UNSUCCESSFUL;
> }
> + ASSERT(Mapping->NumTags < 32);
> + for(Index = 0; Index < Mapping->NumTags; Index++);
> + Mapping->References |= (1 << Index);
>
> This->NumDataAvailable += Mapping->Header->DataUsed;
>
> - DPRINT("IIrpQueue_fnAddMapping NumMappings %u SizeOfMapping %lu
> NumDataAvailable %lu Mapping %p NumTags %u FrameSize %u\n",
> This->NumMappings, Mapping->Header->DataUsed, This->NumDataAvailable,
> Mapping, Mapping->NumTags, This->MaxFrameSize);
> -
> - ExInterlockedInsertTailList(&This->ListHead, &Mapping->Entry,
> &This->Lock);
> + DPRINT("IIrpQueue_fnAddMapping NumMappings %u SizeOfMapping %lu
> NumDataAvailable %lu Mapping %p NumTags %u References %x FrameSize %u\n",
> This->NumMappings, Mapping->Header->DataUsed, This->NumDataAvailable,
> Mapping, Mapping->NumTags, Mapping->References, This->MaxFrameSize);
> +
> + KeAcquireSpinLockAtDpcLevel(&This->Lock);
> + InsertTailList(&This->ListHead, &Mapping->Entry);
> + KeReleaseSpinLockFromDpcLevel(&This->Lock);
> +
> (void)InterlockedIncrement((volatile long*)&This->NumMappings);
>
> if (Irp)
> @@ -253,7 +260,10 @@
> {
> This->CurrentOffset = 0;
>
> - (void)ExInterlockedRemoveHeadList(&This->ListHead, &This->Lock);
> + KeAcquireSpinLockAtDpcLevel(&This->Lock);
> + RemoveHeadList(&This->ListHead);
> + KeReleaseSpinLockFromDpcLevel(&This->Lock);
> +
> InterlockedDecrement(&This->NumMappings);
> FreeMappingRoutine(CurMapping);
> }
> @@ -339,7 +349,7 @@
>
> /* calculate the offset */
> if (Index)
> - Offset = (Index + 1) * This->MaxFrameSize;
> + Offset = Index * This->MaxFrameSize;
> else
> Offset = 0;
>
> @@ -416,6 +426,7 @@
> KeReleaseSpinLockFromDpcLevel(&This->Lock);
> This->OutOfMapping = TRUE;
> This->StartStream = FALSE;
> + DPRINT("No Mapping available\n");
> return STATUS_UNSUCCESSFUL;
> }
>
> @@ -425,9 +436,9 @@
> IN IIrpQueue *iface,
> IN PVOID Tag)
> {
> - PIRP_MAPPING CurMapping;
> + PIRP_MAPPING CurMapping = NULL;
> PLIST_ENTRY CurEntry;
> - ULONG Index;
> + ULONG Index = 0;
> ULONG Found;
> IIrpQueueImpl * This = (IIrpQueueImpl*)iface;
>
> @@ -440,40 +451,48 @@
> return STATUS_UNSUCCESSFUL;
> }
>
> - CurMapping = CONTAINING_RECORD(CurEntry, IRP_MAPPING, Entry);
> Found = FALSE;
> -
> - for(Index = 0; Index < CurMapping->NumTags; Index++)
> - {
> - if (CurMapping->Tag[Index] == Tag)
> + MapIndex = 0;
> + while (CurEntry != &This->ListHead)
> + {
> + CurMapping = CONTAINING_RECORD(CurEntry, IRP_MAPPING, Entry);
> + for(Index = 0; Index < CurMapping->NumTags; Index++)
> {
> - Found = TRUE;
> + if (CurMapping->Tag[Index] == Tag)
> + {
> + Found = TRUE;
> + break;
> + }
> + }
> + if (Found)
> break;
> - }
> - }
> - KeReleaseSpinLockFromDpcLevel(&This->Lock);
> +
> + CurEntry = CurEntry->Flink;
> + }
>
> if (!Found)
> {
> - DPRINT("Tag %p not in first mapping %p\n", Tag, CurMapping);
> - return STATUS_UNSUCCESSFUL;
> - }
> -
> - if (Index != CurMapping->NumTags - 1)
> + DPRINT1("Tag %p not found\n", Tag);
> + ASSERT(Found);
> + }
> + DPRINT("References %x\n", CurMapping->References);
> + CurMapping->References &= ~(1 << Index);
> +
> + if (CurMapping->References)
> {
> /* released mapping is not the last mapping of the irp */
> - DPRINT1("IIrpQueue_fnReleaseMappingWithTag Tag %p Index %u NumTags
> %u\n", Tag, Index, CurMapping->NumTags);
> + DPRINT1("IIrpQueue_fnReleaseMappingWithTag Tag %p Index %u NumTags
> %u Refs %x\n", Tag, Index, CurMapping->NumTags, CurMapping->References);
> + KeReleaseSpinLockFromDpcLevel(&This->Lock);
> return STATUS_SUCCESS;
> }
>
> - CurEntry = ExInterlockedRemoveHeadList(&This->ListHead, &This->Lock);
> - ASSERT(CurEntry);
> - CurMapping = CONTAINING_RECORD(CurEntry, IRP_MAPPING, Entry);
> + RemoveEntryList(&CurMapping->Entry);
>
> /* last mapping of the irp, free irp */
> DPRINT("Freeing mapping %p\n", CurMapping);
> InterlockedDecrement(&This->NumMappings);
> FreeMappingRoutine(CurMapping);
> + KeReleaseSpinLockFromDpcLevel(&This->Lock);
>
> return STATUS_SUCCESS;
> }
>
> Modified: trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c
> URL:
> http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c?rev=40823&r1=40822&r2=40823&view=diff
>
> ==============================================================================
> --- trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c
> [iso-8859-1] (original)
> +++ trunk/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.c
> [iso-8859-1] Thu May 7 02:58:57 2009
> @@ -636,6 +636,7 @@
> if (This->IrpQueue->lpVtbl->HasLastMappingFailed(This->IrpQueue))
> {
> /* notify port driver that new mapping is available */
> + DPRINT("Notifying of new mapping\n");
> This->Stream->lpVtbl->MappingAvailable(This->Stream);
> }
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.reactos.org/pipermail/ros-diffs/attachments/20090507/5ca0dd61/attachment.html
More information about the Ros-diffs
mailing list