2/3 eina_model: properly eliminate duplicates.
authorbarbieri <barbieri@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Thu, 16 Feb 2012 19:31:56 +0000 (19:31 +0000)
committerbarbieri <barbieri@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Thu, 16 Feb 2012 19:31:56 +0000 (19:31 +0000)
We must check for duplicates otherwise we'll have remaining entries
after topological sort.

git-svn-id: http://svn.enlightenment.org/svn/e/trunk/eina@68033 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/eina_model.c

index 104f4dd..70d5fad 100644 (file)
@@ -524,7 +524,7 @@ _eina_model_description_ifaces_fix(Eina_Model_Description *desc)
       unsigned int users;
       Eina_List *deps;
    } *nodes, **pending, **roots;
-   unsigned int n_nodes = desc->total.ifaces, n_pending = 0, n_roots = 0, i;
+   unsigned int n_nodes = desc->total.ifaces, n_pending = 0, n_roots = 0, i, j;
    Eina_Bool ret = EINA_TRUE;
 
    nodes = alloca(n_nodes * sizeof(struct node));
@@ -532,15 +532,26 @@ _eina_model_description_ifaces_fix(Eina_Model_Description *desc)
    roots = alloca(n_nodes * sizeof(struct node *));
 
    /* populate */
-   for (i = 0; i < n_nodes; i++)
+   for (i = 0, j = 0; i < n_nodes; i++)
      {
-        nodes[i].iface = desc->cache.ifaces[i];
-        nodes[i].users = 0;
-        nodes[i].deps = NULL;
+        unsigned int k;
+        for (k = 0; k < j; k++)
+          {
+             if (nodes[k].iface == desc->cache.ifaces[i])
+               break;
+          }
+        if (k < j)
+          continue; /* already exists */
+
+        nodes[j].iface = desc->cache.ifaces[i];
+        nodes[j].users = 0;
+        nodes[j].deps = NULL;
+        j++;
      }
+   n_nodes = j;
+
    for (i = 0; i < n_nodes; i++)
      {
-        unsigned int j;
         for (j = 0; j < n_nodes; j++)
           {
              if (i == j) continue;
@@ -580,8 +591,6 @@ _eina_model_description_ifaces_fix(Eina_Model_Description *desc)
 
         EINA_LIST_FREE(r->deps, d)
           {
-             unsigned int j;
-
              d->users--;
              if (d->users > 0) continue;