Ethereal-dev: Re: [ethereal-dev] I hate GLists

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Guy Harris <guy@xxxxxxxxxx>
Date: Wed, 25 Aug 1999 20:56:30 -0700 (PDT)
> Unfortunately, unlike my previous changes to get rid of that flavor of
> N^2 behavior, by avoiding calls to set attributes of lines in the CList
> as they're built (as those calls use "g_list_nth()"), that one doesn't
> looks so easy to fix without changing GTK+.  I'll see if I can have the
> CList remember the row number of the most recently added item, and a
> pointer to that item, and use that as a cache to avoid calling
> "g_list_nth()", or something such as that.

Those of you who are feeling daring could apply the following change to
"gtk/gtkclist.c" in the GTK 1.2[.x] source; it took "g_list_nth()" off
the top of the CPU Eaters list (leaving "internal_mcount" at the top,
i.e. the biggest consumer of CPU is now a routine that keeps track of
who's calling whom so you can figure out where the CPU time is
going...).

I'll see what's involved in sending this off to the GTK+ maintainers. 
(It doesn't eliminate "g_list_nth()", but it does mean you don't need it
to find the data for the last row in the CList, and, when building a
list, that's the row we do things to after we've added it to the list,
so it reduces "g_list_nth()" to a minor player.)

*** gtkclist.c	1999/06/11 21:13:48	1.1
--- gtkclist.c	1999/08/26 03:43:29
***************
*** 2169,2175 ****
    if (column < 0 || column >= clist->columns)
      return -1;
  
!   clist_row = (g_list_nth (clist->row_list, row))->data;
  
    return clist_row->cell[column].type;
  }
--- 2169,2178 ----
    if (column < 0 || column >= clist->columns)
      return -1;
  
!   if (row == clist->rows - 1)
!     clist_row = clist->row_list_end->data;
!   else
!     clist_row = (g_list_nth (clist->row_list, row))->data;
  
    return clist_row->cell[column].type;
  }
***************
*** 2190,2196 ****
    if (column < 0 || column >= clist->columns)
      return;
  
!   clist_row = (g_list_nth (clist->row_list, row))->data;
  
    /* if text is null, then the cell is empty */
    GTK_CLIST_CLASS_FW (clist)->set_cell_contents
--- 2193,2202 ----
    if (column < 0 || column >= clist->columns)
      return;
  
!   if (row == clist->rows - 1)
!     clist_row = clist->row_list_end->data;
!   else
!     clist_row = (g_list_nth (clist->row_list, row))->data;
  
    /* if text is null, then the cell is empty */
    GTK_CLIST_CLASS_FW (clist)->set_cell_contents
***************
*** 2220,2226 ****
    if (column < 0 || column >= clist->columns)
      return 0;
  
!   clist_row = (g_list_nth (clist->row_list, row))->data;
  
    if (clist_row->cell[column].type != GTK_CELL_TEXT)
      return 0;
--- 2226,2235 ----
    if (column < 0 || column >= clist->columns)
      return 0;
  
!   if (row == clist->rows - 1)
!     clist_row = clist->row_list_end->data;
!   else
!     clist_row = (g_list_nth (clist->row_list, row))->data;
  
    if (clist_row->cell[column].type != GTK_CELL_TEXT)
      return 0;
***************
*** 2248,2254 ****
    if (column < 0 || column >= clist->columns)
      return;
  
!   clist_row = (g_list_nth (clist->row_list, row))->data;
    
    gdk_pixmap_ref (pixmap);
    
--- 2257,2266 ----
    if (column < 0 || column >= clist->columns)
      return;
  
!   if (row == clist->rows - 1)
!     clist_row = clist->row_list_end->data;
!   else
!     clist_row = (g_list_nth (clist->row_list, row))->data;
    
    gdk_pixmap_ref (pixmap);
    
***************
*** 2282,2288 ****
    if (column < 0 || column >= clist->columns)
      return 0;
  
!   clist_row = (g_list_nth (clist->row_list, row))->data;
  
    if (clist_row->cell[column].type != GTK_CELL_PIXMAP)
      return 0;
--- 2294,2303 ----
    if (column < 0 || column >= clist->columns)
      return 0;
  
!   if (row == clist->rows - 1)
!     clist_row = clist->row_list_end->data;
!   else
!     clist_row = (g_list_nth (clist->row_list, row))->data;
  
    if (clist_row->cell[column].type != GTK_CELL_PIXMAP)
      return 0;
***************
*** 2316,2322 ****
    if (column < 0 || column >= clist->columns)
      return;
  
!   clist_row = (g_list_nth (clist->row_list, row))->data;
    
    gdk_pixmap_ref (pixmap);
    if (mask) gdk_pixmap_ref (mask);
--- 2331,2340 ----
    if (column < 0 || column >= clist->columns)
      return;
  
!   if (row == clist->rows - 1)
!     clist_row = clist->row_list_end->data;
!   else
!     clist_row = (g_list_nth (clist->row_list, row))->data;
    
    gdk_pixmap_ref (pixmap);
    if (mask) gdk_pixmap_ref (mask);
***************
*** 2350,2356 ****
    if (column < 0 || column >= clist->columns)
      return 0;
  
!   clist_row = (g_list_nth (clist->row_list, row))->data;
  
    if (clist_row->cell[column].type != GTK_CELL_PIXTEXT)
      return 0;
--- 2368,2377 ----
    if (column < 0 || column >= clist->columns)
      return 0;
  
!   if (row == clist->rows - 1)
!     clist_row = clist->row_list_end->data;
!   else
!     clist_row = (g_list_nth (clist->row_list, row))->data;
  
    if (clist_row->cell[column].type != GTK_CELL_PIXTEXT)
      return 0;
***************
*** 2386,2392 ****
    if (column < 0 || column >= clist->columns)
      return;
  
!   clist_row = (g_list_nth (clist->row_list, row))->data;
  
    if (clist->column[column].auto_resize &&
        !GTK_CLIST_AUTO_RESIZE_BLOCKED(clist))
--- 2407,2416 ----
    if (column < 0 || column >= clist->columns)
      return;
  
!   if (row == clist->rows - 1)
!     clist_row = clist->row_list_end->data;
!   else
!     clist_row = (g_list_nth (clist->row_list, row))->data;
  
    if (clist->column[column].auto_resize &&
        !GTK_CLIST_AUTO_RESIZE_BLOCKED(clist))
***************
*** 3009,3015 ****
    if (row < 0 || row > (clist->rows - 1))
      return;
  
!   clist_row = (g_list_nth (clist->row_list, row))->data;
    clist_row->data = data;
    clist_row->destroy = destroy;
  }
--- 3033,3042 ----
    if (row < 0 || row > (clist->rows - 1))
      return;
  
!   if (row == clist->rows - 1)
!     clist_row = clist->row_list_end->data;
!   else
!     clist_row = (g_list_nth (clist->row_list, row))->data;
    clist_row->data = data;
    clist_row->destroy = destroy;
  }
***************
*** 3026,3032 ****
    if (row < 0 || row > (clist->rows - 1))
      return NULL;
  
!   clist_row = (g_list_nth (clist->row_list, row))->data;
    return clist_row->data;
  }
  
--- 3053,3062 ----
    if (row < 0 || row > (clist->rows - 1))
      return NULL;
  
!   if (row == clist->rows - 1)
!     clist_row = clist->row_list_end->data;
!   else
!     clist_row = (g_list_nth (clist->row_list, row))->data;
    return clist_row->data;
  }
  
***************
*** 3135,3141 ****
    if (row < 0 || row >= clist->rows)
      return;
  
!   clist_row = (g_list_nth (clist->row_list, row))->data;
  
    if (color)
      {
--- 3165,3174 ----
    if (row < 0 || row >= clist->rows)
      return;
  
!   if (row == clist->rows - 1)
!     clist_row = clist->row_list_end->data;
!   else
!     clist_row = (g_list_nth (clist->row_list, row))->data;
  
    if (color)
      {
***************
*** 3165,3171 ****
    if (row < 0 || row >= clist->rows)
      return;
  
!   clist_row = (g_list_nth (clist->row_list, row))->data;
  
    if (color)
      {
--- 3198,3207 ----
    if (row < 0 || row >= clist->rows)
      return;
  
!   if (row == clist->rows - 1)
!     clist_row = clist->row_list_end->data;
!   else
!     clist_row = (g_list_nth (clist->row_list, row))->data;
  
    if (color)
      {
***************
*** 3206,3212 ****
    if (column < 0 || column >= clist->columns)
      return;
  
!   clist_row = (g_list_nth (clist->row_list, row))->data;
  
    if (clist_row->cell[column].style == style)
      return;
--- 3242,3251 ----
    if (column < 0 || column >= clist->columns)
      return;
  
!   if (row == clist->rows - 1)
!     clist_row = clist->row_list_end->data;
!   else
!     clist_row = (g_list_nth (clist->row_list, row))->data;
  
    if (clist_row->cell[column].style == style)
      return;
***************
*** 3258,3264 ****
    if (row < 0 || row >= clist->rows || column < 0 || column >= clist->columns)
      return NULL;
  
!   clist_row = (g_list_nth (clist->row_list, row))->data;
  
    return clist_row->cell[column].style;
  }
--- 3297,3306 ----
    if (row < 0 || row >= clist->rows || column < 0 || column >= clist->columns)
      return NULL;
  
!   if (row == clist->rows - 1)
!     clist_row = clist->row_list_end->data;
!   else
!     clist_row = (g_list_nth (clist->row_list, row))->data;
  
    return clist_row->cell[column].style;
  }
***************
*** 3279,3285 ****
    if (row < 0 || row >= clist->rows)
      return;
  
!   clist_row = (g_list_nth (clist->row_list, row))->data;
  
    if (clist_row->style == style)
      return;
--- 3321,3330 ----
    if (row < 0 || row >= clist->rows)
      return;
  
!   if (row == clist->rows - 1)
!     clist_row = clist->row_list_end->data;
!   else
!     clist_row = (g_list_nth (clist->row_list, row))->data;
  
    if (clist_row->style == style)
      return;
***************
*** 3341,3347 ****
    if (row < 0 || row >= clist->rows)
      return NULL;
  
!   clist_row = (g_list_nth (clist->row_list, row))->data;
  
    return clist_row->style;
  }
--- 3386,3395 ----
    if (row < 0 || row >= clist->rows)
      return NULL;
  
!   if (row == clist->rows - 1)
!     clist_row = clist->row_list_end->data;
!   else
!     clist_row = (g_list_nth (clist->row_list, row))->data;
  
    return clist_row->style;
  }
***************
*** 3368,3374 ****
    if (row < 0 || row >= clist->rows)
      return;
  
!   clist_row = (g_list_nth (clist->row_list, row))->data;
  
    if (selectable == clist_row->selectable)
      return;
--- 3416,3425 ----
    if (row < 0 || row >= clist->rows)
      return;
  
!   if (row == clist->rows - 1)
!     clist_row = clist->row_list_end->data;
!   else
!     clist_row = (g_list_nth (clist->row_list, row))->data;
  
    if (selectable == clist_row->selectable)
      return;
***************
*** 3655,3661 ****
        break;
      }
  
!   clist_row = (g_list_nth (clist->row_list, row))->data;
  
    if (clist_row->state != GTK_STATE_NORMAL || !clist_row->selectable)
      return;
--- 3706,3715 ----
        break;
      }
  
!   if (row == clist->rows - 1)
!     clist_row = clist->row_list_end->data;
!   else
!     clist_row = (g_list_nth (clist->row_list, row))->data;
  
    if (clist_row->state != GTK_STATE_NORMAL || !clist_row->selectable)
      return;
***************
*** 3690,3696 ****
    if (row < 0 || row > (clist->rows - 1))
      return;
  
!   clist_row = (g_list_nth (clist->row_list, row))->data;
  
    if (clist_row->state == GTK_STATE_SELECTED)
      {
--- 3744,3753 ----
    if (row < 0 || row > (clist->rows - 1))
      return;
  
!   if (row == clist->rows - 1)
!     clist_row = clist->row_list_end->data;
!   else
!     clist_row = (g_list_nth (clist->row_list, row))->data;
  
    if (clist_row->state == GTK_STATE_SELECTED)
      {