Added very simple and annoying profiling mechanism to ServerWindow's message
processing (enabled when PROFILE_MESSAGE_LOOP is defined). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15150 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
a77d29375c
commit
fa2c53ed52
@ -63,6 +63,7 @@ using std::nothrow;
|
||||
|
||||
//#define DEBUG_SERVERWINDOW
|
||||
//#define DEBUG_SERVERWINDOW_GRAPHICS
|
||||
//#define PROFILE_MESSAGE_LOOP
|
||||
|
||||
|
||||
#ifdef DEBUG_SERVERWINDOW
|
||||
@ -79,6 +80,10 @@ using std::nothrow;
|
||||
# define DTRACE(x) ;
|
||||
#endif
|
||||
|
||||
#ifdef PROFILE_MESSAGE_LOOP
|
||||
static struct profile { int32 count; bigtime_t time; } sMessageProfile[AS_LAST_CODE];
|
||||
#endif
|
||||
|
||||
struct dw_data {
|
||||
sem_id direct_sem;
|
||||
sem_id direct_sem_ack;
|
||||
@ -177,6 +182,16 @@ ServerWindow::~ServerWindow()
|
||||
STRACE(("#ServerWindow(%p) will exit NOW\n", this));
|
||||
|
||||
delete_sem(fDeathSemaphore);
|
||||
|
||||
#ifdef PROFILE_MESSAGE_LOOP
|
||||
for (int32 i = 0; i < AS_LAST_CODE; i++) {
|
||||
if (sMessageProfile[i].count == 0)
|
||||
continue;
|
||||
printf("[%ld] called %ld times, %g secs (%Ld usecs per call)\n",
|
||||
i, sMessageProfile[i].count, sMessageProfile[i].time / 1000000.0,
|
||||
sMessageProfile[i].time / sMessageProfile[i].count);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@ -554,8 +569,17 @@ ServerWindow::_DispatchMessage(int32 code, BPrivate::LinkReceiver &link)
|
||||
|
||||
RootLayer *rootLayer = fWindowLayer->GetRootLayer();
|
||||
// NOTE: is NULL when fWindowLayer is offscreen!
|
||||
if (rootLayer)
|
||||
if (rootLayer) {
|
||||
#ifdef PROFILE_MESSAGE_LOOP
|
||||
bigtime_t start = system_time();
|
||||
#endif
|
||||
rootLayer->Lock();
|
||||
#ifdef PROFILE_MESSAGE_LOOP
|
||||
bigtime_t diff = system_time() - start;
|
||||
if (diff > 10000)
|
||||
printf("ServerWindow %s: root lock acquisition took %Ld usecs\n", Title(), diff);
|
||||
#endif
|
||||
}
|
||||
|
||||
switch (code) {
|
||||
//--------- BView Messages -----------------
|
||||
@ -1749,21 +1773,20 @@ ServerWindow::_DispatchGraphicsMessage(int32 code, BPrivate::LinkReceiver &link)
|
||||
case AS_LAYER_DRAW_BITMAP_ASYNC_AT_POINT:
|
||||
{
|
||||
DTRACE(("ServerWindow %s: Message AS_LAYER_DRAW_BITMAP_(A)SYNC_AT_POINT: Layer name: %s\n", fTitle, fCurrentLayer->Name()));
|
||||
int32 bitmapToken;
|
||||
BPoint point;
|
||||
|
||||
int32 bitmapToken;
|
||||
BPoint point;
|
||||
link.Read<int32>(&bitmapToken);
|
||||
link.Read<BPoint>(&point);
|
||||
|
||||
ServerBitmap* sbmp = fServerApp->FindBitmap(bitmapToken);
|
||||
if (sbmp) {
|
||||
BRect src = sbmp->Bounds();
|
||||
|
||||
ServerBitmap* bitmap = fServerApp->FindBitmap(bitmapToken);
|
||||
if (bitmap) {
|
||||
BRect src = bitmap->Bounds();
|
||||
BRect dst = src.OffsetToCopy(point);
|
||||
fCurrentLayer->ConvertToScreenForDrawing(&dst);
|
||||
|
||||
driver->DrawBitmap(sbmp, src, dst, fCurrentLayer->CurrentState());
|
||||
driver->DrawBitmap(bitmap, src, dst, fCurrentLayer->CurrentState());
|
||||
}
|
||||
|
||||
|
||||
// TODO: how should AS_LAYER_DRAW_BITMAP_SYNC_AT_POINT sync with the client?
|
||||
// It Doesn't have to. Sync means: force a sync of the view/link, so that
|
||||
// the bitmap is already drawn when the "BView::DrawBitmap()" call returns.
|
||||
@ -1776,18 +1799,18 @@ ServerWindow::_DispatchGraphicsMessage(int32 code, BPrivate::LinkReceiver &link)
|
||||
DTRACE(("ServerWindow %s: Message AS_LAYER_DRAW_BITMAP_(A)SYNC_IN_RECT: Layer name: %s\n", fTitle, fCurrentLayer->Name()));
|
||||
int32 bitmapToken;
|
||||
BRect srcRect, dstRect;
|
||||
|
||||
|
||||
link.Read<int32>(&bitmapToken);
|
||||
link.Read<BRect>(&dstRect);
|
||||
link.Read<BRect>(&srcRect);
|
||||
|
||||
ServerBitmap* sbmp = fServerApp->FindBitmap(bitmapToken);
|
||||
if (sbmp) {
|
||||
|
||||
ServerBitmap* bitmap = fServerApp->FindBitmap(bitmapToken);
|
||||
if (bitmap) {
|
||||
fCurrentLayer->ConvertToScreenForDrawing(&dstRect);
|
||||
|
||||
driver->DrawBitmap(sbmp, srcRect, dstRect, fCurrentLayer->CurrentState());
|
||||
driver->DrawBitmap(bitmap, srcRect, dstRect, fCurrentLayer->CurrentState());
|
||||
}
|
||||
|
||||
|
||||
// TODO: how should AS_LAYER_DRAW_BITMAP_SYNC_IN_RECT sync with the client?
|
||||
break;
|
||||
}
|
||||
@ -2066,8 +2089,18 @@ ServerWindow::_MessageLooper()
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef PROFILE_MESSAGE_LOOP
|
||||
bigtime_t start = system_time();
|
||||
#endif
|
||||
|
||||
Lock();
|
||||
|
||||
#ifdef PROFILE_MESSAGE_LOOP
|
||||
bigtime_t diff = system_time() - start;
|
||||
if (diff > 10000)
|
||||
printf("ServerWindow %s: lock acquisition took %Ld usecs\n", Title(), diff);
|
||||
#endif
|
||||
|
||||
switch (code) {
|
||||
case AS_DELETE_WINDOW:
|
||||
case kMsgQuitLooper:
|
||||
@ -2106,6 +2139,20 @@ ServerWindow::_MessageLooper()
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef PROFILE_MESSAGE_LOOP
|
||||
if (code >= 0 && code < AS_LAST_CODE) {
|
||||
diff = system_time() - start;
|
||||
atomic_add(&sMessageProfile[code].count, 1);
|
||||
#ifdef __HAIKU__
|
||||
atomic_add64(&sMessageProfile[code].time, diff);
|
||||
#else
|
||||
sMessageProfile[code].time += diff;
|
||||
#endif
|
||||
if (diff > 10000)
|
||||
printf("ServerWindow %s: message %ld took %Ld usecs\n", Title(), code, diff);
|
||||
}
|
||||
#endif
|
||||
|
||||
Unlock();
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user