adding a simple queue needed for the media server's handling of notifications

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@1298 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
beveloper 2002-09-29 22:07:10 +00:00
parent 378dd356b5
commit 7dd8568e6a
3 changed files with 113 additions and 0 deletions

View File

@ -7,5 +7,6 @@ Server media_server :
AppManager.cpp
BufferManager.cpp
NodeManager.cpp
Queue.cpp
;
LinkSharedOSLibs media_server : be libmedia.so root ;

View File

@ -0,0 +1,91 @@
/*
* Copyright 2002, Marcus Overhagen. All rights reserved.
* Distributed under the terms of the MIT License.
*/
/* This is a simple multi thread save queue.
*
* One thread calls AddItem() to add items, and when it
* is finished doing so, it calls Terminate(). Another
* thread calls RemoveItem() to remove items from the
* queue. RemoveItem() blocks when no items are available.
* As soon as Terminate() is called and the queue is empty,
* RemoveItem() returns NULL.
*/
#include <List.h>
#include <OS.h>
#include <Locker.h>
#include "Queue.h"
Queue::Queue()
: fList(new BList),
fLocker(new BLocker),
fSem(create_sem(0,"queue sem"))
{
}
Queue::~Queue()
{
if (fSem > 0)
delete_sem(fSem);
delete fLocker;
delete fList;
}
status_t
Queue::Terminate()
{
status_t rv;
fLocker->Lock();
if (fSem < 0) {
rv = B_ERROR;
} else {
delete_sem(fSem);
fSem = -1;
rv = B_OK;
}
fLocker->Unlock();
return rv;
}
status_t
Queue::AddItem(void *item)
{
status_t rv;
fLocker->Lock();
if (fSem < 0) {
rv = B_ERROR;
} else {
if (B_OK == fList->AddItem(item)) {
release_sem(fSem);
rv = B_OK;
} else {
rv = B_ERROR;
}
}
fLocker->Unlock();
return rv;
}
void *
Queue::RemoveItem()
{
status_t rv;
void *item;
// if the semaphore is deleted by Terminate(),
// this will no longer block
while (acquire_sem(fSem) == B_INTERRUPTED)
;
// if the list is empty, which can only happen after
// Terminate() was called, item will be NULL
fLocker->Lock();
item = fList->RemoveItem((int32)0);
fLocker->Unlock();
return item;
}

21
src/servers/media/Queue.h Normal file
View File

@ -0,0 +1,21 @@
/*
* Copyright 2002, Marcus Overhagen. All rights reserved.
* Distributed under the terms of the MIT License.
*/
class Queue
{
public:
Queue();
~Queue();
status_t Terminate();
status_t AddItem(void *item);
void * RemoveItem();
private:
BList *fList;
BLocker *fLocker;
sem_id fSem;
};