From 1c12dcb598d5ddbc792b24e6210c6f102ff85a5b Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Mon, 21 Dec 2009 21:00:21 +0000 Subject: [PATCH] IOSchedulerRoster: * Lock the notification service and check HasListeners(), so we don't prepare an event message needlessly. * The on-stack buffer for the event message was too small for I/O operation related events. Now a larger buffer belonging to the roster object is used. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34737 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/device_manager/IOScheduler.cpp | 10 +++++++--- src/system/kernel/device_manager/IOScheduler.h | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/system/kernel/device_manager/IOScheduler.cpp b/src/system/kernel/device_manager/IOScheduler.cpp index 394c6757e8..4be05a4605 100644 --- a/src/system/kernel/device_manager/IOScheduler.cpp +++ b/src/system/kernel/device_manager/IOScheduler.cpp @@ -910,9 +910,13 @@ void IOSchedulerRoster::Notify(uint32 eventCode, const IOScheduler* scheduler, IORequest* request, IOOperation* operation) { - char eventBuffer[128]; + AutoLocker locker(fNotificationService); + + if (!fNotificationService.HasListeners()) + return; + KMessage event; - event.SetTo(eventBuffer, sizeof(eventBuffer), IO_SCHEDULER_MONITOR); + event.SetTo(fEventBuffer, sizeof(fEventBuffer), IO_SCHEDULER_MONITOR); event.AddInt32("event", eventCode); event.AddPointer("scheduler", scheduler); if (request != NULL) { @@ -921,7 +925,7 @@ IOSchedulerRoster::Notify(uint32 eventCode, const IOScheduler* scheduler, event.AddPointer("operation", operation); } - fNotificationService.Notify(event, eventCode); + fNotificationService.NotifyLocked(event, eventCode); } diff --git a/src/system/kernel/device_manager/IOScheduler.h b/src/system/kernel/device_manager/IOScheduler.h index 54552651e5..baa7b8afdb 100644 --- a/src/system/kernel/device_manager/IOScheduler.h +++ b/src/system/kernel/device_manager/IOScheduler.h @@ -182,6 +182,7 @@ private: int32 fNextID; IOSchedulerList fSchedulers; DefaultNotificationService fNotificationService; + char fEventBuffer[256]; static IOSchedulerRoster sDefaultInstance; };