xref: /haiku/src/add-ons/kernel/file_systems/nfs4/WorkQueue.h (revision 25a7b01d15612846f332751841da3579db313082)
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 Dziepak WorkQueue::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