Changeset 12353


Ignore:
Timestamp:
Apr 12, 2011, 10:51:52 AM (11 years ago)
Author:
jordan
Message:

(trunk gtk) more heap pruning: give DetailsImpl? an internal GString buffer so that it doesn't have to create and free so many temporary strings

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/gtk/details.c

    r12234 r12353  
    100100    TrCore * core;
    101101    guint periodic_refresh_tag;
     102
     103    GString * gstr;
    102104};
    103105
     
    14471449                        gboolean      keyboard_tip,
    14481450                        GtkTooltip  * tooltip,
    1449                         gpointer      user_data UNUSED )
     1451                        gpointer      gdi )
    14501452{
    14511453    gboolean       show_tip = FALSE;
     
    14571459                                           &model, NULL, &iter ) )
    14581460    {
     1461        struct DetailsImpl * di = gdi;
    14591462        const char * pch;
    14601463        char * name = NULL;
    14611464        char * addr = NULL;
    14621465        char * flagstr = NULL;
    1463         GString * gstr = g_string_new( NULL );
     1466        GString * gstr = di->gstr;
    14641467        gtk_tree_model_get( model, &iter, PEER_COL_TORRENT_NAME, &name,
    14651468                                          PEER_COL_ADDRESS, &addr,
     
    14671470                                          -1 );
    14681471
     1472        g_string_truncate( gstr, 0 );
    14691473        g_string_append_printf( gstr, "<b>%s</b>\n%s\n \n", name, addr );
    14701474
     
    14931497            g_string_set_size( gstr, gstr->len - 1 );
    14941498        gtk_tooltip_set_markup( tooltip, gstr->str );
    1495         g_string_free( gstr, TRUE );
    14961499        g_free( flagstr );
    14971500        g_free( addr );
     
    17151718#if GTK_CHECK_VERSION( 2,12,0 )
    17161719    g_signal_connect( v, "query-tooltip",
    1717                       G_CALLBACK( onPeerViewQueryTooltip ), NULL );
     1720                      G_CALLBACK( onPeerViewQueryTooltip ), di );
    17181721#endif
    17191722    g_object_unref( store );
     
    17781781}
    17791782
    1780 static char *
    1781 buildTrackerSummary( const char * key, const tr_tracker_stat * st, gboolean showScrape )
     1783static void
     1784buildTrackerSummary( GString * gstr, const char * key, const tr_tracker_stat * st, gboolean showScrape )
    17821785{
    17831786    char * str;
    17841787    char timebuf[256];
    17851788    const time_t now = time( NULL );
    1786     GString * gstr = g_string_new( NULL );
    17871789    const char * err_markup_begin = "<span color=\"red\">";
    17881790    const char * err_markup_end = "</span>";
     
    18781880        }
    18791881    }
    1880 
    1881     return g_string_free( gstr, FALSE );
    18821882}
    18831883
     
    19701970    GtkTreeIter iter;
    19711971    GtkTreeModel * model;
     1972    GString * gstr = di->gstr; /* buffer for temporary strings */
    19721973    GHashTable * hash = di->tracker_hash;
    19731974    GtkListStore * store = di->tracker_store;
     
    19951996            const tr_tracker_stat * st = &stats[i][j];
    19961997            const int torrent_id = tr_torrentId( tor );
    1997             char * key = g_strdup_printf( "%d\t%d\t%s", torrent_id, st->tier, st->announce );
    1998 
    1999             if( g_hash_table_lookup( hash, key ) == NULL ) {
     1998
     1999            /* build the key to find the row */
     2000            g_string_truncate( gstr, 0 );
     2001            g_string_append_printf( gstr, "%d\t%d\t%s", torrent_id, st->tier, st->announce );
     2002
     2003            if( g_hash_table_lookup( hash, gstr->str ) == NULL ) {
    20002004                GtkTreePath * p;
    20012005                GtkTreeIter iter;
     
    20052009                    TRACKER_COL_TORRENT_ID, torrent_id,
    20062010                    TRACKER_COL_TRACKER_ID, st->id,
    2007                     TRACKER_COL_KEY, key,
     2011                    TRACKER_COL_KEY, gstr->str,
    20082012                    -1 );
    20092013
    20102014                p = gtk_tree_model_get_path( model, &iter );
    20112015                ref = gtk_tree_row_reference_new( model, p );
    2012                 g_hash_table_insert( hash, g_strdup( key ), ref );
     2016                g_hash_table_insert( hash, g_strdup( gstr->str ), ref );
    20132017                ref = gtk_tree_row_reference_new( model, p );
    20142018                gtr_get_favicon_from_url( session, st->announce, favicon_ready_cb, ref );
    20152019                gtk_tree_path_free( p );
    20162020            }
    2017 
    2018             g_free( key );
    20192021        }
    20202022    }
    20212023
    20222024    /* step 4: update the peers */
    2023     for( i=0; i<n; ++i ) {
     2025    for( i=0; i<n; ++i )
     2026    {
    20242027        int j;
    20252028        const tr_torrent * tor = torrents[i];
    20262029        const char * summary_name = n>1 ? tr_torrentName( tor ) : NULL;
    2027         for( j=0; j<statCount[i]; ++j ) {
     2030        for( j=0; j<statCount[i]; ++j )
     2031        {
     2032            GtkTreePath * p;
     2033            GtkTreeRowReference * ref;
    20282034            const tr_tracker_stat * st = &stats[i][j];
    2029             char * summary = buildTrackerSummary( summary_name, st, showScrape );
    2030             char * key = g_strdup_printf( "%d\t%d\t%s", tr_torrentId( tor ), st->tier, st->announce );
    2031             GtkTreeRowReference * ref = g_hash_table_lookup( hash, key );
    2032             GtkTreePath * p = gtk_tree_row_reference_get_path( ref );
     2035
     2036            /* build the key to find the row */
     2037            g_string_truncate( gstr, 0 );
     2038            g_string_append_printf( gstr, "%d\t%d\t%s", tr_torrentId( tor ), st->tier, st->announce );
     2039            ref = g_hash_table_lookup( hash, gstr->str );
     2040            p = gtk_tree_row_reference_get_path( ref );
    20332041            gtk_tree_model_get_iter( model, &iter, p );
    2034             gtk_list_store_set( store, &iter, TRACKER_COL_TEXT, summary,
     2042
     2043            /* update the row */
     2044            g_string_truncate( gstr, 0 );
     2045            buildTrackerSummary( gstr, summary_name, st, showScrape );
     2046            gtk_list_store_set( store, &iter, TRACKER_COL_TEXT, gstr->str,
    20352047                                              TRACKER_COL_IS_BACKUP, st->isBackup,
    20362048                                              TRACKER_COL_TRACKER_ID, st->id,
    20372049                                              TRACKER_COL_WAS_UPDATED, TRUE,
    20382050                                              -1 );
     2051
     2052            /* cleanup */
    20392053            gtk_tree_path_free( p );
    2040             g_free( key );
    2041             g_free( summary );
    20422054        }
    20432055    }
     
    21552167}
    21562168
    2157 static char*
    2158 get_editable_tracker_list( const tr_torrent * tor )
     2169static void
     2170get_editable_tracker_list( GString * gstr, const tr_torrent * tor )
    21592171{
    21602172    int i;
    21612173    int tier = 0;
    2162     GString * gstr = g_string_new( NULL );
    21632174    const tr_info * inf = tr_torrentInfo( tor );
    21642175    for( i=0; i<inf->trackerCount; ++i ) {
     
    21722183    if( gstr->len > 0 )
    21732184        g_string_truncate( gstr, gstr->len-1 );
    2174     return g_string_free( gstr, FALSE );
    21752185}
    21762186
     
    21862196        GtkWidget *w, *d, *fr, *t, *l, *sw;
    21872197        GtkWindow * win = GTK_WINDOW( gtk_widget_get_toplevel( GTK_WIDGET( button ) ) );
    2188         char * text = get_editable_tracker_list( tor );
     2198        GString * gstr = di->gstr; /* buffer for temporary strings */
    21892199        const int torrent_id = tr_torrentId( tor );
    2190         char * title = g_strdup_printf( _( "%s - Edit Trackers" ), tr_torrentName( tor ) );
    2191 
    2192         d = gtk_dialog_new_with_buttons( title, win,
     2200
     2201        g_string_truncate( gstr, 0 );
     2202        g_string_append_printf( gstr, _( "%s - Edit Trackers" ), tr_torrentName( tor ) );
     2203        d = gtk_dialog_new_with_buttons( gstr->str, win,
    21932204                GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
    21942205                GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
     
    22092220
    22102221        w = gtk_text_view_new( );
    2211         gtk_text_buffer_set_text( gtk_text_view_get_buffer( GTK_TEXT_VIEW( w ) ), text, -1 );
    22122222        gtk_widget_set_size_request( w, 500u, 166u );
     2223        g_string_truncate( gstr, 0 );
     2224        get_editable_tracker_list( gstr, tor );
     2225        gtk_text_buffer_set_text( gtk_text_view_get_buffer( GTK_TEXT_VIEW( w ) ), gstr->str, -1 );
    22132226        fr = gtk_frame_new( NULL );
    22142227        gtk_frame_set_shadow_type( GTK_FRAME( fr ), GTK_SHADOW_IN );
     
    22272240        g_object_set_data( G_OBJECT( d ), "text-buffer", gtk_text_view_get_buffer( GTK_TEXT_VIEW( w ) ) );
    22282241        gtk_widget_show( d );
    2229 
    2230         g_free( title );
    2231         g_free( text );
    22322242    }
    22332243}
     
    22982308        GtkWidget * t;
    22992309        GtkWidget * w;
    2300         char * title = g_strdup_printf( _( "%s - Add Tracker" ), tr_torrentName( tor ) );
    2301 
    2302         w = gtk_dialog_new_with_buttons( title, GTK_WINDOW( di->dialog ),
     2310        GString * gstr = di->gstr; /* buffer for temporary strings */
     2311
     2312        g_string_truncate( gstr, 0 );
     2313        g_string_append_printf( gstr, _( "%s - Add Tracker" ), tr_torrentName( tor ) );
     2314        w = gtk_dialog_new_with_buttons( gstr->str, GTK_WINDOW( di->dialog ),
    23032315                                         GTK_DIALOG_DESTROY_WITH_PARENT,
    23042316                                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
     
    23222334        gtr_dialog_set_content( GTK_DIALOG( w ), t );
    23232335        gtk_widget_show_all( w );
    2324 
    2325         g_free( title );
    23262336    }
    23272337}
     
    24942504    g_hash_table_destroy( data->webseed_hash );
    24952505    g_hash_table_destroy( data->peer_hash );
     2506    g_string_free( data->gstr, TRUE );
    24962507    g_slist_free( data->ids );
    24972508    g_free( data );
     
    25062517    /* create the dialog */
    25072518    di->core = core;
     2519    di->gstr = g_string_new( NULL );
    25082520    d = gtk_dialog_new_with_buttons( NULL, parent, 0,
    25092521                                     GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
Note: See TracChangeset for help on using the changeset viewer.