1*41217416SPawel Dziepak /* 2*41217416SPawel Dziepak * Copyright 2012 Haiku, Inc. All rights reserved. 3*41217416SPawel Dziepak * Distributed under the terms of the MIT License. 4*41217416SPawel Dziepak * 5*41217416SPawel Dziepak * Authors: 6*41217416SPawel Dziepak * Paweł Dziepak, pdziepak@quarnos.org 7*41217416SPawel Dziepak */ 8*41217416SPawel Dziepak #ifndef WORKQUEUE_H 9*41217416SPawel Dziepak #define WORKQUEUE_H 10*41217416SPawel Dziepak 11*41217416SPawel Dziepak 12*41217416SPawel Dziepak #include <io_requests.h> 13*41217416SPawel Dziepak #include <lock.h> 14*41217416SPawel Dziepak #include <SupportDefs.h> 15*41217416SPawel Dziepak #include <util/DoublyLinkedList.h> 16*41217416SPawel Dziepak 17*41217416SPawel Dziepak #include "Delegation.h" 18*41217416SPawel Dziepak #include "Inode.h" 19*41217416SPawel Dziepak 20*41217416SPawel Dziepak 21*41217416SPawel Dziepak enum JobType { 22*41217416SPawel Dziepak DelegationRecall, 23*41217416SPawel Dziepak IORequest 24*41217416SPawel Dziepak }; 25*41217416SPawel Dziepak 26*41217416SPawel Dziepak struct DelegationRecallArgs { 27*41217416SPawel Dziepak Delegation* fDelegation; 28*41217416SPawel Dziepak bool fTruncate; 29*41217416SPawel Dziepak }; 30*41217416SPawel Dziepak 31*41217416SPawel Dziepak struct IORequestArgs { 32*41217416SPawel Dziepak io_request* fRequest; 33*41217416SPawel Dziepak Inode* fInode; 34*41217416SPawel Dziepak }; 35*41217416SPawel Dziepak 36*41217416SPawel Dziepak struct WorkQueueEntry : public DoublyLinkedListLinkImpl<WorkQueueEntry> { 37*41217416SPawel Dziepak JobType fType; 38*41217416SPawel Dziepak void* fArguments; 39*41217416SPawel Dziepak }; 40*41217416SPawel Dziepak 41*41217416SPawel Dziepak class WorkQueue { 42*41217416SPawel Dziepak public: 43*41217416SPawel Dziepak WorkQueue(); 44*41217416SPawel Dziepak ~WorkQueue(); 45*41217416SPawel Dziepak 46*41217416SPawel Dziepak inline status_t InitStatus(); 47*41217416SPawel Dziepak 48*41217416SPawel Dziepak status_t EnqueueJob(JobType type, void* args); 49*41217416SPawel Dziepak 50*41217416SPawel Dziepak protected: 51*41217416SPawel Dziepak static status_t LaunchWorkingThread(void* object); 52*41217416SPawel Dziepak status_t WorkingThread(); 53*41217416SPawel Dziepak 54*41217416SPawel Dziepak void DequeueJob(); 55*41217416SPawel Dziepak 56*41217416SPawel Dziepak void JobRecall(DelegationRecallArgs* args); 57*41217416SPawel Dziepak void JobIO(IORequestArgs* args); 58*41217416SPawel Dziepak 59*41217416SPawel Dziepak private: 60*41217416SPawel Dziepak status_t fInitError; 61*41217416SPawel Dziepak 62*41217416SPawel Dziepak sem_id fQueueSemaphore; 63*41217416SPawel Dziepak mutex fQueueLock; 64*41217416SPawel Dziepak DoublyLinkedList<WorkQueueEntry> fQueue; 65*41217416SPawel Dziepak 66*41217416SPawel Dziepak sem_id fThreadCancel; 67*41217416SPawel Dziepak thread_id fThread; 68*41217416SPawel Dziepak }; 69*41217416SPawel Dziepak 70*41217416SPawel Dziepak 71*41217416SPawel Dziepak inline status_t InitStatus()72*41217416SPawel DziepakWorkQueue::InitStatus() 73*41217416SPawel Dziepak { 74*41217416SPawel Dziepak return fInitError; 75*41217416SPawel Dziepak } 76*41217416SPawel Dziepak 77*41217416SPawel Dziepak 78*41217416SPawel Dziepak extern WorkQueue* gWorkQueue; 79*41217416SPawel Dziepak 80*41217416SPawel Dziepak 81*41217416SPawel Dziepak #endif // WORKQUEUE_H 82*41217416SPawel Dziepak 83