]> granicus.if.org Git - handbrake/commitdiff
MacGui: add a recursive lock to HBDistributedArray.
authorDamiano Galassi <damiog@gmail.com>
Mon, 19 Oct 2015 15:52:32 +0000 (17:52 +0200)
committerDamiano Galassi <damiog@gmail.com>
Mon, 19 Oct 2015 15:52:32 +0000 (17:52 +0200)
macosx/HBDistributedArray.h
macosx/HBDistributedArray.m

index e72484aae133f87a72868e7f28df1127174315db..483f1ac572f77cb595c3b5ebff39fcd7299ebcf9 100644 (file)
@@ -18,6 +18,11 @@ extern NSString *HBDistributedArrayChanged;
 
 @end
 
+typedef NS_ENUM(NSUInteger, HBDistributedArrayContent) {
+    HBDistributedArrayContentAcquired,
+    HBDistributedArrayContentReload,
+};
+
 /**
  *  HBDistributedArray
  *  a mutable array that share its content between processes.
@@ -33,9 +38,11 @@ extern NSString *HBDistributedArrayChanged;
 - (instancetype)initWithURL:(NSURL *)fileURL;
 
 /**
- *  Begin a transaction on the array
+ *  Begins a transaction on the array
+ *
+ *  @return whether the array content changes or not after beginning the transaction.
  */
-- (void)beginTransaction;
+- (HBDistributedArrayContent)beginTransaction;
 
 /**
  *  Commit the changes and notify
index 704f828c415f7a68791476e94aac753bca8b03fd..867ee4ffbf8790bc3f049827a9b5b141eac9913c 100644 (file)
@@ -59,6 +59,7 @@ NSString *HBDistributedArraWrittenToDisk = @"HBDistributedArraWrittenToDisk";
 @property (nonatomic, readwrite) NSTimeInterval modifiedTime;
 
 @property (nonatomic, readonly) sem_t *mutex;
+@property (nonatomic, readwrite) uint32_t mutexCount;
 
 @end
 
@@ -87,7 +88,8 @@ NSString *HBDistributedArraWrittenToDisk = @"HBDistributedArraWrittenToDisk";
         // it can cause a deadlock if an instance
         // crashed while it has the lock on the semaphore.
         _mutex = sem_open(name, O_CREAT, 0777, 1);
-        if (_mutex == SEM_FAILED) {
+        if (_mutex == SEM_FAILED)
+        {
             NSLog(@"%s: %d\n", "Error in creating semaphore: ", errno);
         }
 
@@ -118,15 +120,25 @@ NSString *HBDistributedArraWrittenToDisk = @"HBDistributedArraWrittenToDisk";
 
 - (void)lock
 {
-    sem_wait(self.mutex);
+    if (self.mutexCount == 0)
+    {
+        sem_wait(self.mutex);
+    }
+
+    self.mutexCount++;
 }
 
 - (void)unlock
 {
-    sem_post(self.mutex);
+    if (self.mutexCount == 1)
+    {
+        sem_post(self.mutex);
+    }
+
+    self.mutexCount--;
 }
 
-- (void)beginTransaction
+- (HBDistributedArrayContent)beginTransaction
 {
     [self lock];
     // We got the lock, need to check if
@@ -135,16 +147,22 @@ NSString *HBDistributedArraWrittenToDisk = @"HBDistributedArraWrittenToDisk";
     // could have not received the notification yet
     NSDate *date = nil;
     [self.fileURL getResourceValue:&date forKey:NSURLAttributeModificationDateKey error:nil];
-    if (date.timeIntervalSinceReferenceDate > self.modifiedTime)
+    if (date.timeIntervalSinceReferenceDate > ceil(self.modifiedTime))
     {
         // File was modified while we waited on the lock
         // reload it
         [self reload];
+        NSLog(@"WTF");
+        return HBDistributedArrayContentReload;
     }
+
+    return HBDistributedArrayContentAcquired;
 }
 
 - (void)commit
 {
+    // Save changes to disk
+    // and unlock
     [self synchronize];
     [self unlock];
 }