#1 winhttp: Add a handle management implementation.
H. Verbeet
hverbeet at gmail.com
Fri Aug 15 08:23:40 CDT 2008
2008/8/15 Hans Leidekker <hans at meelstraat.net>:
>
> +HINTERNET alloc_handle( object_header_t *hdr )
> +{
> + object_header_t **p;
> + ULONG_PTR handle = 0, num;
> +
> + list_init( &hdr->children );
> +
> + EnterCriticalSection( &handle_cs );
> + if (!max_handles)
> + {
> + num = HANDLE_CHUNK_SIZE;
> + if (!(p = heap_alloc_zero( sizeof(ULONG_PTR) * num ))) goto end;
> + handles = p;
> + max_handles = num;
> + }
> + if (max_handles == next_handle)
> + {
> + num = max_handles + HANDLE_CHUNK_SIZE;
> + if (!(p = heap_realloc_zero( handles, sizeof(ULONG_PTR) * num ))) goto end;
> + handles = p;
> + max_handles = num;
> + }
> + handle = next_handle;
> + if (handles[handle]) ERR("handle isn't free but should be\n");
> +
> + handles[handle] = addref_object( hdr );
> + while (handles[next_handle] && (next_handle < max_handles)) next_handle++;
> +
> +end:
> + LeaveCriticalSection( &handle_cs );
> + return hdr->handle = (HINTERNET)(handle + 1);
> +}
Not necessarily wrong, but the common way to implement tables like
this is to grow the table by some percentage of the original size, and
keep a list of free handles.
More information about the wine-devel
mailing list