diff --git a/ChangeLog b/ChangeLog index 1906b3c125..2394f68d0d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4868,3 +4868,5 @@ the SAM4L (2013-6-2). * libc/stdio/lib_dprintd.c and lib_vdprintf.c: Add dprintf() and vdprintf() (the latter from Andrew Tridgell, 2013-6-2). + * sched/sem_holder.c: Modify assertion that is reported to cause + false alarm assertions (2013-6-2). diff --git a/libc/stdio/Make.defs b/libc/stdio/Make.defs index b64d2bd5bc..f04dfb2157 100644 --- a/libc/stdio/Make.defs +++ b/libc/stdio/Make.defs @@ -37,7 +37,7 @@ # This first group of C files do not depend on having file descriptors or # C streams. -CSRCS += lib_fileno.c lib_printf.c lib_syslog.c lib_lowsyslog.c\ +CSRCS += lib_fileno.c lib_printf.c lib_syslog.c lib_lowsyslog.c \ lib_sprintf.c lib_asprintf.c lib_snprintf.c lib_libsprintf.c \ lib_vsprintf.c lib_avsprintf.c lib_vsnprintf.c lib_libvsprintf.c \ lib_dprintf.c lib_vdprintf.c \ diff --git a/libc/stdio/lib_vdprintf.c b/libc/stdio/lib_vdprintf.c index 8cdea96c6b..d96ca40f88 100644 --- a/libc/stdio/lib_vdprintf.c +++ b/libc/stdio/lib_vdprintf.c @@ -56,4 +56,4 @@ int vdprintf(int fd, FAR const char *fmt, va_list ap) lib_rawoutstream(&rawoutstream, fd); return lib_vsprintf(&rawoutstream.public, fmt, ap); -} +} diff --git a/sched/sem_holder.c b/sched/sem_holder.c index ab59ec8c80..b88bebf366 100644 --- a/sched/sem_holder.c +++ b/sched/sem_holder.c @@ -448,11 +448,22 @@ static int sem_restoreholderprio(FAR struct semholder_s *pholder, FAR sem_t *sem if (htcb->npend_reprio < 1) { - /* No... the holder thread has only been boosted once. Reset all - * priorities back to the base priority. + /* No... the holder thread has only been boosted once. + * npend_reprio should be 0 and the boosted priority should be the + * priority of the task that just got the semaphore + * (stcb->sched_priority) + * + * That latter assumption may not be true if the stcb's priority + * was also boosted so that it no longer matches the htcb's + * sched_priority. Or if CONFIG_SEM_NNESTPRIO is too small (so + * that we do not have a proper record of the reprioritizations). */ - DEBUGASSERT(htcb->sched_priority == stcb->sched_priority && htcb->npend_reprio == 0); + DEBUGASSERT(/* htcb->sched_priority == stcb->sched_priority && */ + htcb->npend_reprio == 0); + + /* Reset the holder's priority back to the base priority. */ + sched_reprioritize(htcb, htcb->base_priority); }