diff --git a/src/system/kernel/debug/system_profiler.cpp b/src/system/kernel/debug/system_profiler.cpp index e5f0abb95b..7420de9d20 100644 --- a/src/system/kernel/debug/system_profiler.cpp +++ b/src/system/kernel/debug/system_profiler.cpp @@ -27,7 +27,7 @@ #include -#include "IOScheduler.h" +#include "IOSchedulerRoster.h" // This is the kernel-side implementation of the system profiling support. diff --git a/src/system/kernel/device_manager/IOScheduler.cpp b/src/system/kernel/device_manager/IOScheduler.cpp index 5315253ff9..fbbc09ab1c 100644 --- a/src/system/kernel/device_manager/IOScheduler.cpp +++ b/src/system/kernel/device_manager/IOScheduler.cpp @@ -14,14 +14,14 @@ #include -#include - #include #include #include #include #include +#include "IOSchedulerRoster.h" + //#define TRACE_IO_SCHEDULER #ifdef TRACE_IO_SCHEDULER @@ -853,84 +853,3 @@ IOScheduler::_GetRequestOwner(team_id team, thread_id thread, bool allocate) fUnusedRequestOwners.MoveFrom(&existingOwners); return owner; } - - -// #pragma mark - IOSchedulerNotificationService - - -/*static*/ IOSchedulerRoster IOSchedulerRoster::sDefaultInstance; - - -/*static*/ void -IOSchedulerRoster::Init() -{ - new(&sDefaultInstance) IOSchedulerRoster; -} - - -void -IOSchedulerRoster::AddScheduler(IOScheduler* scheduler) -{ - AutoLocker locker(this); - fSchedulers.Add(scheduler); - locker.Unlock(); - - Notify(IO_SCHEDULER_ADDED, scheduler); -} - - -void -IOSchedulerRoster::RemoveScheduler(IOScheduler* scheduler) -{ - AutoLocker locker(this); - fSchedulers.Remove(scheduler); - locker.Unlock(); - - Notify(IO_SCHEDULER_REMOVED, scheduler); -} - - -void -IOSchedulerRoster::Notify(uint32 eventCode, const IOScheduler* scheduler, - IORequest* request, IOOperation* operation) -{ - AutoLocker locker(fNotificationService); - - if (!fNotificationService.HasListeners()) - return; - - KMessage event; - event.SetTo(fEventBuffer, sizeof(fEventBuffer), IO_SCHEDULER_MONITOR); - event.AddInt32("event", eventCode); - event.AddPointer("scheduler", scheduler); - if (request != NULL) { - event.AddPointer("request", request); - if (operation != NULL) - event.AddPointer("operation", operation); - } - - fNotificationService.NotifyLocked(event, eventCode); -} - - -int32 -IOSchedulerRoster::NextID() -{ - AutoLocker locker(this); - return fNextID++; -} - - -IOSchedulerRoster::IOSchedulerRoster() - : - fNextID(1), - fNotificationService("I/O") -{ - mutex_init(&fLock, "IOSchedulerRoster"); -} - - -IOSchedulerRoster::~IOSchedulerRoster() -{ - mutex_destroy(&fLock); -} diff --git a/src/system/kernel/device_manager/IOScheduler.h b/src/system/kernel/device_manager/IOScheduler.h index 3ec0deb67e..11e9f4c8f2 100644 --- a/src/system/kernel/device_manager/IOScheduler.h +++ b/src/system/kernel/device_manager/IOScheduler.h @@ -11,7 +11,6 @@ #include #include -#include #include #include @@ -20,16 +19,6 @@ #include "IORequest.h" -// I/O scheduler notifications -#define IO_SCHEDULER_MONITOR '_io_' -#define IO_SCHEDULER_ADDED 0x01 -#define IO_SCHEDULER_REMOVED 0x02 -#define IO_SCHEDULER_REQUEST_SCHEDULED 0x04 -#define IO_SCHEDULER_REQUEST_FINISHED 0x08 -#define IO_SCHEDULER_OPERATION_STARTED 0x10 -#define IO_SCHEDULER_OPERATION_FINISHED 0x20 - - struct IORequestOwner : DoublyLinkedListLinkImpl { team_id team; thread_id thread; @@ -136,45 +125,5 @@ private: volatile bool fTerminating; }; -typedef DoublyLinkedList IOSchedulerList; - - -class IOSchedulerRoster { -public: - static void Init(); - static IOSchedulerRoster* Default() { return &sDefaultInstance; } - - bool Lock() { return mutex_lock(&fLock) == B_OK; } - void Unlock() { mutex_unlock(&fLock); } - - const IOSchedulerList& SchedulerList() const - { return fSchedulers; } - // caller must keep the roster locked, - // while accessing the list - - void AddScheduler(IOScheduler* scheduler); - void RemoveScheduler(IOScheduler* scheduler); - - void Notify(uint32 eventCode, - const IOScheduler* scheduler, - IORequest* request = NULL, - IOOperation* operation = NULL); - - int32 NextID(); - -private: - IOSchedulerRoster(); - ~IOSchedulerRoster(); - -private: - mutex fLock; - int32 fNextID; - IOSchedulerList fSchedulers; - DefaultNotificationService fNotificationService; - char fEventBuffer[256]; - - static IOSchedulerRoster sDefaultInstance; -}; - #endif // IO_SCHEDULER_H diff --git a/src/system/kernel/device_manager/IOSchedulerRoster.cpp b/src/system/kernel/device_manager/IOSchedulerRoster.cpp new file mode 100644 index 0000000000..bacf3bf6cc --- /dev/null +++ b/src/system/kernel/device_manager/IOSchedulerRoster.cpp @@ -0,0 +1,87 @@ +/* + * Copyright 2009-2010, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ + + +#include "IOSchedulerRoster.h" + +#include + + +/*static*/ IOSchedulerRoster IOSchedulerRoster::sDefaultInstance; + + +/*static*/ void +IOSchedulerRoster::Init() +{ + new(&sDefaultInstance) IOSchedulerRoster; +} + + +void +IOSchedulerRoster::AddScheduler(IOScheduler* scheduler) +{ + AutoLocker locker(this); + fSchedulers.Add(scheduler); + locker.Unlock(); + + Notify(IO_SCHEDULER_ADDED, scheduler); +} + + +void +IOSchedulerRoster::RemoveScheduler(IOScheduler* scheduler) +{ + AutoLocker locker(this); + fSchedulers.Remove(scheduler); + locker.Unlock(); + + Notify(IO_SCHEDULER_REMOVED, scheduler); +} + + +void +IOSchedulerRoster::Notify(uint32 eventCode, const IOScheduler* scheduler, + IORequest* request, IOOperation* operation) +{ + AutoLocker locker(fNotificationService); + + if (!fNotificationService.HasListeners()) + return; + + KMessage event; + event.SetTo(fEventBuffer, sizeof(fEventBuffer), IO_SCHEDULER_MONITOR); + event.AddInt32("event", eventCode); + event.AddPointer("scheduler", scheduler); + if (request != NULL) { + event.AddPointer("request", request); + if (operation != NULL) + event.AddPointer("operation", operation); + } + + fNotificationService.NotifyLocked(event, eventCode); +} + + +int32 +IOSchedulerRoster::NextID() +{ + AutoLocker locker(this); + return fNextID++; +} + + +IOSchedulerRoster::IOSchedulerRoster() + : + fNextID(1), + fNotificationService("I/O") +{ + mutex_init(&fLock, "IOSchedulerRoster"); +} + + +IOSchedulerRoster::~IOSchedulerRoster() +{ + mutex_destroy(&fLock); +} diff --git a/src/system/kernel/device_manager/IOSchedulerRoster.h b/src/system/kernel/device_manager/IOSchedulerRoster.h new file mode 100644 index 0000000000..f43f9afc05 --- /dev/null +++ b/src/system/kernel/device_manager/IOSchedulerRoster.h @@ -0,0 +1,66 @@ +/* + * Copyright 2009-2010, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ +#ifndef IO_SCHEDULER_ROSTER_H +#define IO_SCHEDULER_ROSTER_H + + +#include + +#include "IOScheduler.h" + + +// I/O scheduler notifications +#define IO_SCHEDULER_MONITOR '_io_' +#define IO_SCHEDULER_ADDED 0x01 +#define IO_SCHEDULER_REMOVED 0x02 +#define IO_SCHEDULER_REQUEST_SCHEDULED 0x04 +#define IO_SCHEDULER_REQUEST_FINISHED 0x08 +#define IO_SCHEDULER_OPERATION_STARTED 0x10 +#define IO_SCHEDULER_OPERATION_FINISHED 0x20 + + + +typedef DoublyLinkedList IOSchedulerList; + + +class IOSchedulerRoster { +public: + static void Init(); + static IOSchedulerRoster* Default() { return &sDefaultInstance; } + + bool Lock() { return mutex_lock(&fLock) == B_OK; } + void Unlock() { mutex_unlock(&fLock); } + + const IOSchedulerList& SchedulerList() const + { return fSchedulers; } + // caller must keep the roster locked, + // while accessing the list + + void AddScheduler(IOScheduler* scheduler); + void RemoveScheduler(IOScheduler* scheduler); + + void Notify(uint32 eventCode, + const IOScheduler* scheduler, + IORequest* request = NULL, + IOOperation* operation = NULL); + + int32 NextID(); + +private: + IOSchedulerRoster(); + ~IOSchedulerRoster(); + +private: + mutex fLock; + int32 fNextID; + IOSchedulerList fSchedulers; + DefaultNotificationService fNotificationService; + char fEventBuffer[256]; + + static IOSchedulerRoster sDefaultInstance; +}; + + +#endif // IO_SCHEDULER_ROSTER_H diff --git a/src/system/kernel/device_manager/Jamfile b/src/system/kernel/device_manager/Jamfile index 406b747bcb..ed84cc3c0d 100644 --- a/src/system/kernel/device_manager/Jamfile +++ b/src/system/kernel/device_manager/Jamfile @@ -19,6 +19,7 @@ KernelMergeObject kernel_device_manager.o : IOCallback.cpp IORequest.cpp IOScheduler.cpp + IOSchedulerRoster.cpp : $(TARGET_KERNEL_PIC_CCFLAGS) ; diff --git a/src/system/kernel/device_manager/device_manager.cpp b/src/system/kernel/device_manager/device_manager.cpp index 2de7950299..d2436d8e54 100644 --- a/src/system/kernel/device_manager/device_manager.cpp +++ b/src/system/kernel/device_manager/device_manager.cpp @@ -32,7 +32,7 @@ #include "id_generator.h" #include "IORequest.h" #include "io_resources.h" -#include "IOScheduler.h" +#include "IOSchedulerRoster.h" //#define TRACE_DEVICE_MANAGER