[vlc-commits] macosx: fixed a thread-safety issue in the open panel code
Colin Delacroix
git at videolan.org
Fri Mar 30 17:49:06 CEST 2012
vlc | branch: master | Colin Delacroix <colin at zoy.org> | Thu Mar 29 15:19:09 2012 +0200| [35e8ad40158caf05b597d258609cb2c0570eaf0d] | committer: Felix Paul Kühne
macosx: fixed a thread-safety issue in the open panel code
VLC crashed when mounting multiple volumes at once
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=35e8ad40158caf05b597d258609cb2c0570eaf0d
---
modules/gui/macosx/open.m | 62 +++++++++++++++++++++------------------------
1 files changed, 29 insertions(+), 33 deletions(-)
diff --git a/modules/gui/macosx/open.m b/modules/gui/macosx/open.m
index 0f00bea..182185e 100644
--- a/modules/gui/macosx/open.m
+++ b/modules/gui/macosx/open.m
@@ -871,62 +871,53 @@ static VLCOpen *_o_sharedMainInstance = nil;
return returnValue;
}
-- (void)showOpticalAtIndex: (NSNumber *)n_index
+- (void)showOpticalAtPath: (NSString *)o_opticalDevicePath
{
NSAutoreleasePool * o_pool = [[NSAutoreleasePool alloc] init];
- if (!o_opticalDevices)
- return;
-
- if ([o_opticalDevices count] == 0)
- return;
-
- unsigned int index = [n_index intValue];
-
- id o_currentOpticalDevice = [o_opticalDevices objectAtIndex: index];
- char *diskType = [self getVolumeTypeFromMountPath:o_currentOpticalDevice];
+ char *diskType = [self getVolumeTypeFromMountPath:o_opticalDevicePath];
if (diskType == kVLCMediaDVD || diskType == kVLCMediaVideoTSFolder)
{
- [o_disc_dvd_lbl setStringValue: [[NSFileManager defaultManager] displayNameAtPath:o_currentOpticalDevice]];
+ [o_disc_dvd_lbl setStringValue: [[NSFileManager defaultManager] displayNameAtPath:o_opticalDevicePath]];
[o_disc_dvdwomenus_lbl setStringValue: [o_disc_dvd_lbl stringValue]];
NSString *pathToOpen;
if (diskType == kVLCMediaVideoTSFolder)
- pathToOpen = o_currentOpticalDevice;
+ pathToOpen = o_opticalDevicePath;
else
- pathToOpen = [self getBSDNodeFromMountPath: o_currentOpticalDevice];
+ pathToOpen = [self getBSDNodeFromMountPath: o_opticalDevicePath];
if (!b_nodvdmenus) {
[self setMRL: [NSString stringWithFormat: @"dvdnav://%@", pathToOpen]];
- [self showOpticalMediaView: o_disc_dvd_view withIcon: [[NSWorkspace sharedWorkspace] iconForFile: o_currentOpticalDevice]];
+ [self showOpticalMediaView: o_disc_dvd_view withIcon: [[NSWorkspace sharedWorkspace] iconForFile: o_opticalDevicePath]];
} else {
[self setMRL: [NSString stringWithFormat: @"dvdread://%@#%i:%i-", pathToOpen, [o_disc_dvdwomenus_title intValue], [o_disc_dvdwomenus_chapter intValue]]];
- [self showOpticalMediaView: o_disc_dvdwomenus_view withIcon: [[NSWorkspace sharedWorkspace] iconForFile: o_currentOpticalDevice]];
+ [self showOpticalMediaView: o_disc_dvdwomenus_view withIcon: [[NSWorkspace sharedWorkspace] iconForFile: o_opticalDevicePath]];
}
}
else if (diskType == kVLCMediaAudioCD)
{
- [o_disc_audiocd_lbl setStringValue: [[NSFileManager defaultManager] displayNameAtPath: o_currentOpticalDevice]];
- [o_disc_audiocd_trackcount_lbl setStringValue: [NSString stringWithFormat:_NS("%i tracks"), [[[NSFileManager defaultManager] subpathsOfDirectoryAtPath: o_currentOpticalDevice error:NULL] count] - 1]]; // minus .TOC.plist
- [self showOpticalMediaView: o_disc_audiocd_view withIcon: [[NSWorkspace sharedWorkspace] iconForFile: o_currentOpticalDevice]];
- [self setMRL: [NSString stringWithFormat: @"cdda://%@", [self getBSDNodeFromMountPath: o_currentOpticalDevice]]];
+ [o_disc_audiocd_lbl setStringValue: [[NSFileManager defaultManager] displayNameAtPath: o_opticalDevicePath]];
+ [o_disc_audiocd_trackcount_lbl setStringValue: [NSString stringWithFormat:_NS("%i tracks"), [[[NSFileManager defaultManager] subpathsOfDirectoryAtPath: o_opticalDevicePath error:NULL] count] - 1]]; // minus .TOC.plist
+ [self showOpticalMediaView: o_disc_audiocd_view withIcon: [[NSWorkspace sharedWorkspace] iconForFile: o_opticalDevicePath]];
+ [self setMRL: [NSString stringWithFormat: @"cdda://%@", [self getBSDNodeFromMountPath: o_opticalDevicePath]]];
}
else if (diskType == kVLCMediaVCD)
{
- [o_disc_vcd_lbl setStringValue: [[NSFileManager defaultManager] displayNameAtPath: o_currentOpticalDevice]];
- [self showOpticalMediaView: o_disc_vcd_view withIcon: [[NSWorkspace sharedWorkspace] iconForFile: o_currentOpticalDevice]];
- [self setMRL: [NSString stringWithFormat: @"vcd://%@#%i:%i", [self getBSDNodeFromMountPath: o_currentOpticalDevice], [o_disc_vcd_title intValue], [o_disc_vcd_chapter intValue]]];
+ [o_disc_vcd_lbl setStringValue: [[NSFileManager defaultManager] displayNameAtPath: o_opticalDevicePath]];
+ [self showOpticalMediaView: o_disc_vcd_view withIcon: [[NSWorkspace sharedWorkspace] iconForFile: o_opticalDevicePath]];
+ [self setMRL: [NSString stringWithFormat: @"vcd://%@#%i:%i", [self getBSDNodeFromMountPath: o_opticalDevicePath], [o_disc_vcd_title intValue], [o_disc_vcd_chapter intValue]]];
}
else if (diskType == kVLCMediaSVCD)
{
- [o_disc_vcd_lbl setStringValue: [[NSFileManager defaultManager] displayNameAtPath: o_currentOpticalDevice]];
- [self showOpticalMediaView: o_disc_vcd_view withIcon: [[NSWorkspace sharedWorkspace] iconForFile: o_currentOpticalDevice]];
- [self setMRL: [NSString stringWithFormat: @"vcd://%@@%i:%i", [self getBSDNodeFromMountPath: o_currentOpticalDevice], [o_disc_vcd_title intValue], [o_disc_vcd_chapter intValue]]];
+ [o_disc_vcd_lbl setStringValue: [[NSFileManager defaultManager] displayNameAtPath: o_opticalDevicePath]];
+ [self showOpticalMediaView: o_disc_vcd_view withIcon: [[NSWorkspace sharedWorkspace] iconForFile: o_opticalDevicePath]];
+ [self setMRL: [NSString stringWithFormat: @"vcd://%@@%i:%i", [self getBSDNodeFromMountPath: o_opticalDevicePath], [o_disc_vcd_title intValue], [o_disc_vcd_chapter intValue]]];
}
else if (diskType == kVLCMediaBD || diskType == kVLCMediaBDMVFolder)
{
- [o_disc_bd_lbl setStringValue: [[NSFileManager defaultManager] displayNameAtPath: o_currentOpticalDevice]];
- [self showOpticalMediaView: o_disc_bd_view withIcon: [[NSWorkspace sharedWorkspace] iconForFile: o_currentOpticalDevice]];
- [self setMRL: [NSString stringWithFormat: @"bluray://%@", o_currentOpticalDevice]];
+ [o_disc_bd_lbl setStringValue: [[NSFileManager defaultManager] displayNameAtPath: o_opticalDevicePath]];
+ [self showOpticalMediaView: o_disc_bd_view withIcon: [[NSWorkspace sharedWorkspace] iconForFile: o_opticalDevicePath]];
+ [self setMRL: [NSString stringWithFormat: @"bluray://%@", o_opticalDevicePath]];
}
else
{
@@ -937,13 +928,18 @@ static VLCOpen *_o_sharedMainInstance = nil;
[o_pool release];
}
+- (void)showSelectedOpticalDisc
+{
+ NSString *o_opticalDevicePath = [o_opticalDevices objectAtIndex:[o_disc_selector_pop indexOfSelectedItem]];
+ [NSThread detachNewThreadSelector:@selector(showOpticalAtPath:) toTarget:self withObject:o_opticalDevicePath];
+}
+
- (void)scanOpticalMedia:(NSNotification *)o_notification
{
[o_opticalDevices removeAllObjects];
[o_disc_selector_pop removeAllItems];
[o_opticalDevices addObjectsFromArray: [[NSWorkspace sharedWorkspace] mountedRemovableMedia]];
- if ([o_specialMediaFolders count] > 0)
- [o_opticalDevices addObjectsFromArray: o_specialMediaFolders];
+ [o_opticalDevices addObjectsFromArray: o_specialMediaFolders];
if ([o_opticalDevices count] > 0) {
NSUInteger deviceCount = [o_opticalDevices count];
for (NSUInteger i = 0; i < deviceCount ; i++)
@@ -954,7 +950,7 @@ static VLCOpen *_o_sharedMainInstance = nil;
else
[o_disc_selector_pop setHidden: NO];
- [NSThread detachNewThreadSelector:@selector(showOpticalAtIndex:) toTarget:self withObject:[NSNumber numberWithInt:[o_disc_selector_pop indexOfSelectedItem]]];
+ [self showSelectedOpticalDisc];
}
else
{
@@ -966,7 +962,7 @@ static VLCOpen *_o_sharedMainInstance = nil;
- (IBAction)discSelectorChanged:(id)sender
{
- [NSThread detachNewThreadSelector:@selector(showOpticalAtIndex:) toTarget:self withObject:[NSNumber numberWithInt:[o_disc_selector_pop indexOfSelectedItem]]];
+ [self showSelectedOpticalDisc];
}
- (IBAction)openSpecialMediaFolder:(id)sender
More information about the vlc-commits
mailing list