[Spice-devel] [PATCH 7/8] Store surfaces_used in a bit-array
Yonit Halperin
yhalperi at redhat.com
Sun Aug 22 05:56:51 PDT 2010
On 08/20/2010 09:54 PM, alexl at redhat.com wrote:
> From: Alexander Larsson<alexl at redhat.com>
>
> This is smaller than a byte array, and allows us to skip full
> blocks of 32 ids in one check.
> ---
Hi,
why not use a linked list, for free surfaces, in a static
UINT32[n_surfaces] array? Any reason besides space, which is 4k?
>
> static _inline void FreeSurface(PDev *pdev, UINT32 surface_id)
> {
> - pdev->Res.surfaces_used[surface_id] = 0;
> + UINT32 i, bitmask;
> +
> + i = surface_id / 32;
> + bitmask = (~0x80000000)>> (surface_id % 32);
> +
> + pdev->Res.surfaces_used[i]&= bitmask;
> }
shouldn't it be ~(0x80000000 << (surface_id % 32))?
>
>
> static UINT32 GetFreeSurface(PDev *pdev)
> {
> - UINT32 x;
> -
> - //not effective, fix me
> - for (x = 1; x< pdev->n_surfaces; ++x) {
> - if (!pdev->Res.surfaces_used[x]) {
> - pdev->Res.surfaces_used[x] = 1;
> - return x;
> + UINT32 start = 1;
> + UINT32 bit;
> + UINT32 i, end_i;
> + UINT32 bitmask;
> + UINT32 used_mask;
> + UINT32 res = 0;
> +
> + i = start / 32;
> + end_i = (pdev->n_surfaces + 31) / 32;
> + bit = start % 32;
> + bitmask = (0x80000000)>> (bit % 32);
> +
> + while (i< end_i) {
> + used_mask = pdev->Res.surfaces_used[i];
> + /* Avoid checks early if no unused */
> + if (used_mask == 0xffffffff) {
shouldn't it be used_mask != 0xffffffff?
More information about the Spice-devel
mailing list