kernel, libroot: Make scheduler modes interface public
This commit is contained in:
@@ -49,6 +49,11 @@ enum be_task_flags {
|
|||||||
B_MIDI_PROCESSING = 0x800
|
B_MIDI_PROCESSING = 0x800
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum scheduler_mode {
|
||||||
|
SCHEDULER_MODE_LOW_LATENCY,
|
||||||
|
SCHEDULER_MODE_POWER_SAVING,
|
||||||
|
};
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
@@ -58,6 +63,9 @@ int32 suggest_thread_priority(uint32 task_flags = B_DEFAULT_MEDIA_PRIORITY,
|
|||||||
bigtime_t estimate_max_scheduling_latency(thread_id th = -1);
|
bigtime_t estimate_max_scheduling_latency(thread_id th = -1);
|
||||||
/* default is current thread */
|
/* default is current thread */
|
||||||
|
|
||||||
|
status_t set_scheduler_mode(int32 mode);
|
||||||
|
int32 get_scheduler_mode(void);
|
||||||
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|
||||||
@@ -67,6 +75,9 @@ int32 suggest_thread_priority(uint32 what, int32 period, bigtime_t jitter,
|
|||||||
bigtime_t estimate_max_scheduling_latency(thread_id th);
|
bigtime_t estimate_max_scheduling_latency(thread_id th);
|
||||||
/* default is current thread */
|
/* default is current thread */
|
||||||
|
|
||||||
|
status_t set_scheduler_mode(int32 mode);
|
||||||
|
int32 get_scheduler_mode(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // SCHEDULER_H
|
#endif // SCHEDULER_H
|
||||||
|
|||||||
@@ -18,12 +18,10 @@ struct scheduling_analysis;
|
|||||||
struct SchedulerListener;
|
struct SchedulerListener;
|
||||||
|
|
||||||
|
|
||||||
typedef enum scheduler_mode {
|
enum scheduler_mode {
|
||||||
SCHEDULER_MODE_LOW_LATENCY,
|
SCHEDULER_MODE_LOW_LATENCY,
|
||||||
SCHEDULER_MODE_POWER_SAVING,
|
SCHEDULER_MODE_POWER_SAVING,
|
||||||
// ...
|
};
|
||||||
SCHEDULER_MODE_COUNT
|
|
||||||
} scheduler_mode;
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
@@ -95,6 +93,9 @@ bigtime_t _user_estimate_max_scheduling_latency(thread_id thread);
|
|||||||
status_t _user_analyze_scheduling(bigtime_t from, bigtime_t until, void* buffer,
|
status_t _user_analyze_scheduling(bigtime_t from, bigtime_t until, void* buffer,
|
||||||
size_t size, struct scheduling_analysis* analysis);
|
size_t size, struct scheduling_analysis* analysis);
|
||||||
|
|
||||||
|
status_t _user_set_scheduler_mode(int32 mode);
|
||||||
|
int32 _user_get_scheduler_mode(void);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -192,6 +192,9 @@ extern status_t _kern_unblock_threads(thread_id* threads, uint32 count,
|
|||||||
|
|
||||||
extern bigtime_t _kern_estimate_max_scheduling_latency(thread_id thread);
|
extern bigtime_t _kern_estimate_max_scheduling_latency(thread_id thread);
|
||||||
|
|
||||||
|
extern status_t _kern_set_scheduler_mode(int32 mode);
|
||||||
|
extern int32 _kern_get_scheduler_mode(void);
|
||||||
|
|
||||||
// user/group functions
|
// user/group functions
|
||||||
extern gid_t _kern_getgid(bool effective);
|
extern gid_t _kern_getgid(bool effective);
|
||||||
extern uid_t _kern_getuid(bool effective);
|
extern uid_t _kern_getuid(bool effective);
|
||||||
|
|||||||
@@ -42,6 +42,7 @@
|
|||||||
#include <Screen.h>
|
#include <Screen.h>
|
||||||
#include <TextView.h>
|
#include <TextView.h>
|
||||||
|
|
||||||
|
#include <scheduler.h>
|
||||||
#include <syscalls.h>
|
#include <syscalls.h>
|
||||||
|
|
||||||
#include "AutoIcon.h"
|
#include "AutoIcon.h"
|
||||||
@@ -441,6 +442,14 @@ ProcessController::MessageReceived(BMessage *message)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case 'Schd':
|
||||||
|
{
|
||||||
|
int32 mode;
|
||||||
|
if (message->FindInt32 ("mode", &mode) == B_OK)
|
||||||
|
set_scheduler_mode(mode);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case B_ABOUT_REQUESTED:
|
case B_ABOUT_REQUESTED:
|
||||||
AboutRequested();
|
AboutRequested();
|
||||||
break;
|
break;
|
||||||
@@ -786,6 +795,21 @@ thread_popup(void *arg)
|
|||||||
addtopbottom (new BSeparatorItem ());
|
addtopbottom (new BSeparatorItem ());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Scheduler modes
|
||||||
|
static const char* schedulerModes[] = { "Low Latency", "Power Saving" };
|
||||||
|
unsigned int modesCount = sizeof(schedulerModes) / sizeof(const char*);
|
||||||
|
int32 currentMode = get_scheduler_mode();
|
||||||
|
for (unsigned int i = 0; i < modesCount; i++) {
|
||||||
|
BMessage* m = new BMessage('Schd');
|
||||||
|
m->AddInt32("mode", i);
|
||||||
|
item = new BMenuItem(B_TRANSLATE(schedulerModes[i]), m);
|
||||||
|
if ((uint32)currentMode == i)
|
||||||
|
item->SetMarked(true);
|
||||||
|
item->SetTarget(gPCView);
|
||||||
|
addtopbottom(item);
|
||||||
|
}
|
||||||
|
addtopbottom(new BSeparatorItem());
|
||||||
|
|
||||||
if (!be_roster->IsRunning(kTrackerSig)) {
|
if (!be_roster->IsRunning(kTrackerSig)) {
|
||||||
item = new IconMenuItem(gPCView->fTrackerIcon,
|
item = new IconMenuItem(gPCView->fTrackerIcon,
|
||||||
B_TRANSLATE("Restart Tracker"), new BMessage('Trac'));
|
B_TRANSLATE("Restart Tracker"), new BMessage('Trac'));
|
||||||
|
|||||||
@@ -43,8 +43,9 @@ static bool sSchedulerEnabled;
|
|||||||
SchedulerListenerList gSchedulerListeners;
|
SchedulerListenerList gSchedulerListeners;
|
||||||
spinlock gSchedulerListenersLock = B_SPINLOCK_INITIALIZER;
|
spinlock gSchedulerListenersLock = B_SPINLOCK_INITIALIZER;
|
||||||
|
|
||||||
static struct scheduler_mode_operations* sCurrentMode;
|
static scheduler_mode sCurrentModeID;
|
||||||
static struct scheduler_mode_operations* sSchedulerModes[] = {
|
static scheduler_mode_operations* sCurrentMode;
|
||||||
|
static scheduler_mode_operations* sSchedulerModes[] = {
|
||||||
&gSchedulerLowLatencyMode,
|
&gSchedulerLowLatencyMode,
|
||||||
&gSchedulerPowerSavingMode,
|
&gSchedulerPowerSavingMode,
|
||||||
};
|
};
|
||||||
@@ -1353,6 +1354,7 @@ scheduler_set_operation_mode(scheduler_mode mode)
|
|||||||
for (int32_t i = 0; i < smp_get_num_cpus(); i++)
|
for (int32_t i = 0; i < smp_get_num_cpus(); i++)
|
||||||
acquire_write_spinlock(&gCPUEntries[i].fSchedulerModeLock);
|
acquire_write_spinlock(&gCPUEntries[i].fSchedulerModeLock);
|
||||||
|
|
||||||
|
sCurrentModeID = mode;
|
||||||
sCurrentMode = sSchedulerModes[mode];
|
sCurrentMode = sSchedulerModes[mode];
|
||||||
sCurrentMode->switch_to_mode();
|
sCurrentMode->switch_to_mode();
|
||||||
|
|
||||||
@@ -1539,11 +1541,7 @@ _scheduler_init()
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
scheduler_set_operation_mode(SCHEDULER_MODE_LOW_LATENCY);
|
scheduler_set_operation_mode(SCHEDULER_MODE_LOW_LATENCY);
|
||||||
#else
|
|
||||||
scheduler_set_operation_mode(SCHEDULER_MODE_POWER_SAVING);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
add_debugger_command_etc("run_queue", &dump_run_queue,
|
add_debugger_command_etc("run_queue", &dump_run_queue,
|
||||||
"List threads in run queue", "\nLists threads in run queue", 0);
|
"List threads in run queue", "\nLists threads in run queue", 0);
|
||||||
@@ -1663,3 +1661,16 @@ _user_estimate_max_scheduling_latency(thread_id id)
|
|||||||
return 2 * kMinThreadQuantum;
|
return 2 * kMinThreadQuantum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
_user_set_scheduler_mode(int32 mode)
|
||||||
|
{
|
||||||
|
return scheduler_set_operation_mode(static_cast<scheduler_mode>(mode));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32
|
||||||
|
_user_get_scheduler_mode(void)
|
||||||
|
{
|
||||||
|
return sCurrentModeID;
|
||||||
|
}
|
||||||
|
|||||||
@@ -60,3 +60,17 @@ estimate_max_scheduling_latency(thread_id thread)
|
|||||||
return _kern_estimate_max_scheduling_latency(thread);
|
return _kern_estimate_max_scheduling_latency(thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
set_scheduler_mode(int32 mode)
|
||||||
|
{
|
||||||
|
return _kern_set_scheduler_mode(mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32
|
||||||
|
get_scheduler_mode(void)
|
||||||
|
{
|
||||||
|
return _kern_get_scheduler_mode();
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user