RtlBitmap?
Best regards,
Alex Ionescu

On Thu, May 7, 2009 at 12:58 AM, <[email protected]> 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);
>     }
>
>
>
_______________________________________________
Ros-dev mailing list
[email protected]
http://www.reactos.org/mailman/listinfo/ros-dev

Reply via email to