grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Idea: elimination of the normal mode (revised version)


From: Bean
Subject: Re: Idea: elimination of the normal mode (revised version)
Date: Tue, 22 Jul 2008 02:42:01 +0800

On Tue, Jul 22, 2008 at 2:03 AM, Bean <address@hidden> wrote:
> Your idea seems fine, but there is a slightly efficiency issue. For
> example, when we need to call a function in the handler, we need to
> acquire it using name. We need to do this in every call, as the
> handler could be changed next time.
>
> My suggestion is to use function pointer instead of name, for example,
>
> grub_handler_register (&grub_handler_input_head, my_handler);
>
> Then we can always use grub_handler_input_head->getkey() to read a key.
>
> The drawback is that we need to define grub_handler_**_head as global 
> variable.
>

Hi,

Ok, I come up with a mixed solution. We can still register handler
using string, like this:

grub_handler_register ("input", my_input_handler);

We don't need grub_handler_add. Whenever it sees a new string,
grub_handler_register would create a item in the handler table.

To get the handler, we use:

grub_get_handler ("input", &local_input_handler_head);

The handler is managed as linked list, the head always points to
current selection, so we can use local_input_handler_head to call the
handler function.

To reduce unnecessary grub_get_handler calls, we export important
handler head as global variable, for example, we can use the following
in grub_main:

grub_get_handler ("input", &grub_input_handler_head);
grub_get_handler ("output", &grub_output_handler_head);
...

Other modules can use grub_input_handler_head directly to access input
handlers, but for custom handler such as "foo", they need to use
grub_get_handler to get the handler pointer.

-- 
Bean




reply via email to

[Prev in Thread] Current Thread [Next in Thread]