2008/8/15 Hans Leidekker hans@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.
On Friday 15 August 2008 15:23:40 H. Verbeet wrote:
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.
Good point. I'll fix that when we have the basics of this dll covered.
-Hans