Browse Source

VLCKit: migrate VLCMediaLibrary to ARC

with enhanced thread safety

Signed-off-by: Felix Paul Kühne <fkuehne@videolan.org>
Florent Pillet 11 years ago
parent
commit
56809e9fbe
2 changed files with 22 additions and 19 deletions
  1. 3 2
      Headers/Public/VLCMediaLibrary.h
  2. 19 17
      Sources/VLCMediaLibrary.m

+ 3 - 2
Headers/Public/VLCMediaLibrary.h

@@ -32,11 +32,12 @@
 @interface VLCMediaLibrary : NSObject
 @interface VLCMediaLibrary : NSObject
 {
 {
     void * mlib;
     void * mlib;
-    VLCMediaList * allMedia;
 }
 }
+
 /* Factories */
 /* Factories */
 + (id)sharedMediaLibrary;
 + (id)sharedMediaLibrary;
 
 
 /* Properties */
 /* Properties */
-@property (readonly) VLCMediaList * allMedia;
+@property (nonatomic, readonly, strong) VLCMediaList * allMedia;
+
 @end
 @end

+ 19 - 17
Sources/VLCMediaLibrary.m

@@ -29,48 +29,50 @@
 
 
 #include <vlc/libvlc.h>
 #include <vlc/libvlc.h>
 
 
+@interface VLCMediaLibrary ()
+
+@property (nonatomic) dispatch_once_t once;
+@property (nonatomic, readwrite, strong) VLCMediaList * allMedia;
+
+@end
+
 @implementation VLCMediaLibrary
 @implementation VLCMediaLibrary
+
 + (id)sharedMediaLibrary
 + (id)sharedMediaLibrary
 {
 {
     static VLCMediaLibrary * sharedMediaLibrary = nil;
     static VLCMediaLibrary * sharedMediaLibrary = nil;
-    if( !sharedMediaLibrary )
-    {
+    static dispatch_once_t onceToken;
+
+    dispatch_once(&onceToken, ^{
         sharedMediaLibrary = [[VLCMediaLibrary alloc] init];
         sharedMediaLibrary = [[VLCMediaLibrary alloc] init];
-    }
+    });
+
     return sharedMediaLibrary;
     return sharedMediaLibrary;
 }
 }
 
 
 - (id)init
 - (id)init
 {
 {
-    if (self = [super init])
-    {
+    if (self = [super init]) {
         mlib = libvlc_media_library_new( [VLCLibrary sharedInstance]);
         mlib = libvlc_media_library_new( [VLCLibrary sharedInstance]);
-
         libvlc_media_library_load( mlib );
         libvlc_media_library_load( mlib );
-
-        allMedia = nil;
     }
     }
     return self;
     return self;
 }
 }
 
 
 - (void)dealloc
 - (void)dealloc
 {
 {
-    [allMedia release];
-
     libvlc_media_library_release(mlib);
     libvlc_media_library_release(mlib);
     mlib = nil;     // make sure that the pointer is dead
     mlib = nil;     // make sure that the pointer is dead
-
-    [super dealloc];
 }
 }
 
 
 - (VLCMediaList *)allMedia
 - (VLCMediaList *)allMedia
 {
 {
-    if( !allMedia )
-    {
+    dispatch_once(&_once, ^{
         libvlc_media_list_t * p_mlist = libvlc_media_library_media_list( mlib );
         libvlc_media_list_t * p_mlist = libvlc_media_library_media_list( mlib );
-        allMedia = [[VLCMediaList mediaListWithLibVLCMediaList:p_mlist] retain];
+        _allMedia = [VLCMediaList mediaListWithLibVLCMediaList:p_mlist];
         libvlc_media_list_release(p_mlist);
         libvlc_media_list_release(p_mlist);
-    }
-    return allMedia;
+    });
+    return _allMedia;
 }
 }
+
 @end
 @end