Hello,
I'm working with DirectFB-1.0.1 on ARM cpu.
I found a memory problem.
It seems that the allocated memory not freed
even though call window/surface->Release.
In my test, memory usage increase about 40Kbytes in calling a pare of
create_window() and destroy_window().
My test code is as follows:
===================================================================
#include <stdio.h>
#include <stdlib.h>
#include <directfb.h>
void *window_list[1024];
void *evtbuf_list[1024];
int window_num = 0;
IDirectFBWindow* create_window(IDirectFBDisplayLayer *layer, int x, int y, int
w, int h)
{
IDirectFBWindow *window;
IDirectFBSurface *window_surface;
IDirectFBEventBuffer *buffer;
DFBWindowDescription desc;
desc.flags = ( DWDESC_POSX | DWDESC_POSY | DWDESC_WIDTH | DWDESC_HEIGHT |
DWDESC_CAPS );
desc.posx = x;
desc.posy = y;
desc.width = w;
desc.height = h;
desc.caps = DWCAPS_ALPHACHANNEL;
layer->CreateWindow( layer, &desc, &window );
window->GetSurface( window, &window_surface );
window_surface->SetColor( window_surface, 0xFF, 0x20, 0x20, 0xFF );
window_surface->DrawRectangle( window_surface, 0, 0, desc.width, desc.height );
window_surface->Flip( window_surface, NULL, 0 );
window->SetOpacity( window, 0xFF );
// window->AttachEventBuffer( window, buffer );
window_surface->Release( window_surface ); // not freed?
return window;
}
void destroy_window(IDirectFBWindow *window)
{
window->Release( window ); // not freed?
}
int main( int argc, char *argv[] )
{
IDirectFB *dfb;
IDirectFBDisplayLayer *layer;
IDirectFBWindow *window;
IDirectFBWindow *window_tmp;
IDirectFBSurface *window_surface;
IDirectFBEventBuffer *buffer;
DFBWindowEvent evt;
DFBDisplayLayerConfig layer_config;
DFBGraphicsDeviceDescription gdesc;
DFBWindowID id;
int quit = 0;
DirectFBInit( &argc, &argv );
DirectFBCreate( &dfb );
printf("\n\n");
printf("--------------------------------------------\n");
printf(" a key : Create new window\n");
printf(" b key : Delete the last window\n\n");
printf(" c key : Quit\n");
printf("--------------------------------------------\n\n");
dfb->GetDeviceDescription( dfb, &gdesc );
dfb->GetDisplayLayer( dfb, DLID_PRIMARY, &layer );
layer->SetCooperativeLevel( layer, DLSCL_ADMINISTRATIVE );
if (!((gdesc.blitting_flags & DSBLIT_BLEND_ALPHACHANNEL) &&
(gdesc.blitting_flags & DSBLIT_BLEND_COLORALPHA )))
{
layer_config.flags = DLCONF_BUFFERMODE;
layer_config.buffermode = DLBM_BACKSYSTEM;
layer->SetConfiguration( layer, &layer_config );
}
layer->GetConfiguration( layer, &layer_config );
layer->EnableCursor ( layer, 1 );
{
DFBSurfaceDescription sdsc;
DFBWindowDescription desc;
desc.flags = ( DWDESC_POSX | DWDESC_POSY | DWDESC_WIDTH | DWDESC_HEIGHT );
desc.caps = DWCAPS_ALPHACHANNEL;
desc.flags |= DWDESC_CAPS;
sdsc.width = 320;
sdsc.height = 240;
desc.posx = 0;
desc.posy = 0;
desc.width = sdsc.width;
desc.height = sdsc.height;
layer->CreateWindow( layer, &desc, &window );
window->GetSurface( window, &window_surface );
window->SetOpacity( window, 0xFF );
window->CreateEventBuffer( window, &buffer );
window_surface->SetColor( window_surface, 0x80, 0xa0, 0x00, 0x90 );
window_surface->FillRectangle( window_surface, 0, 0, desc.width, desc.height
);
window_surface->Flip( window_surface, NULL, 0 );
window->GetID( window, &id );
}
while (!quit) {
buffer->WaitForEventWithTimeout( buffer, 0, 10 );
while (buffer->GetEvent( buffer, DFB_EVENT(&evt) ) == DFB_OK)
{
if (evt.window_id == id)
{
switch (evt.type)
{
case DWET_BUTTONDOWN: break;
case DWET_BUTTONUP: break;
case DWET_KEYDOWN: break;
case DWET_KEYUP:
// printf("DWET_KEYUP key_id=%d key_code=%d\n", evt.key_id, evt.key_code);
if (evt.key_id == 62977)
{
// printf("create new window\n");
window_tmp = create_window(layer, 0, 0, 100, 100);
window_tmp->RequestFocus( window_tmp );
window_tmp->RaiseToTop( window_tmp );
window_list[window_num] = (void*)window_tmp;
window_num++;
}
else if (evt.key_id == 62979)
{
// printf("destroy window\n");
if (window_num>0)
{
window_num--;
destroy_window((IDirectFBWindow*)window_list[window_num]);
}
}
else if (evt.key_id == 62978)
{
quit = 1;
exit(0);
}
break;
default:
break;
}
}
}
}
buffer->Release( buffer );
window_surface->Release( window_surface );
window->Release( window );
layer->Release( layer );
dfb->Release( dfb );
return 0;
}
=================================================================================
Any ideas?
Thanks,
Jess
_______________________________________________
directfb-dev mailing list
[email protected]
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev