From 6d2a78738084a17d860a9eb96ada16150eeba14d Mon Sep 17 00:00:00 2001 From: Chris Young Date: Thu, 21 Jan 2016 00:08:49 +0000 Subject: Allocate deferred rectangles using itempools On OS3 we use a normal memory pool instead --- amiga/gui.c | 10 +++++----- amiga/misc.c | 41 +++++++++++++++++++++++++++++++++++++++++ amiga/misc.h | 7 +++++++ 3 files changed, 53 insertions(+), 5 deletions(-) diff --git a/amiga/gui.c b/amiga/gui.c index 3dc575cf0..09fc36b6a 100644 --- a/amiga/gui.c +++ b/amiga/gui.c @@ -3796,7 +3796,7 @@ gui_window_create(struct browser_window *bw, NewList(&g->dllist); g->deferred_rects = NewObjList(); - g->deferred_rects_pool = CreatePool(MEMF_PRIVATE, sizeof(struct rect), sizeof(struct rect)); + g->deferred_rects_pool = ami_misc_itempool_create(sizeof(struct rect)); g->bw = bw; g->scale = browser_window_get_scale(bw); @@ -4447,7 +4447,7 @@ static void gui_window_destroy(struct gui_window *g) ami_free_download_list(&g->dllist); FreeObjList(g->deferred_rects); - DeletePool(g->deferred_rects_pool); + ami_misc_itempool_delete(g->deferred_rects_pool); gui_window_stop_throbber(g); cur_gw = NULL; @@ -4659,7 +4659,7 @@ static void ami_gui_window_update_box_deferred(struct gui_window *g, bool draw) rect->x0, rect->y0, rect->x1, rect->y1); } nnode=(struct nsObject *)GetSucc((struct Node *)node); - FreePooled(g->deferred_rects_pool, node->objstruct, sizeof(struct rect)); + ami_misc_itempool_free(g->deferred_rects_pool, node->objstruct, sizeof(struct rect)); DelObjectNoFree(node); } while((node = nnode)); @@ -4693,7 +4693,7 @@ static bool ami_gui_window_update_box_deferred_check(struct MinList *deferred_re (new_rect->x1 >= rect->x1) && (new_rect->y1 >= rect->y1)) { LOG("Removing queued redraw that is a subset of new box redraw"); - FreePooled(mempool, node->objstruct, sizeof(struct rect)); + ami_misc_itempool_free(mempool, node->objstruct, sizeof(struct rect)); DelObjectNoFree(node); /* Don't return - we might find more */ } @@ -4710,7 +4710,7 @@ static void gui_window_update_box(struct gui_window *g, const struct rect *rect) if(ami_gui_window_update_box_deferred_check(g->deferred_rects, rect, g->deferred_rects_pool)) { - deferred_rect = AllocPooled(g->deferred_rects_pool, sizeof(struct rect)); + deferred_rect = ami_misc_itempool_alloc(g->deferred_rects_pool, sizeof(struct rect)); CopyMem(rect, deferred_rect, sizeof(struct rect)); nsobj = AddObject(g->deferred_rects, AMINS_RECT); nsobj->objstruct = deferred_rect; diff --git a/amiga/misc.c b/amiga/misc.c index 141994a31..065909e85 100755 --- a/amiga/misc.c +++ b/amiga/misc.c @@ -47,6 +47,47 @@ void *ami_misc_allocvec_clear(int size, UBYTE value) #endif } +APTR ami_misc_itempool_create(int size) +{ +#ifdef __amigaos4__ + return AllocSysObjectTags(ASOT_ITEMPOOL, + ASOITEM_MFlags, MEMF_PRIVATE, + ASOITEM_ItemSize, size, + ASOITEM_GCPolicy, ITEMGC_AFTERCOUNT, + ASOITEM_GCParameter, 50, + TAG_DONE); +#else + return CreatePool(MEMF_ANY, 2 * size, size); +#endif +} + +void ami_misc_itempool_delete(APTR pool) +{ +#ifdef __amigaos4__ + FreeSysObject(ASOT_ITEMPOOL, pool); +#else + DeletePool(pool); +#endif +} + +APTR ami_misc_itempool_alloc(APTR pool, int size) +{ +#ifdef __amigaos4__ + return ItemPoolAlloc(pool); +#else + return AllocPooled(pool, size); +#endif +} + +void ami_misc_itempool_free(APTR pool, APTR item, int size) +{ +#ifdef __amigaos4__ + return ItemPoolFree(pool, item); +#else + return FreePooled(pool, item, size); +#endif +} + static LONG ami_misc_req(const char *message, uint32 type) { LONG ret = 0; diff --git a/amiga/misc.h b/amiga/misc.h index 66a6f1d11..2544c7731 100644 --- a/amiga/misc.h +++ b/amiga/misc.h @@ -24,6 +24,13 @@ extern struct gui_file_table *amiga_file_table; struct Window; void *ami_misc_allocvec_clear(int size, UBYTE value); + +/* Itempool cross-compatibility */ +APTR ami_misc_itempool_create(int size); +void ami_misc_itempool_delete(APTR pool); +APTR ami_misc_itempool_alloc(APTR pool, int size); +void ami_misc_itempool_free(APTR pool, APTR item, int size); + char *translate_escape_chars(const char *s); void ami_misc_fatal_error(const char *message); int32 ami_warn_user_multi(const char *body, -- cgit v1.2.3