diff --git a/src/servers/media/Queue.cpp b/src/servers/media/Queue.cpp index e4a2c43bad..2cc8d8f42a 100644 --- a/src/servers/media/Queue.cpp +++ b/src/servers/media/Queue.cpp @@ -1,90 +1,81 @@ -/* +/* * 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 -#include -#include + + +/*! 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 "Queue.h" +#include +#include + + Queue::Queue() - : fList(new BList), - fLocker(new BLocker("queue locker")), + : + BLocker("queue locker"), fSem(create_sem(0, "queue sem")) { } + Queue::~Queue() { - if (fSem > 0) + if (fSem >= 0) delete_sem(fSem); - delete fLocker; - delete fList; } + status_t Queue::Terminate() { - status_t rv; + BAutolock _(this); - fLocker->Lock(); - if (fSem < 0) { - rv = B_ERROR; - } else { - delete_sem(fSem); - fSem = -1; - rv = B_OK; - } - fLocker->Unlock(); - return rv; + if (fSem < 0) + return B_ERROR; + + delete_sem(fSem); + fSem = -1; + return B_OK; } - + + status_t -Queue::AddItem(void *item) +Queue::AddItem(void* item) { - status_t rv; + BAutolock _(this); - fLocker->Lock(); - if (fSem < 0) { - rv = B_ERROR; - } else { - if (fList->AddItem(item)) { // AddItem returns a bool - release_sem(fSem); - rv = B_OK; - } else { - rv = B_ERROR; - } - } - fLocker->Unlock(); - return rv; + if (fSem < 0) + return B_ERROR; + + if (!fList.AddItem(item)) + return B_NO_MEMORY; + + release_sem(fSem); + return B_OK; } -void * + +void* Queue::RemoveItem() { - void *item; - // if the semaphore is deleted by Terminate(), // this will no longer block while (acquire_sem(fSem) == B_INTERRUPTED) ; - + + BAutolock _(this); + // 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; + return fList.RemoveItem((int32)0); } diff --git a/src/servers/media/Queue.h b/src/servers/media/Queue.h index ac717f2226..d23579d89b 100644 --- a/src/servers/media/Queue.h +++ b/src/servers/media/Queue.h @@ -1,21 +1,29 @@ -/* +/* * Copyright 2002, Marcus Overhagen. All rights reserved. * Distributed under the terms of the MIT License. */ +#ifndef QUEUE_H +#define QUEUE_H -class Queue -{ + +#include +#include + + +class Queue : BLocker { public: - Queue(); - ~Queue(); + Queue(); + ~Queue(); + + status_t Terminate(); + + status_t AddItem(void* item); + void* RemoveItem(); - status_t Terminate(); - - status_t AddItem(void *item); - void * RemoveItem(); - private: - BList *fList; - BLocker *fLocker; - sem_id fSem; + BList fList; + sem_id fSem; }; + + +#endif // QUEUE_H