Alexandre Julliard : mountmgr: Increment the volume refcount in functions that return a volume.
Alexandre Julliard
julliard at winehq.org
Tue Aug 4 12:24:47 CDT 2009
Module: wine
Branch: master
Commit: b05ebca6181b26b0b1de9ed3a61560ae1807b30a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b05ebca6181b26b0b1de9ed3a61560ae1807b30a
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Aug 4 12:36:34 2009 +0200
mountmgr: Increment the volume refcount in functions that return a volume.
---
dlls/mountmgr.sys/device.c | 19 +++++++++++--------
1 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/dlls/mountmgr.sys/device.c b/dlls/mountmgr.sys/device.c
index 03b1f89..d17f878 100644
--- a/dlls/mountmgr.sys/device.c
+++ b/dlls/mountmgr.sys/device.c
@@ -310,9 +310,10 @@ static void delete_disk_device( struct disk_device *device )
}
/* grab another reference to a volume */
-static unsigned int grab_volume( struct volume *volume )
+static struct volume *grab_volume( struct volume *volume )
{
- return ++volume->ref;
+ volume->ref++;
+ return volume;
}
/* release a volume and delete the corresponding disk device when refcount is 0 */
@@ -320,9 +321,9 @@ static unsigned int release_volume( struct volume *volume )
{
unsigned int ret = --volume->ref;
- TRACE( "%s udi %s count now %u\n", debugstr_guid(&volume->guid), debugstr_a(volume->udi), ret );
if (!ret)
{
+ TRACE( "%s udi %s\n", debugstr_guid(&volume->guid), debugstr_a(volume->udi) );
assert( !volume->udi );
list_remove( &volume->entry );
if (volume->mount) delete_mount_point( volume->mount );
@@ -362,7 +363,7 @@ static NTSTATUS create_volume( const char *udi, enum device_type type, struct vo
{
if (udi) set_volume_udi( volume, udi );
list_add_tail( &volumes_list, &volume->entry );
- *volume_ret = volume;
+ *volume_ret = grab_volume( volume );
}
else RtlFreeHeap( GetProcessHeap(), 0, volume );
@@ -383,14 +384,13 @@ static NTSTATUS create_dos_device( struct volume *volume, const char *udi, int l
if (volume)
{
if (udi) set_volume_udi( volume, udi );
- drive->volume = volume;
+ drive->volume = grab_volume( volume );
status = STATUS_SUCCESS;
}
else status = create_volume( udi, type, &drive->volume );
if (status == STATUS_SUCCESS)
{
- grab_volume( drive->volume );
list_add_tail( &drives_list, &drive->entry );
*drive_ret = drive;
}
@@ -428,7 +428,7 @@ static struct volume *find_matching_volume( const char *udi, const char *device,
if (mount_point && disk_device->unix_mount && strcmp( mount_point, disk_device->unix_mount )) continue;
TRACE( "found matching volume %s for device %s mount %s type %u\n",
debugstr_guid(&volume->guid), debugstr_a(device), debugstr_a(mount_point), type );
- return volume;
+ return grab_volume( volume );
}
return NULL;
}
@@ -649,6 +649,7 @@ static void create_drive_devices(void)
RtlFreeHeap( GetProcessHeap(), 0, link );
RtlFreeHeap( GetProcessHeap(), 0, device );
}
+ if (volume) release_volume( volume );
}
RegCloseKey( drives_key );
RtlFreeHeap( GetProcessHeap(), 0, path );
@@ -674,6 +675,7 @@ NTSTATUS add_volume( const char *udi, const char *device, const char *mount_poin
found:
if (!status) status = set_volume_info( volume, NULL, device, mount_point, type, guid );
+ if (volume) release_volume( volume );
LeaveCriticalSection( &device_section );
return status;
}
@@ -746,7 +748,7 @@ NTSTATUS add_dos_device( int letter, const char *udi, const char *device,
found:
if (!guid && !volume) guid = get_default_uuid( letter );
- if (!volume) volume = drive->volume;
+ if (!volume) volume = grab_volume( drive->volume );
set_drive_info( drive, letter, volume );
p[0] = 'a' + drive->drive;
p[2] = 0;
@@ -776,6 +778,7 @@ found:
if (udi) notify = drive->drive;
done:
+ if (volume) release_volume( volume );
LeaveCriticalSection( &device_section );
RtlFreeHeap( GetProcessHeap(), 0, path );
if (notify != -1) send_notify( notify, DBT_DEVICEARRIVAL );
More information about the wine-cvs
mailing list