1/* 2 * Copyright 2013-2014, Haiku, Inc. All Rights Reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Ingo Weinhold <ingo_weinhold@gmx.de> 7 */ 8 9 10#include "JobQueue.h" 11 12#include <PthreadMutexLocker.h> 13 14 15// #pragma mark - JobQueue 16 17 18JobQueue::JobQueue() 19 : 20 fMutexInitialized(false), 21 fNewJobConditionInitialized(false), 22 fJobs(), 23 fClosed(false) 24{ 25} 26 27 28JobQueue::~JobQueue() 29{ 30 if (fMutexInitialized) { 31 PthreadMutexLocker mutexLocker(fMutex); 32 while (Job* job = fJobs.RemoveHead()) 33 job->ReleaseReference(); 34 } 35 36 if (fNewJobConditionInitialized) 37 pthread_cond_destroy(&fNewJobCondition); 38 39 if (fMutexInitialized) 40 pthread_mutex_destroy(&fMutex); 41} 42 43 44status_t 45JobQueue::Init() 46{ 47 status_t error = pthread_mutex_init(&fMutex, NULL); 48 if (error != B_OK) 49 return error; 50 fMutexInitialized = true; 51 52 error = pthread_cond_init(&fNewJobCondition, NULL); 53 if (error != B_OK) 54 return error; 55 fNewJobConditionInitialized = true; 56 57 return B_OK; 58} 59 60 61void 62JobQueue::Close() 63{ 64 if (fMutexInitialized && fNewJobConditionInitialized) { 65 PthreadMutexLocker mutexLocker(fMutex); 66 fClosed = true; 67 pthread_cond_broadcast(&fNewJobCondition); 68 } 69} 70 71 72bool 73JobQueue::QueueJob(Job* job) 74{ 75 PthreadMutexLocker mutexLocker(fMutex); 76 if (fClosed) 77 return false; 78 79 fJobs.Add(job); 80 job->AcquireReference(); 81 82 pthread_cond_signal(&fNewJobCondition); 83 return true; 84} 85 86 87Job* 88JobQueue::DequeueJob() 89{ 90 PthreadMutexLocker mutexLocker(fMutex); 91 92 while (!fClosed) { 93 Job* job = fJobs.RemoveHead(); 94 if (job != NULL) 95 return job; 96 97 if (!fClosed) 98 pthread_cond_wait(&fNewJobCondition, &fMutex); 99 } 100 101 return NULL; 102} 103 104 105void 106JobQueue::DeleteJobs(Filter* filter) 107{ 108 PthreadMutexLocker mutexLocker(fMutex); 109 110 for (JobList::Iterator it = fJobs.GetIterator(); Job* job = it.Next();) { 111 if (filter->FilterJob(job)) { 112 it.Remove(); 113 delete job; 114 } 115 } 116} 117 118 119// #pragma mark - Filter 120 121 122JobQueue::Filter::~Filter() 123{ 124} 125