Index: client/gvfsfusedaemon.c =================================================================== --- client/gvfsfusedaemon.c (revision 1744) +++ client/gvfsfusedaemon.c (working copy) @@ -71,6 +71,8 @@ } FileOp; typedef struct { + gint refcount; + GMutex *mutex; FileOp op; gpointer stream; @@ -188,12 +190,26 @@ FileHandle *file_handle; file_handle = g_new0 (FileHandle, 1); + file_handle->refcount = 1; file_handle->mutex = g_mutex_new (); file_handle->op = FILE_OP_NONE; return file_handle; } +static FileHandle * +file_handle_ref (FileHandle *file_handle) +{ + g_atomic_int_inc (&file_handle->refcount); + return file_handle; +} + +static gboolean +file_handle_unref (FileHandle *file_handle) +{ + return g_atomic_int_dec_and_test (&file_handle->refcount); +} + static void file_handle_close_stream (FileHandle *file_handle) { @@ -278,21 +294,19 @@ g_static_mutex_unlock (&global_mutex); } -static gboolean +static void free_file_handle_for_path (const gchar *path) { FileHandle *fh; - fh = get_file_handle_for_path (path); + g_static_mutex_lock (&global_mutex); + fh = g_hash_table_lookup (global_fh_table, path); if (fh) { - g_static_mutex_lock (&global_mutex); - g_hash_table_remove (global_fh_table, path); - g_static_mutex_unlock (&global_mutex); - return TRUE; + if (file_handle_unref (fh)) + g_hash_table_remove (global_fh_table, path); } - - return FALSE; + g_static_mutex_unlock (&global_mutex); } static MountRecord * @@ -923,6 +937,7 @@ /* File exists */ + file_handle_ref (fh); SET_FILE_HANDLE (fi, fh); debug_print ("vfs_open: flags=%o\n", fi->flags); @@ -1013,6 +1028,7 @@ /* Success */ + file_handle_ref (fh); SET_FILE_HANDLE (fi, fh); g_assert (fh->stream == NULL);