Fix battery_bench bug by using a static buffer for stack
Since battery_bench is a TSR (terminate & stay resident) plugin it cannot allocate the plugin buffer -- various parts of the Rockbox core make use of it as temporary storage space. The buffer was used for stack space so this generated false 'Stkov' panics when one of those in-core users overwrote the buffer. The default stack size of 1kb is a bit small, so use 4x the default size to be on the safe side. This also fixes a minor issue where trying to view OS stack usage while battery_bench was running would cause audio dropouts, due to scanning the possibly huge stack with IRQs disabled. Change-Id: I2e6b76f9946db9090c1af61f7aa0a0dac0698c20
This commit is contained in:
parent
f0e3a36fe4
commit
00129ac872
1 changed files with 4 additions and 21 deletions
|
@ -30,7 +30,7 @@
|
|||
#define EV_EXIT 1337
|
||||
|
||||
/* seems to work with 1300, but who knows... */
|
||||
#define MIN_THREAD_STACK_SIZE DEFAULT_STACK_SIZE + 0x200
|
||||
#define THREAD_STACK_SIZE 4*DEFAULT_STACK_SIZE
|
||||
|
||||
#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
|
||||
(CONFIG_KEYPAD == IRIVER_H300_PAD)
|
||||
|
@ -279,8 +279,7 @@ static struct batt_info
|
|||
static struct
|
||||
{
|
||||
unsigned int id; /* worker thread id */
|
||||
long *stack;
|
||||
ssize_t stacksize;
|
||||
long stack[THREAD_STACK_SIZE / sizeof(long)];
|
||||
} gThread;
|
||||
|
||||
static struct event_queue thread_q SHAREDBSS_ATTR;
|
||||
|
@ -607,25 +606,9 @@ enum plugin_status plugin_start(const void* parameter)
|
|||
}
|
||||
|
||||
rb->memset(&gThread, 0, sizeof(gThread));
|
||||
void *buf;
|
||||
size_t buf_size;
|
||||
buf = rb->plugin_get_buffer(&buf_size);
|
||||
ALIGN_BUFFER(buf, buf_size, sizeof(long));
|
||||
rb->memset(buf, 0, buf_size);
|
||||
|
||||
gThread.stacksize = buf_size;
|
||||
gThread.stack = (long *) buf;
|
||||
|
||||
if (gThread.stacksize < MIN_THREAD_STACK_SIZE)
|
||||
{
|
||||
rb->splash(HZ*2, "Out of memory");
|
||||
gThread.id = UINT_MAX;
|
||||
return PLUGIN_ERROR;
|
||||
}
|
||||
|
||||
rb->queue_init(&thread_q, true); /* put the thread's queue in the bcast list */
|
||||
gThread.id = rb->create_thread(thread, gThread.stack,
|
||||
gThread.stacksize, 0, "Battery Benchmark"
|
||||
gThread.id = rb->create_thread(thread, gThread.stack, sizeof(gThread.stack),
|
||||
0, "Battery Benchmark"
|
||||
IF_PRIO(, PRIORITY_BACKGROUND)
|
||||
IF_COP(, CPU));
|
||||
|
||||
|
|
Loading…
Reference in a new issue