mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-11-09 21:22:39 -05:00
PictureFlow: Add move callback for buflib allocations
If we don't provide a callback to buflib_alloc(), the buffer is always movable (to reduce fragmentation). Since we pass our buffer to functions that call yield(), this could lead to memory corruption on buflib compaction. Change-Id: Id1fad1822479d692551c55cb8bc87cea7b78f759
This commit is contained in:
parent
b0277e4b6d
commit
9076b433d1
2 changed files with 20 additions and 2 deletions
|
|
@ -443,6 +443,18 @@ static int track_list_visible_entries = 0;
|
||||||
static int track_list_y;
|
static int track_list_y;
|
||||||
static int track_list_h;
|
static int track_list_h;
|
||||||
|
|
||||||
|
static int locked_buflib_handle;
|
||||||
|
static int move_callback(int handle, void *current, void *new)
|
||||||
|
{
|
||||||
|
(void)current; (void)new;
|
||||||
|
if (handle == locked_buflib_handle)
|
||||||
|
return BUFLIB_CB_CANNOT_MOVE;
|
||||||
|
return BUFLIB_CB_OK;
|
||||||
|
}
|
||||||
|
static struct buflib_callbacks pictureflow_ops = {
|
||||||
|
.move_callback = move_callback,
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Proposals for transitions:
|
Proposals for transitions:
|
||||||
|
|
||||||
|
|
@ -1534,7 +1546,7 @@ static int read_pfraw(char* filename, int prio)
|
||||||
|
|
||||||
int hid;
|
int hid;
|
||||||
do {
|
do {
|
||||||
hid = rb->buflib_alloc(&buf_ctx, size);
|
hid = rb->buflib_alloc_ex(&buf_ctx, size, "PictureFlow", &pictureflow_ops);
|
||||||
} while (hid < 0 && free_slide_prio(prio));
|
} while (hid < 0 && free_slide_prio(prio));
|
||||||
|
|
||||||
if (hid < 0) {
|
if (hid < 0) {
|
||||||
|
|
@ -1544,6 +1556,7 @@ static int read_pfraw(char* filename, int prio)
|
||||||
|
|
||||||
rb->yield(); /* allow audio to play when fast scrolling */
|
rb->yield(); /* allow audio to play when fast scrolling */
|
||||||
struct dim *bm = rb->buflib_get_data(&buf_ctx, hid);
|
struct dim *bm = rb->buflib_get_data(&buf_ctx, hid);
|
||||||
|
locked_buflib_handle = hid;
|
||||||
|
|
||||||
bm->width = bmph.width;
|
bm->width = bmph.width;
|
||||||
bm->height = bmph.height;
|
bm->height = bmph.height;
|
||||||
|
|
@ -1555,6 +1568,7 @@ static int read_pfraw(char* filename, int prio)
|
||||||
rb->read( fh, data , sizeof( pix_t ) * bm->width );
|
rb->read( fh, data , sizeof( pix_t ) * bm->width );
|
||||||
data += bm->width;
|
data += bm->width;
|
||||||
}
|
}
|
||||||
|
locked_buflib_handle = -1;
|
||||||
rb->close( fh );
|
rb->close( fh );
|
||||||
return hid;
|
return hid;
|
||||||
}
|
}
|
||||||
|
|
@ -1709,6 +1723,7 @@ static inline struct dim *get_slide(const int hid)
|
||||||
struct dim *bmp;
|
struct dim *bmp;
|
||||||
|
|
||||||
bmp = rb->buflib_get_data(&buf_ctx, hid);
|
bmp = rb->buflib_get_data(&buf_ctx, hid);
|
||||||
|
locked_buflib_handle = hid;
|
||||||
|
|
||||||
return bmp;
|
return bmp;
|
||||||
}
|
}
|
||||||
|
|
@ -2100,6 +2115,9 @@ static void render_all_slides(void)
|
||||||
if (step != 0 && num_slides <= 2) /* fading out center slide */
|
if (step != 0 && num_slides <= 2) /* fading out center slide */
|
||||||
alpha = (step > 0) ? 256 - fade / 2 : 128 + fade / 2;
|
alpha = (step > 0) ? 256 - fade / 2 : 128 + fade / 2;
|
||||||
render_slide(¢er_slide, alpha);
|
render_slide(¢er_slide, alpha);
|
||||||
|
|
||||||
|
/* free up lock on last used slide */
|
||||||
|
locked_buflib_handle = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -677,7 +677,7 @@ buflib_free(struct buflib_context *ctx, int handle_num)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Otherwise, set block to the newly-freed block, and mark it free, before
|
/* Otherwise, set block to the newly-freed block, and mark it free, before
|
||||||
* continuing on, since the code below exects block to point to a free
|
* continuing on, since the code below expects block to point to a free
|
||||||
* block which may have free space after it.
|
* block which may have free space after it.
|
||||||
*/
|
*/
|
||||||
block = freed_block;
|
block = freed_block;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue