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