xref: /haiku/src/system/kernel/device_manager/IOSchedulerRoster.cpp (revision 002f37b0cca92e4cf72857c72ac95db5a8b09615)
1 /*
2  * Copyright 2009-2010, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include "IOSchedulerRoster.h"
8 
9 #include <util/AutoLock.h>
10 
11 
12 /*static*/ IOSchedulerRoster IOSchedulerRoster::sDefaultInstance;
13 
14 
15 /*static*/ void
16 IOSchedulerRoster::Init()
17 {
18 	new(&sDefaultInstance) IOSchedulerRoster;
19 }
20 
21 
22 void
23 IOSchedulerRoster::AddScheduler(IOScheduler* scheduler)
24 {
25 	AutoLocker<IOSchedulerRoster> locker(this);
26 	fSchedulers.Add(scheduler);
27 	locker.Unlock();
28 
29 	Notify(IO_SCHEDULER_ADDED, scheduler);
30 }
31 
32 
33 void
34 IOSchedulerRoster::RemoveScheduler(IOScheduler* scheduler)
35 {
36 	AutoLocker<IOSchedulerRoster> locker(this);
37 	fSchedulers.Remove(scheduler);
38 	locker.Unlock();
39 
40 	Notify(IO_SCHEDULER_REMOVED, scheduler);
41 }
42 
43 
44 void
45 IOSchedulerRoster::Notify(uint32 eventCode, const IOScheduler* scheduler,
46 	IORequest* request, IOOperation* operation)
47 {
48 	AutoLocker<DefaultNotificationService> locker(fNotificationService);
49 
50 	if (!fNotificationService.HasListeners())
51 		return;
52 
53 	KMessage event;
54 	event.SetTo(fEventBuffer, sizeof(fEventBuffer), IO_SCHEDULER_MONITOR);
55 	event.AddInt32("event", eventCode);
56 	event.AddPointer("scheduler", scheduler);
57 	if (request != NULL) {
58 		event.AddPointer("request", request);
59 		if (operation != NULL)
60 			event.AddPointer("operation", operation);
61 	}
62 
63 	fNotificationService.NotifyLocked(event, eventCode);
64 }
65 
66 
67 int32
68 IOSchedulerRoster::NextID()
69 {
70 	AutoLocker<IOSchedulerRoster> locker(this);
71 	return fNextID++;
72 }
73 
74 
75 IOSchedulerRoster::IOSchedulerRoster()
76 	:
77 	fNextID(1),
78 	fNotificationService("I/O")
79 {
80 	mutex_init(&fLock, "IOSchedulerRoster");
81 	fNotificationService.Register();
82 }
83 
84 
85 IOSchedulerRoster::~IOSchedulerRoster()
86 {
87 	mutex_destroy(&fLock);
88 	fNotificationService.Unregister();
89 }
90