[prev in list] [next in list] [prev in thread] [next in thread] 

List:       haiku-commits
Subject:    [haiku-commits] r34384 - haiku/trunk/src/kits/storage/disk_device
From:       ingo_weinhold () gmx ! de
Date:       2009-11-30 16:33:41
Message-ID: 20091130163341.96FFF682D3 () vmsvn ! haiku-os ! org
[Download RAW message or body]

Author: bonefish
Date: 2009-11-30 17:33:41 +0100 (Mon, 30 Nov 2009)
New Revision: 34384
Changeset: http://dev.haiku-os.org/changeset/34384/haiku

Modified:
   haiku/trunk/src/kits/storage/disk_device/DiskSystemAddOnManager.cpp
   haiku/trunk/src/kits/storage/disk_device/DiskSystemAddOnManager.h
Log:
Use pthread_once() to guard the singleton initialization.


Modified: haiku/trunk/src/kits/storage/disk_device/DiskSystemAddOnManager.cpp
===================================================================
--- haiku/trunk/src/kits/storage/disk_device/DiskSystemAddOnManager.cpp	2009-11-30 \
                16:26:10 UTC (rev 34383)
+++ haiku/trunk/src/kits/storage/disk_device/DiskSystemAddOnManager.cpp	2009-11-30 \
16:33:41 UTC (rev 34384) @@ -1,5 +1,5 @@
 /*
- * Copyright 2007, Ingo Weinhold, bonefish@users.sf.net.
+ * Copyright 2007-2009, Ingo Weinhold, bonefish@users.sf.net.
  * Distributed under the terms of the MIT License.
  */
 
@@ -17,7 +17,6 @@
 #include <image.h>
 #include <Path.h>
 
-#include <AppMisc.h>
 #include <AutoDeleter.h>
 #include <AutoLocker.h>
 
@@ -32,7 +31,7 @@
 using std::nothrow;
 
 
-// sManager
+static pthread_once_t sManagerInitOnce = PTHREAD_ONCE_INIT;
 DiskSystemAddOnManager* DiskSystemAddOnManager::sManager = NULL;
 
 
@@ -78,23 +77,9 @@
 DiskSystemAddOnManager*
 DiskSystemAddOnManager::Default()
 {
-	if (!sManager) {
-		DiskSystemAddOnManager* manager = new DiskSystemAddOnManager();
+	if (sManager == NULL)
+		pthread_once(&sManagerInitOnce, &_InitSingleton);
 
-		BPrivate::gInitializationLock.Lock();
-
-		// set manager, if no one beat us to it
-		if (!sManager) {
-			sManager = manager;
-			manager = NULL;
-		}
-
-		BPrivate::gInitializationLock.Unlock();
-
-		// delete the object we created, if someone else was quicker
-		delete manager;
-	}
-
 	return sManager;
 }
 
@@ -238,6 +223,13 @@
 }
 
 
+/*static*/ void
+DiskSystemAddOnManager::_InitSingleton()
+{
+	sManager = new DiskSystemAddOnManager();
+}
+
+
 // _AddOnAt
 DiskSystemAddOnManager::AddOn*
 DiskSystemAddOnManager::_AddOnAt(int32 index) const
@@ -369,4 +361,3 @@
 
 	return B_OK;
 }
-

Modified: haiku/trunk/src/kits/storage/disk_device/DiskSystemAddOnManager.h
===================================================================
--- haiku/trunk/src/kits/storage/disk_device/DiskSystemAddOnManager.h	2009-11-30 \
                16:26:10 UTC (rev 34383)
+++ haiku/trunk/src/kits/storage/disk_device/DiskSystemAddOnManager.h	2009-11-30 \
16:33:41 UTC (rev 34384) @@ -42,6 +42,8 @@
 
 								DiskSystemAddOnManager();
 
+	static	void				_InitSingleton();
+
 			AddOn*				_AddOnAt(int32 index) const;
 			void				_PutAddOn(int32 index);
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic