added 4 changesets to branch 'refs/remotes/pdziepak-github/scheduler' old head: 714cb88c32b7100e60ccfacb0acacfa28b5708a1 new head: 320164b37031fa8edd7b8267516961adf3261063 overview: https://github.com/pdziepak/Haiku/compare/714cb88...320164b ---------------------------------------------------------------------------- 4c2e4f9: libroot: Fix Hoard when the CPU count is not a power of two 6790f0a: ProcessController: Explicitly check thread priority 406bab7: apps/BSnow: Do not use cpu_clock_speed 320164b: drivers/graphics: Remove log_{coll, dump} log_coll.c and log_dump.{c, h} don't appear to be used by anything. [ Pawel Dziepak <pdziepak@xxxxxxxxxxx> ] ---------------------------------------------------------------------------- 10 files changed, 32 insertions(+), 247 deletions(-) .../kernel/drivers/graphics/common/Jamfile | 2 - .../kernel/drivers/graphics/common/log_coll.c | 129 ------------------- .../kernel/drivers/graphics/common/log_dump.c | 73 ----------- .../kernel/drivers/graphics/common/log_dump.h | 17 --- src/apps/bsnow/SnowView.cpp | 2 +- src/apps/processcontroller/ThreadBarMenuItem.cpp | 16 ++- src/system/libroot/posix/malloc/heap.cpp | 5 +- src/system/libroot/posix/malloc/heap.h | 6 + src/system/libroot/posix/malloc/processheap.cpp | 17 ++- src/system/libroot/posix/malloc/processheap.h | 12 +- ############################################################################ Commit: 4c2e4f9f0b28b78ab21a3d6b9d6c623ded6547d7 Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Thu Dec 12 20:14:25 2013 UTC libroot: Fix Hoard when the CPU count is not a power of two ---------------------------------------------------------------------------- diff --git a/src/system/libroot/posix/malloc/heap.cpp b/src/system/libroot/posix/malloc/heap.cpp index 5ded947..99aba54 100644 --- a/src/system/libroot/posix/malloc/heap.cpp +++ b/src/system/libroot/posix/malloc/heap.cpp @@ -99,6 +99,7 @@ size_t hoardHeap::_threshold[hoardHeap::SIZE_CLASSES] = { #endif +int hoardHeap::fMaxThreadHeaps = 1; int hoardHeap::_numProcessors; int hoardHeap::_numProcessorsMask; @@ -454,7 +455,7 @@ hoardHeap::initNumProcs(void) else hoardHeap::_numProcessors = info.cpu_count; - hoardHeap::_numProcessorsMask = - (1 << (lg(hoardHeap::_numProcessors) + 1)) - 1; + fMaxThreadHeaps = 1 << (lg(_numProcessors) + 1); + _numProcessorsMask = fMaxThreadHeaps - 1; } diff --git a/src/system/libroot/posix/malloc/heap.h b/src/system/libroot/posix/malloc/heap.h index 84747c2..b2a9ed6 100644 --- a/src/system/libroot/posix/malloc/heap.h +++ b/src/system/libroot/posix/malloc/heap.h @@ -205,6 +205,12 @@ class hoardHeap { static void initNumProcs(void); protected: + // The maximum number of thread heaps we allow. (NOT the maximum + // number of threads -- Hoard imposes no such limit.) This must be + // a power of two! NB: This number is twice the maximum number of + // PROCESSORS supported by Hoard. + static int fMaxThreadHeaps; + // number of CPUs, cached static int _numProcessors; static int _numProcessorsMask; diff --git a/src/system/libroot/posix/malloc/processheap.cpp b/src/system/libroot/posix/malloc/processheap.cpp index 808c42a..129cf4c 100644 --- a/src/system/libroot/posix/malloc/processheap.cpp +++ b/src/system/libroot/posix/malloc/processheap.cpp @@ -37,8 +37,7 @@ using namespace BPrivate; processHeap::processHeap() : - kMaxThreadHeaps(_numProcessors * 2), - theap((HEAPTYPE*)hoardSbrk(sizeof(HEAPTYPE) * kMaxThreadHeaps)), + theap((HEAPTYPE*)hoardSbrk(sizeof(HEAPTYPE) * fMaxThreadHeaps)), #if HEAP_FRAG_STATS _currentAllocated(0), _currentRequested(0), @@ -48,32 +47,32 @@ processHeap::processHeap() #endif #if HEAP_LOG _log((Log<MemoryRequest>*) - hoardSbrk(sizeof(Log<MemoryRequest>) * (kMaxThreadHeaps + 1))), + hoardSbrk(sizeof(Log<MemoryRequest>) * (fMaxThreadHeaps + 1))), #endif _buffer(NULL), _bufferCount(0) { if (theap == NULL) return; - new(theap) HEAPTYPE[kMaxThreadHeaps]; + new(theap) HEAPTYPE[fMaxThreadHeaps]; #if HEAP_LOG if (_log == NULL) return; - new(_log) Log<MemoryRequest>[kMaxThreadHeaps + 1]; + new(_log) Log<MemoryRequest>[fMaxThreadHeaps + 1]; #endif int i; // The process heap is heap 0. setIndex(0); - for (i = 0; i < kMaxThreadHeaps; i++) { + for (i = 0; i < fMaxThreadHeaps; i++) { // Set every thread's process heap to this one. theap[i].setpHeap(this); // Set every thread heap's index. theap[i].setIndex(i + 1); } #if HEAP_LOG - for (i = 0; i < kMaxThreadHeaps + 1; i++) { + for (i = 0; i < fMaxThreadHeaps + 1; i++) { char fname[255]; sprintf(fname, "log%d", i); unlink(fname); @@ -94,7 +93,7 @@ processHeap::stats(void) #if HEAP_STATS int umax = 0; int amax = 0; - for (int j = 0; j < kMaxThreadHeaps; j++) { + for (int j = 0; j < fMaxThreadHeaps; j++) { for (int i = 0; i < SIZE_CLASSES; i++) { amax += theap[j].maxAllocated(i) * sizeFromClass(i); umax += theap[j].maxInUse(i) * sizeFromClass(i); @@ -118,7 +117,7 @@ processHeap::stats(void) #if HEAP_LOG printf("closing logs.\n"); fflush(stdout); - for (int i = 0; i < kMaxThreadHeaps + 1; i++) { + for (int i = 0; i < fMaxThreadHeaps + 1; i++) { _log[i].close(); } #endif diff --git a/src/system/libroot/posix/malloc/processheap.h b/src/system/libroot/posix/malloc/processheap.h index 4aa17c7..f222289 100644 --- a/src/system/libroot/posix/malloc/processheap.h +++ b/src/system/libroot/posix/malloc/processheap.h @@ -132,12 +132,6 @@ class processHeap : public hoardHeap { processHeap(const processHeap &); const processHeap & operator=(const processHeap &); - // The maximum number of thread heaps we allow. (NOT the maximum - // number of threads -- Hoard imposes no such limit.) This must be - // a power of two! NB: This number is twice the maximum number of - // PROCESSORS supported by Hoard. - const int kMaxThreadHeaps; - // The per-thread heaps. HEAPTYPE* theap; @@ -174,7 +168,7 @@ processHeap::getHeap(int i) { assert(theap != NULL); assert(i >= 0); - assert(i < kMaxThreadHeaps); + assert(i < fMaxThreadHeaps); return theap[i]; } @@ -185,7 +179,7 @@ processHeap::getLog(int i) { assert(_log != NULL); assert(i >= 0); - assert(i < kMaxThreadHeaps + 1); + assert(i < fMaxThreadHeaps + 1); return _log[i]; } #endif @@ -200,7 +194,7 @@ processHeap::getHeapIndex(void) // In fact, for efficiency, we just round up to the highest power of two, // times two. int tid = find_thread(NULL) & _numProcessorsMask; - assert(tid < kMaxThreadHeaps); + assert(tid < fMaxThreadHeaps); return tid; } ############################################################################ Commit: 6790f0ad22c7c099be958455817b33726b74c581 Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Thu Dec 12 20:46:48 2013 UTC ProcessController: Explicitly check thread priority ---------------------------------------------------------------------------- diff --git a/src/apps/processcontroller/ThreadBarMenuItem.cpp b/src/apps/processcontroller/ThreadBarMenuItem.cpp index 8af186b..94b2d1d 100644 --- a/src/apps/processcontroller/ThreadBarMenuItem.cpp +++ b/src/apps/processcontroller/ThreadBarMenuItem.cpp @@ -104,10 +104,16 @@ ThreadBarMenuItem::DrawBar(bool force) r.right = fGrenze1; } if (r.left < r.right) { - if (selected) - menu->SetHighColor(fThreadID <= gCPUcount ? gIdleColorSelected : gUserColorSelected); - else - menu->SetHighColor(fThreadID <= gCPUcount ? gIdleColor : gUserColor); + thread_info threadInfo; + bool idleThread = false; + if (get_thread_info(fThreadID, &threadInfo) == B_OK) + idleThread = threadInfo.priority == B_IDLE_PRIORITY; + + if (selected) { + menu->SetHighColor( + idleThread ? gIdleColorSelected : gUserColorSelected); + } else + menu->SetHighColor(idleThread ? gIdleColor : gUserColor); menu->FillRect(r); } r.left = grenze2; @@ -157,7 +163,7 @@ ThreadBarMenuItem::BarUpdate() bigtime_t now = system_time(); fKernel = double(info.kernel_time - fThreadInfo.kernel_time) / double(now - fLastTime); fUser = double(info.user_time - fThreadInfo.user_time) / double(now - fLastTime); - if (fThreadID <= gCPUcount) { + if (info.priority == B_IDLE_PRIORITY) { fUser += fKernel; fKernel = 0; } ############################################################################ Commit: 406bab7a62a484d9f6daa713bf48d578439efe11 Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Fri Dec 13 01:38:35 2013 UTC apps/BSnow: Do not use cpu_clock_speed ---------------------------------------------------------------------------- diff --git a/src/apps/bsnow/SnowView.cpp b/src/apps/bsnow/SnowView.cpp index 1a3765d..5c3935a 100644 --- a/src/apps/bsnow/SnowView.cpp +++ b/src/apps/bsnow/SnowView.cpp @@ -87,7 +87,7 @@ SnowView::SnowView(BMessage *archive) fShowClickMe = false; SetFlags(Flags() & ~B_PULSE_NEEDED); /* it's only used when in the app */ get_system_info(&si); - fNumFlakes = ((int32)(si.cpu_clock_speed/1000000)) * si.cpu_count / 3; //; + fNumFlakes = 1000 * si.cpu_count / 3; printf("BSnow: using %ld flakes\n", fNumFlakes); for (int i = 0; i < WORKSPACES_COUNT; i++) { fFlakes[i] = new flake[fNumFlakes]; ############################################################################ Commit: 320164b37031fa8edd7b8267516961adf3261063 Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Fri Dec 13 01:44:29 2013 UTC drivers/graphics: Remove log_{coll, dump} log_coll.c and log_dump.{c, h} don't appear to be used by anything. ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/drivers/graphics/common/Jamfile b/src/add-ons/kernel/drivers/graphics/common/Jamfile index 7ea4092..6fb4bde 100644 --- a/src/add-ons/kernel/drivers/graphics/common/Jamfile +++ b/src/add-ons/kernel/drivers/graphics/common/Jamfile @@ -9,7 +9,5 @@ UsePrivateHeaders [ FDirName graphics radeon ] ; UsePrivateHeaders [ FDirName graphics common ] ; StaticLibrary libgraphicscommon.a : - log_coll.c - log_dump.c memory_manager.c ; diff --git a/src/add-ons/kernel/drivers/graphics/common/log_coll.c b/src/add-ons/kernel/drivers/graphics/common/log_coll.c deleted file mode 100644 index f9dec1e..0000000 --- a/src/add-ons/kernel/drivers/graphics/common/log_coll.c +++ /dev/null @@ -1,129 +0,0 @@ -/* - Copyright (c) 2002, Thomas Kurschel - - Part of Radeon driver - - Both kernel and user space part. - (init and clean-up must be done in - kernel space). -*/ - - -#include "log_coll.h" - -#include <KernelExport.h> -#include <OS.h> - -#include <stdlib.h> -#include <stdarg.h> -#include <string.h> - -typedef struct log_info_t { - char *log_buffer; - uint32 log_buffer_len; - uint32 log_buffer_pos; - area_id area; -} log_info; - -#ifdef ENABLE_LOGGING - - -// write one log entry -void log( log_info *li, uint16 what, const uint8 num_args, ... ) -{ - uint32 pos; - va_list vl; - log_entry *entry; - uint32 i; - uint32 entry_size; - - entry_size = sizeof( log_entry ) + (num_args - 1) * sizeof( uint32 ); - pos = atomic_add( &li->log_buffer_pos, entry_size ); - - if( li->log_buffer_pos > li->log_buffer_len ) { - atomic_add( &li->log_buffer_pos, -entry_size ); - return; - } - - entry = (log_entry *)&li->log_buffer[pos]; - - entry->tsc = system_time(); - entry->what = what; - entry->num_args = num_args; - - va_start( vl, num_args ); - for( i = 0; i < num_args; ++i ) { - entry->args[i] = va_arg( vl, uint32 ); - } - va_end( vl ); -} - -#ifdef LOG_INCLUDE_STARTUP - -// create log buffer -log_info *log_init( uint32 size ) -{ - log_info *li; - area_id area; - - // buffer must be accessible from user mem - // to allow logging from there as well; - // you cannot clone this area as there are - // pointers which would break (it wouldn't be - // hard to get rid of them, but I don't care - // and keep it as simple as possible) - area = create_area( "fast_logger", - (void **)&li, B_ANY_KERNEL_ADDRESS, - (sizeof( log_info ) + size + (B_PAGE_SIZE - 1)) & ~(B_PAGE_SIZE - 1), - B_FULL_LOCK, B_READ_AREA | B_WRITE_AREA ); - - if( area < 0 ) - panic( "Radeon Fast logger: cannot allocate %ld byte for logging data\n", size ); - - li->area = area; - li->log_buffer = (char *)li + sizeof( log_info ); - li->log_buffer_len = size; - li->log_buffer_pos = 0; - - return li; -} - -// clean-up logging -void log_exit( log_info *li ) -{ - li->log_buffer_pos = 0; - //free( li->log_buffer ); - delete_area( li->area ); -} - -#endif - -#endif - - -#ifdef LOG_INCLUDE_STARTUP - -// get *current* size of logging data -uint32 log_getsize( log_info *li ) -{ - if( li == NULL ) - return 0; - - dprintf( "RADEON -- log_getsize: log_pos %ld\n", li->log_buffer_pos ); - return li->log_buffer_pos; -} - -// get up to max_size bytes of logging data -void log_getcopy( log_info *li, void *dest, uint32 max_size ) -{ - if( li == NULL ) - return; - - dprintf( "RADEON -- log_getcopy: max_size %ld, log_pos %ld\n", - max_size, li->log_buffer_pos ); - memcpy( dest, li->log_buffer, min( li->log_buffer_pos, max_size )); - - li->log_buffer_pos = 0; -} - -#endif diff --git a/src/add-ons/kernel/drivers/graphics/common/log_dump.c b/src/add-ons/kernel/drivers/graphics/common/log_dump.c deleted file mode 100644 index fb4d79b..0000000 --- a/src/add-ons/kernel/drivers/graphics/common/log_dump.c +++ /dev/null @@ -1,73 +0,0 @@ -/* - Copyright (c) 2002, Thomas Kurschel - - - Part of Radeon driver - - Fast logger - functions to create dump -*/ - - -#include <stdio.h> -#include <OS.h> - -#include "log_coll.h" -#include "log_dump.h" -#include "log_enum.h" -#include "log_names.h" - -system_info sysinfo; - -// dump one entry -static void log_printentry( FILE *logfile, log_entry *entry ) -{ - uint64 time; - uint32 min, sec, mill, mic; - - time = entry->tsc / (sysinfo.cpu_clock_speed / 1000000); - mic = time % 1000; - time /= 1000; - mill = time % 1000; - time /= 1000; - sec = time % 60; - time /= 60; - min = time; - - fprintf( logfile, "%03ld:%02ld:%03ld.%03ld ", min, sec, mill, mic ); - if( entry->what < sizeof( log_names ) / sizeof( log_names[0] ) ) - fprintf( logfile, log_names[entry->what] ); - else - fprintf( logfile, "unknown %ld", (uint32)entry->what ); - - if( entry->num_args > 0 ) { - uint32 i; - - fprintf( logfile, " (" ); - for( i = 0; i < entry->num_args; ++i ) { - if( i > 0 ) - fprintf( logfile, ", " ); - - fprintf( logfile, "0x%08lx", entry->args[i] ); - } - fprintf( logfile, ")" ); - } - - fprintf( logfile, "\n" ); -} - - -// dump entire log -void log_printall( FILE *logfile, char *buffer, uint32 buffer_len ) -{ - uint32 pos; - - get_system_info( &sysinfo ); - - for( pos = 0; pos < buffer_len; ) { - log_entry *entry; - - entry = (log_entry *)(buffer + pos); - log_printentry( logfile, entry/*, &tsc*/ ); - pos += sizeof( log_entry ) + (entry->num_args - 1) * sizeof( uint32 ); - } -} diff --git a/src/add-ons/kernel/drivers/graphics/common/log_dump.h b/src/add-ons/kernel/drivers/graphics/common/log_dump.h deleted file mode 100644 index bb2a775..0000000 --- a/src/add-ons/kernel/drivers/graphics/common/log_dump.h +++ /dev/null @@ -1,17 +0,0 @@ -/* - Copyright (c) 2002, Thomas Kurschel - - - Part of Radeon accelerant - - Fast logger - functions to create dump -*/ - -#ifndef __LOG_DUMP_H__ -#define __LOG_DUMP_H__ - -#include <SupportDefs.h> - -void log_printall( FILE *logfile, char *buffer, uint32 buffer_len ); - -#endif