1
0
Fork 0
mirror of https://github.com/transmission/transmission synced 2025-03-12 07:03:44 +00:00

(trunk gtk) #3143 "remote RPC calls cause gtk+ API calls to be made from the wrong thread" -- fixed in trunk for 2.00

This commit is contained in:
Charles Kerr 2010-04-21 04:38:54 +00:00
parent a0bc78a6dd
commit ceba9e6722
9 changed files with 70 additions and 79 deletions

View file

@ -133,8 +133,8 @@ addResponseCB( GtkDialog * dialog,
tr_core_add_torrent( data->core, data->gtor, FALSE );
if( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( data->trash_check ) ) )
gtr_file_trash_or_remove( data->filename );
tr_file_trash_or_remove( data->filename );
save_recent_destination( data->core, data->downloadDir );
}
}

View file

@ -401,6 +401,21 @@ signal_handler( int sig )
}
}
struct remove_torrent_idle_data
{
TrCore * core;
int id;
};
static gboolean
remove_torrent_idle( gpointer gdata )
{
struct remove_torrent_idle_data * data = gdata;
tr_core_remove_torrent_from_id( data->core, data->id, FALSE );
g_free( data );
return FALSE; /* tell g_idle not to call this func twice */
}
static void
setupsighandlers( void )
{
@ -414,6 +429,7 @@ onRPCChanged( tr_session * session,
struct tr_torrent * tor,
void * gdata )
{
tr_rpc_callback_status status = TR_RPC_OK;
struct cbdata * cbdata = gdata;
gdk_threads_enter( );
@ -423,9 +439,14 @@ onRPCChanged( tr_session * session,
tr_core_add_torrent( cbdata->core, tr_torrent_new_preexisting( tor ), TRUE );
break;
case TR_RPC_TORRENT_REMOVING:
tr_core_torrent_destroyed( cbdata->core, tr_torrentId( tor ) );
case TR_RPC_TORRENT_REMOVING: {
struct remove_torrent_idle_data * data = g_new0( struct remove_torrent_idle_data, 1 );
data->id = tr_torrentId( tor );
data->core = cbdata->core;
gtr_idle_add( remove_torrent_idle, data );
status = TR_RPC_NOREMOVE;
break;
}
case TR_RPC_SESSION_CHANGED:
tr_sessionGetSettings( session, pref_get_all( ) );
@ -440,7 +461,7 @@ onRPCChanged( tr_session * session,
}
gdk_threads_leave( );
return TR_RPC_OK;
return status;
}
static GSList *
@ -1438,21 +1459,21 @@ msgwinclosed( void )
}
static void
accumulateSelectedTorrents( GtkTreeModel * model,
accumulateSelectedTorrents( GtkTreeModel * model,
GtkTreePath * path UNUSED,
GtkTreeIter * iter,
gpointer gdata )
GtkTreeIter * iter,
gpointer gdata )
{
GSList ** data = ( GSList** ) gdata;
TrTorrent * tor = NULL;
GSList ** data = ( GSList** ) gdata;
TrTorrent * gtor = NULL;
gtk_tree_model_get( model, iter, MC_TORRENT, &tor, -1 );
*data = g_slist_prepend( *data, tor );
gtk_tree_model_get( model, iter, MC_TORRENT, &gtor, -1 );
*data = g_slist_prepend( *data, gtor );
g_object_unref( G_OBJECT( gtor ) );
}
static void
removeSelected( struct cbdata * data,
gboolean delete_files )
removeSelected( struct cbdata * data, gboolean delete_files )
{
GSList * l = NULL;
GtkTreeSelection * s = tr_window_get_selection( data->wind );

View file

@ -900,10 +900,10 @@ torrent_cell_renderer_init( GTypeInstance * instance,
p->progress_renderer = gtk_cell_renderer_progress_new( );
p->icon_renderer = gtk_cell_renderer_pixbuf_new( );
g_object_set( p->text_renderer_err, "foreground", "red", NULL );
tr_object_ref_sink( p->text_renderer );
tr_object_ref_sink( p->text_renderer_err );
tr_object_ref_sink( p->progress_renderer );
tr_object_ref_sink( p->icon_renderer );
gtr_object_ref_sink( p->text_renderer );
gtr_object_ref_sink( p->text_renderer_err );
gtr_object_ref_sink( p->progress_renderer );
gtr_object_ref_sink( p->icon_renderer );
p->bar_height = DEFAULT_BAR_HEIGHT;
}

View file

@ -1181,48 +1181,40 @@ findTorrentInModel( TrCore * core,
}
void
tr_core_torrent_destroyed( TrCore * core,
int id )
tr_core_remove_torrent( TrCore * core, TrTorrent * gtor, gboolean deleteFiles )
{
const tr_torrent * tor = tr_torrent_handle( gtor );
if( tor != NULL )
tr_core_remove_torrent_from_id( core, tr_torrentId( tor ), deleteFiles );
}
void
tr_core_remove_torrent_from_id( TrCore * core, int id, gboolean deleteFiles )
{
GtkTreeIter iter;
if( findTorrentInModel( core, id, &iter ) )
{
TrTorrent * gtor;
TrTorrent * gtor = NULL;
tr_torrent * tor = NULL;
GtkTreeModel * model = tr_core_model( core );
gtk_tree_model_get( model, &iter, MC_TORRENT, &gtor, -1 );
tr_torrent_clear( gtor );
gtk_tree_model_get( model, &iter, MC_TORRENT, &gtor,
MC_TORRENT_RAW, &tor,
-1 );
/* remove from the gui */
gtk_list_store_remove( GTK_LIST_STORE( model ), &iter );
g_object_unref( G_OBJECT( gtor ) );
}
}
void
tr_core_remove_torrent( TrCore * core,
TrTorrent * gtor,
int deleteFiles )
{
const tr_torrent * tor = tr_torrent_handle( gtor );
/* maybe delete the downloaded files */
if( deleteFiles )
tr_torrentDeleteLocalData( tor, gtr_file_trash_or_remove );
if( tor )
{
int id = tr_torrentId( tor );
GtkTreeIter iter;
if( findTorrentInModel( core, id, &iter ) )
{
GtkTreeModel * model = tr_core_model( core );
/* remove from the gui */
gtk_list_store_remove( GTK_LIST_STORE( model ), &iter );
/* maybe delete the downloaded files */
if( deleteFiles )
tr_torrent_delete_files( gtor );
/* remove the torrent */
tr_torrent_set_remove_flag( gtor, TRUE );
g_object_unref( G_OBJECT( gtor ) );
}
/* remove the torrent */
tr_torrent_set_remove_flag( gtor, TRUE );
g_warn_if_fail( G_OBJECT( gtor )->ref_count == 1 );
g_object_unref( G_OBJECT( gtor ) ); /* remove the last refcount */
}
}

View file

@ -159,12 +159,9 @@ void tr_core_torrents_added( TrCore * self );
*******
******/
/* we've gotten notice from RPC that a torrent has been destroyed;
update our gui accordingly */
void tr_core_torrent_destroyed( TrCore * self, int torrentId );
/* remove a torrent */
void tr_core_remove_torrent( TrCore * self, TrTorrent * gtor, int deleteFiles );
void tr_core_remove_torrent( TrCore * self, TrTorrent * gtor, gboolean deleteFiles );
void tr_core_remove_torrent_from_id( TrCore * self, int id, gboolean deleteFiles );
/* update the model with current torrent status */
void tr_core_update( TrCore * self );

View file

@ -90,15 +90,6 @@ tr_torrent_dispose( GObject * o )
parent->dispose( o );
}
void
tr_torrent_clear( TrTorrent * tor )
{
g_return_if_fail( tor );
g_return_if_fail( tor->priv );
tor->priv->handle = NULL;
}
static void
tr_torrent_class_init( gpointer g_class,
gpointer g_class_data UNUSED )
@ -209,7 +200,7 @@ tr_torrent_new_ctor( tr_session * session,
/* #1294: don't delete the source .torrent file if it's our internal copy */
if( !is_internal )
tr_file_trash_or_remove( source );
gtr_file_trash_or_remove( source );
}
return tor ? maketorrent( tor ) : NULL;
@ -223,12 +214,6 @@ tr_torrent_set_remove_flag( TrTorrent * gtor,
gtor->priv->do_remove = do_remove;
}
void
tr_torrent_delete_files( TrTorrent * gtor )
{
tr_torrentDeleteLocalData( tr_torrent_handle( gtor ), tr_file_trash_or_remove );
}
void
tr_torrent_open_folder( TrTorrent * gtor )
{

View file

@ -57,16 +57,12 @@ TrTorrentClass;
GType tr_torrent_get_type( void );
void tr_torrent_clear( TrTorrent * tor );
tr_torrent * tr_torrent_handle( TrTorrent *tor );
const tr_stat *tr_torrent_stat( TrTorrent *tor );
const tr_info *tr_torrent_info( TrTorrent *tor );
void tr_torrent_delete_files( TrTorrent * tor );
void tr_torrent_open_folder( TrTorrent * tor );
TrTorrent * tr_torrent_new_preexisting( tr_torrent * tor );

View file

@ -464,7 +464,7 @@ on_tree_view_button_released( GtkWidget * view,
}
gpointer
tr_object_ref_sink( gpointer object )
gtr_object_ref_sink( gpointer object )
{
#if GLIB_CHECK_VERSION( 2, 10, 0 )
g_object_ref_sink( object );
@ -476,7 +476,7 @@ tr_object_ref_sink( gpointer object )
}
int
tr_file_trash_or_remove( const char * filename )
gtr_file_trash_or_remove( const char * filename )
{
if( filename && *filename )
{

View file

@ -117,7 +117,7 @@ void gtr_toolbar_set_orientation( GtkToolbar * tb, GtkOrientation orientation );
void gtr_widget_set_tooltip_text( GtkWidget * w, const char * tip );
/* backwards-compatible wrapper around g_object_ref_sink() */
gpointer tr_object_ref_sink( gpointer object );
gpointer gtr_object_ref_sink( gpointer object );
/***
****
@ -162,6 +162,6 @@ gboolean on_tree_view_button_released( GtkWidget * view,
/* move a file to the trashcan if GIO is available; otherwise, delete it */
int tr_file_trash_or_remove( const char * filename );
int gtr_file_trash_or_remove( const char * filename );
#endif /* GTR_UTIL_H */