sched/notifier: replace the unique key to freerun counter
replace the unique key to freerun counter to avoid traverse of the notifier list. Signed-off-by: chao.an <anchao@xiaomi.com>
This commit is contained in:
parent
003b360d12
commit
5cf794e42b
@ -65,7 +65,7 @@ struct work_notifier_entry_s
|
|||||||
|
|
||||||
/* Additional payload needed to manage the notification */
|
/* Additional payload needed to manage the notification */
|
||||||
|
|
||||||
int16_t key; /* Unique ID for the notification */
|
uint32_t key; /* Unique ID for the notification */
|
||||||
};
|
};
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -86,10 +86,6 @@ static dq_queue_t g_notifier_free;
|
|||||||
|
|
||||||
static dq_queue_t g_notifier_pending;
|
static dq_queue_t g_notifier_pending;
|
||||||
|
|
||||||
/* Used for lookup key generation */
|
|
||||||
|
|
||||||
static uint16_t g_notifier_key;
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Private Functions
|
* Private Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@ -103,7 +99,7 @@ static uint16_t g_notifier_key;
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static FAR struct work_notifier_entry_s *work_notifier_find(int16_t key)
|
static FAR struct work_notifier_entry_s *work_notifier_find(uint32_t key)
|
||||||
{
|
{
|
||||||
FAR struct work_notifier_entry_s *notifier;
|
FAR struct work_notifier_entry_s *notifier;
|
||||||
FAR dq_entry_t *entry;
|
FAR dq_entry_t *entry;
|
||||||
@ -118,7 +114,7 @@ static FAR struct work_notifier_entry_s *work_notifier_find(int16_t key)
|
|||||||
|
|
||||||
/* Is this the one we were looking for? */
|
/* Is this the one we were looking for? */
|
||||||
|
|
||||||
if (notifier->key == key)
|
if (notifier->key == key)
|
||||||
{
|
{
|
||||||
/* Yes.. return a reference to it */
|
/* Yes.. return a reference to it */
|
||||||
|
|
||||||
@ -137,24 +133,16 @@ static FAR struct work_notifier_entry_s *work_notifier_find(int16_t key)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int16_t work_notifier_key(void)
|
static uint32_t work_notifier_key(void)
|
||||||
{
|
{
|
||||||
int16_t key;
|
static uint32_t notifier_key;
|
||||||
|
|
||||||
/* Loop until a unique key is generated. Range 1-INT16_MAX. */
|
if (++notifier_key == 0)
|
||||||
|
|
||||||
do
|
|
||||||
{
|
{
|
||||||
if (g_notifier_key >= INT16_MAX)
|
notifier_key = 1;
|
||||||
{
|
|
||||||
g_notifier_key = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
key = (int16_t)++g_notifier_key;
|
|
||||||
}
|
}
|
||||||
while (work_notifier_find(key) != NULL);
|
|
||||||
|
|
||||||
return key;
|
return notifier_key;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -300,8 +288,6 @@ int work_notifier_teardown(int key)
|
|||||||
irqstate_t flags;
|
irqstate_t flags;
|
||||||
int ret = OK;
|
int ret = OK;
|
||||||
|
|
||||||
DEBUGASSERT(key > 0 && key <= INT16_MAX);
|
|
||||||
|
|
||||||
/* Disable interrupts very briefly. */
|
/* Disable interrupts very briefly. */
|
||||||
|
|
||||||
flags = enter_critical_section();
|
flags = enter_critical_section();
|
||||||
|
Loading…
Reference in New Issue
Block a user