vnc_updater: use [enter|leave]_critical_section replace sched_[un]lock

sched_[un]lock can not prohibit pre-emption in smp

Signed-off-by: hujun5 <hujun5@xiaomi.com>
This commit is contained in:
hujun5 2023-09-15 09:23:30 +08:00 committed by Xiang Xiao
parent 4268b2e297
commit 1aa42cc7d2

View File

@ -26,6 +26,7 @@
#include <string.h>
#include <sched.h>
#include <nuttx/irq.h>
#include <pthread.h>
#include <assert.h>
#include <errno.h>
@ -181,14 +182,15 @@ static FAR struct vnc_fbupdate_s *
vnc_alloc_update(FAR struct vnc_session_s *session)
{
FAR struct vnc_fbupdate_s *update;
irqstate_t flags;
/* Reserve one element from the free list. Lock the scheduler to assure
* that the sq_remfirst() and the successful return from nxsem_wait are
* atomic. Of course, the scheduler will be unlocked while we wait.
*/
sched_lock();
vnc_sem_debug(session, "Before alloc", 0);
flags = enter_critical_section();
nxsem_wait_uninterruptible(&session->freesem);
@ -196,8 +198,8 @@ vnc_alloc_update(FAR struct vnc_session_s *session)
update = (FAR struct vnc_fbupdate_s *)sq_remfirst(&session->updfree);
leave_critical_section(flags);
vnc_sem_debug(session, "After alloc", 1);
sched_unlock();
DEBUGASSERT(update != NULL);
return update;
@ -220,12 +222,14 @@ vnc_alloc_update(FAR struct vnc_session_s *session)
static void vnc_free_update(FAR struct vnc_session_s *session,
FAR struct vnc_fbupdate_s *update)
{
irqstate_t flags;
/* Reserve one element from the free list. Lock the scheduler to assure
* that the sq_addlast() and the nxsem_post() are atomic.
*/
sched_lock();
vnc_sem_debug(session, "Before free", 1);
flags = enter_critical_section();
/* Put the entry into the free list */
@ -235,10 +239,9 @@ static void vnc_free_update(FAR struct vnc_session_s *session,
nxsem_post(&session->freesem);
leave_critical_section(flags);
vnc_sem_debug(session, "After free", 0);
DEBUGASSERT(session->freesem.semcount <= CONFIG_VNCSERVER_NUPDATES);
sched_unlock();
}
/****************************************************************************
@ -261,6 +264,7 @@ static FAR struct vnc_fbupdate_s *
vnc_remove_queue(FAR struct vnc_session_s *session)
{
FAR struct vnc_fbupdate_s *rect;
irqstate_t flags;
/* Reserve one element from the list of queued rectangle. Lock the
* scheduler to assure that the sq_remfirst() and the successful return
@ -268,8 +272,8 @@ vnc_remove_queue(FAR struct vnc_session_s *session)
* while we wait.
*/
sched_lock();
vnc_sem_debug(session, "Before remove", 0);
flags = enter_critical_section();
nxsem_wait_uninterruptible(&session->queuesem);
@ -293,7 +297,7 @@ vnc_remove_queue(FAR struct vnc_session_s *session)
}
errout:
sched_unlock();
leave_critical_section(flags);
return rect;
}
@ -315,12 +319,14 @@ errout:
static void vnc_add_queue(FAR struct vnc_session_s *session,
FAR struct vnc_fbupdate_s *rect)
{
irqstate_t flags;
/* Lock the scheduler to assure that the sq_addlast() and the nxsem_post()
* are atomic.
*/
sched_lock();
vnc_sem_debug(session, "Before add", 1);
flags = enter_critical_section();
/* Put the entry into the list of queued rectangles. */
@ -332,10 +338,9 @@ static void vnc_add_queue(FAR struct vnc_session_s *session,
nxsem_post(&session->queuesem);
leave_critical_section(flags);
vnc_sem_debug(session, "After add", 0);
DEBUGASSERT(session->queuesem.semcount <= CONFIG_VNCSERVER_NUPDATES);
sched_unlock();
}
/****************************************************************************
@ -557,6 +562,7 @@ int vnc_update_rectangle(FAR struct vnc_session_s *session,
{
FAR struct vnc_fbupdate_s *update;
struct fb_area_s intersection;
irqstate_t flags;
bool whupd;
intersection.x = rect->x;
@ -597,12 +603,12 @@ int vnc_update_rectangle(FAR struct vnc_session_s *session,
* the framebuffer since the last whole screen update.
*/
sched_lock();
flags = enter_critical_section();
if (!change && !session->change)
{
/* No.. ignore the client update. We have nothing new to report. */
sched_unlock();
leave_critical_section(flags);
return OK;
}
@ -668,7 +674,7 @@ int vnc_update_rectangle(FAR struct vnc_session_s *session,
intersection.w, intersection.h);
}
sched_unlock();
leave_critical_section(flags);
}
/* Since we ignore bad rectangles and wait for update structures, there is