Обычно мы должны сделать так, чтобы вызвать функцию из функции указатель:Вызов функции из указателя функции без назначения?
int foo()
{
}
int main()
{
int (*pFoo)() = foo; // pFoo points to function foo()
foo();
return 0;
}
В коде ядра Linux, sched_class имеет много указателей на функции:
struct sched_class {
const struct sched_class *next;
void (*enqueue_task) (struct rq *rq, struct task_struct *p, int flags);
void (*dequeue_task) (struct rq *rq, struct task_struct *p, int flags);
void (*yield_task) (struct rq *rq);
bool (*yield_to_task) (struct rq *rq, struct task_struct *p, bool preempt);
.....
}
In pick_next_task функции, она определяет локальный экземпляр sched_class
с именем class
и непосредственно вызывать функцию в нем, не назначая внешним функциям с той же сигнатурой (начало от for_each_class
):
static inline struct task_struct *
pick_next_task(struct rq *rq)
{
const struct sched_class *class;
struct task_struct *p;
/*
* Optimization: we know that if all tasks are in
* the fair class we can call that function directly:
*/
if (likely(rq->nr_running == rq->cfs.h_nr_running)) {
p = fair_sched_class.pick_next_task(rq);
if (likely(p))
return p;
}
for_each_class(class) {
p = class->pick_next_task(rq);
if (p)
return p;
}
BUG(); /* the idle class will always have a runnable task */
}
Это потому, что каждая функция указатель в sched_class
имеет то же имя, что и фактическую реализованную функция, поэтому каждый раз, когда вызов производится с помощью функции указателя sched_class
, он автоматически найдет соответствующий закрывающий символ в адресном пространстве ядра ?