Turned the screens list into a singleton.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34373 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
#include <PrivateScreen.h>
|
#include <PrivateScreen.h>
|
||||||
|
|
||||||
#include <new>
|
#include <new>
|
||||||
|
#include <pthread.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <Application.h>
|
#include <Application.h>
|
||||||
@@ -25,6 +26,8 @@
|
|||||||
#include <ObjectList.h>
|
#include <ObjectList.h>
|
||||||
#include <Window.h>
|
#include <Window.h>
|
||||||
|
|
||||||
|
#include <AutoLocker.h>
|
||||||
|
|
||||||
#include <AppMisc.h>
|
#include <AppMisc.h>
|
||||||
#include <AppServerLink.h>
|
#include <AppServerLink.h>
|
||||||
#include <ServerProtocol.h>
|
#include <ServerProtocol.h>
|
||||||
@@ -33,10 +36,53 @@
|
|||||||
using namespace BPrivate;
|
using namespace BPrivate;
|
||||||
|
|
||||||
|
|
||||||
static BObjectList<BPrivateScreen> sScreens(2, true);
|
namespace {
|
||||||
|
|
||||||
// used to synchronize creation/deletion of the sScreen objects
|
struct Screens {
|
||||||
static BLocker sScreenLock("screen lock");
|
BObjectList<BPrivateScreen> list;
|
||||||
|
|
||||||
|
Screens()
|
||||||
|
:
|
||||||
|
list(2, true),
|
||||||
|
fLock("screen list")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Lock()
|
||||||
|
{
|
||||||
|
return fLock.Lock();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Unlock()
|
||||||
|
{
|
||||||
|
fLock.Unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
static Screens* Default()
|
||||||
|
{
|
||||||
|
if (sDefaultInstance == NULL)
|
||||||
|
pthread_once(&sDefaultInitOnce, &_InitSingleton);
|
||||||
|
|
||||||
|
return sDefaultInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
static void _InitSingleton()
|
||||||
|
{
|
||||||
|
sDefaultInstance = new Screens;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
BLocker fLock;
|
||||||
|
|
||||||
|
static pthread_once_t sDefaultInitOnce;
|
||||||
|
static Screens* sDefaultInstance;
|
||||||
|
};
|
||||||
|
|
||||||
|
pthread_once_t Screens::sDefaultInitOnce = PTHREAD_ONCE_INIT;
|
||||||
|
Screens* Screens::sDefaultInstance = NULL;
|
||||||
|
|
||||||
|
} // unnamed namespace
|
||||||
|
|
||||||
|
|
||||||
BPrivateScreen*
|
BPrivateScreen*
|
||||||
@@ -72,12 +118,13 @@ BPrivateScreen::_Get(int32 id, bool check)
|
|||||||
if (be_app == NULL)
|
if (be_app == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
BAutolock locker(sScreenLock);
|
Screens* screens = Screens::Default();
|
||||||
|
AutoLocker<Screens> locker(screens);
|
||||||
|
|
||||||
// search for the screen ID
|
// search for the screen ID
|
||||||
|
|
||||||
for (int32 i = sScreens.CountItems(); i-- > 0;) {
|
for (int32 i = screens->list.CountItems(); i-- > 0;) {
|
||||||
BPrivateScreen* screen = sScreens.ItemAt(i);
|
BPrivateScreen* screen = screens->list.ItemAt(i);
|
||||||
|
|
||||||
if (screen->ID() == id) {
|
if (screen->ID() == id) {
|
||||||
screen->_Acquire();
|
screen->_Acquire();
|
||||||
@@ -97,7 +144,7 @@ BPrivateScreen::_Get(int32 id, bool check)
|
|||||||
if (screen == NULL)
|
if (screen == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
sScreens.AddItem(screen);
|
screens->list.AddItem(screen);
|
||||||
return screen;
|
return screen;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,13 +155,14 @@ BPrivateScreen::Put(BPrivateScreen* screen)
|
|||||||
if (screen == NULL)
|
if (screen == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
BAutolock locker(sScreenLock);
|
Screens* screens = Screens::Default();
|
||||||
|
AutoLocker<Screens> locker(screens);
|
||||||
|
|
||||||
if (screen->_Release()) {
|
if (screen->_Release()) {
|
||||||
if (screen->ID() != B_MAIN_SCREEN_ID.id) {
|
if (screen->ID() != B_MAIN_SCREEN_ID.id) {
|
||||||
// we always keep the main screen object around - it will
|
// we always keep the main screen object around - it will
|
||||||
// never go away, even if you disconnect all monitors.
|
// never go away, even if you disconnect all monitors.
|
||||||
sScreens.RemoveItem(screen);
|
screens->list.RemoveItem(screen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -123,7 +171,8 @@ BPrivateScreen::Put(BPrivateScreen* screen)
|
|||||||
BPrivateScreen*
|
BPrivateScreen*
|
||||||
BPrivateScreen::GetNext(BPrivateScreen* screen)
|
BPrivateScreen::GetNext(BPrivateScreen* screen)
|
||||||
{
|
{
|
||||||
BAutolock locker(sScreenLock);
|
Screens* screens = Screens::Default();
|
||||||
|
AutoLocker<Screens> locker(screens);
|
||||||
|
|
||||||
int32 id;
|
int32 id;
|
||||||
status_t status = screen->GetNextID(id);
|
status_t status = screen->GetNextID(id);
|
||||||
@@ -277,7 +326,8 @@ const color_map*
|
|||||||
BPrivateScreen::ColorMap()
|
BPrivateScreen::ColorMap()
|
||||||
{
|
{
|
||||||
if (fColorMap == NULL) {
|
if (fColorMap == NULL) {
|
||||||
BAutolock locker(sScreenLock);
|
Screens* screens = Screens::Default();
|
||||||
|
AutoLocker<Screens> locker(screens);
|
||||||
|
|
||||||
if (fColorMap != NULL) {
|
if (fColorMap != NULL) {
|
||||||
// someone could have been faster than us
|
// someone could have been faster than us
|
||||||
|
|||||||
Reference in New Issue
Block a user