Alexandre Julliard : ntdll: Abstract the entity array type as we need it for assemblies too.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Jul 20 06:02:13 CDT 2007


Module: wine
Branch: master
Commit: b96df32560208c824786a8789ed51c80c931ea38
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b96df32560208c824786a8789ed51c80c931ea38

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Jul 19 18:00:33 2007 +0200

ntdll: Abstract the entity array type as we need it for assemblies too.

---

 dlls/ntdll/actctx.c |   86 ++++++++++++++++++++++++++++----------------------
 1 files changed, 48 insertions(+), 38 deletions(-)

diff --git a/dlls/ntdll/actctx.c b/dlls/ntdll/actctx.c
index 5abb374..3ba5494 100644
--- a/dlls/ntdll/actctx.c
+++ b/dlls/ntdll/actctx.c
@@ -122,13 +122,18 @@ struct entity
     } u;
 };
 
+struct entity_array
+{
+    struct entity        *base;
+    unsigned int          num;
+    unsigned int          allocated;
+};
+
 struct dll_redirect
 {
     WCHAR                *name;
     WCHAR                *hash;
-    struct entity        *entities;
-    unsigned int          num_entities;
-    unsigned int          allocated_entities;
+    struct entity_array   entities;
 };
 
 enum assembly_type
@@ -302,56 +307,62 @@ static void free_assembly_identity(struct assembly_identity *ai)
     RtlFreeHeap( GetProcessHeap(), 0, ai->language );
 }
 
-static struct entity* add_entity(struct dll_redirect* dll, DWORD kind)
+static struct entity* add_entity(struct entity_array *array, DWORD kind)
 {
     struct entity*      entity;
 
-    if (dll->num_entities == dll->allocated_entities)
+    if (array->num == array->allocated)
     {
         void *ptr;
         unsigned int new_count;
-        if (dll->entities)
+        if (array->base)
         {
-            new_count = dll->allocated_entities * 2;
+            new_count = array->allocated * 2;
             ptr = RtlReAllocateHeap( GetProcessHeap(), HEAP_ZERO_MEMORY,
-                                     dll->entities, new_count * sizeof(*dll->entities) );
+                                     array->base, new_count * sizeof(*array->base) );
         }
         else
         {
             new_count = 4;
-            ptr = RtlAllocateHeap( GetProcessHeap(), HEAP_ZERO_MEMORY, new_count * sizeof(*dll->entities) );
+            ptr = RtlAllocateHeap( GetProcessHeap(), HEAP_ZERO_MEMORY, new_count * sizeof(*array->base) );
         }
         if (!ptr) return NULL;
-        dll->entities = ptr;
-        dll->allocated_entities = new_count;
+        array->base = ptr;
+        array->allocated = new_count;
     }
-    entity = &dll->entities[dll->num_entities++];
+    entity = &array->base[array->num++];
     entity->kind = kind;
     return entity;
 }
 
-static void free_entity(struct entity* entity)
+static void free_entity_array(struct entity_array *array)
 {
-    switch (entity->kind)
+    unsigned int i;
+    for (i = 0; i < array->num; i++)
     {
-    case ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION:
-        RtlFreeHeap(GetProcessHeap(), 0, entity->u.comclass.clsid);
-        break;
-    case ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION:
-        RtlFreeHeap(GetProcessHeap(), 0, entity->u.proxy.iid);
-        RtlFreeHeap(GetProcessHeap(), 0, entity->u.proxy.name);
-        break;
-    case ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION:
-        RtlFreeHeap(GetProcessHeap(), 0, entity->u.typelib.tlbid);
-        RtlFreeHeap(GetProcessHeap(), 0, entity->u.typelib.version);
-        RtlFreeHeap(GetProcessHeap(), 0, entity->u.typelib.helpdir);
-        break;
-    case ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION:
-        RtlFreeHeap(GetProcessHeap(), 0, entity->u.class.name);
-        break;
-    default:
-        FIXME("Unknown entity kind %d\n", entity->kind);
+        struct entity *entity = &array->base[i];
+        switch (entity->kind)
+        {
+        case ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION:
+            RtlFreeHeap(GetProcessHeap(), 0, entity->u.comclass.clsid);
+            break;
+        case ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION:
+            RtlFreeHeap(GetProcessHeap(), 0, entity->u.proxy.iid);
+            RtlFreeHeap(GetProcessHeap(), 0, entity->u.proxy.name);
+            break;
+        case ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION:
+            RtlFreeHeap(GetProcessHeap(), 0, entity->u.typelib.tlbid);
+            RtlFreeHeap(GetProcessHeap(), 0, entity->u.typelib.version);
+            RtlFreeHeap(GetProcessHeap(), 0, entity->u.typelib.helpdir);
+            break;
+        case ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION:
+            RtlFreeHeap(GetProcessHeap(), 0, entity->u.class.name);
+            break;
+        default:
+            FIXME("Unknown entity kind %d\n", entity->kind);
+        }
     }
+    RtlFreeHeap( GetProcessHeap(), 0, array->base );
 }
 
 static BOOL add_dependent_assembly_id(struct actctx_loader* acl,
@@ -413,7 +424,7 @@ static void actctx_release( ACTIVATION_CONTEXT *actctx )
 {
     if (interlocked_xchg_add( &actctx->ref_count, -1 ) == 1)
     {
-        unsigned int i, j, k;
+        unsigned int i, j;
 
         for (i = 0; i < actctx->num_assemblies; i++)
         {
@@ -421,8 +432,7 @@ static void actctx_release( ACTIVATION_CONTEXT *actctx )
             for (j = 0; j < assembly->num_dlls; j++)
             {
                 struct dll_redirect *dll = &assembly->dlls[j];
-                for (k = 0; k < dll->num_entities; k++) free_entity(&dll->entities[k]);
-                RtlFreeHeap( GetProcessHeap(), 0, dll->entities );
+                free_entity_array( &dll->entities );
                 RtlFreeHeap( GetProcessHeap(), 0, dll->name );
                 RtlFreeHeap( GetProcessHeap(), 0, dll->hash );
             }
@@ -669,7 +679,7 @@ static BOOL parse_com_class_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll)
     BOOL        end = FALSE, error;
     struct entity*      entity;
 
-    entity = add_entity(dll, ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION);
+    entity = add_entity(&dll->entities, ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION);
 
     while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end))
     {
@@ -695,7 +705,7 @@ static BOOL parse_cominterface_proxy_stub_elem(xmlbuf_t* xmlbuf, struct dll_redi
     BOOL        end = FALSE, error;
     struct entity*      entity;
 
-    entity = add_entity(dll, ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION);
+    entity = add_entity(&dll->entities, ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION);
 
     while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end))
     {
@@ -725,7 +735,7 @@ static BOOL parse_typelib_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll)
     BOOL        end = FALSE, error;
     struct entity*      entity;
 
-    entity = add_entity(dll, ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION);
+    entity = add_entity(&dll->entities, ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION);
 
     while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end))
     {
@@ -759,7 +769,7 @@ static BOOL parse_window_class_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll)
     BOOL        end = FALSE, ret = TRUE;
     struct entity*      entity;
 
-    entity = add_entity(dll, ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION);
+    entity = add_entity(&dll->entities, ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION);
 
     if (!parse_expect_no_attr(xmlbuf, &end)) return FALSE;
     if (end) return FALSE;




More information about the wine-cvs mailing list