SciFi (29.03.2018 11:08, просмотров: 202) ответил Dingo на Тогда уж связанный список. Или, чтобы с не дёргать malloc/free - массив структур, в которых есть необходимая инфа ( номер следующей структуры, приоритет, ...). Поэтому и была мысль про указатель на функцию. Или же вами предложенные ФИФО в
Вот: #define FIFO_SZ 16
struct fifo_element
{
int task;
int prio;
};
static struct fifo_element fifo[FIFO_SZ];
static unsigned int head, tail;
static bool busy;
void
lock_request(int task, int prio)
{
// place request on queue
struct fifo_element* dst = &fifo[head++ & (FIFO_SZ - 1)];
dst->task = task;
dst->prio = prio;
}
bool
lock_granted(int task)
{
if (!busy)
{
// scan the queue
struct fifo_element* max = 0;
for (unsigned int i = tail; i != head; i++)
{
struct fifo_element* elem = &fifo[i & (FIFO_SZ - 1)];
if (elem->task == task && (max == 0 || elem->prio > max->prio))
{
max = elem;
}
}
if (max)
{
// found it
if (max == &fifo[tail & (FIFO_SZ - 1)])
{
// last in queue, move tail pointer
tail++
}
else
{
// erase queue element
max->task = -1;
}
busy = true;
}
return busy;
}
else
{
return false;
}
}
void
lock_release(void)
{
busy = false;
}
ส็็็็็็็็็็็็็็็็็็็็็็็็็༼ ຈل͜ຈ༽ส้้้้้้้้้้้้้้้้้้้้้้้