Re: module function design question.

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

 



On Tue, Jan 06, 2004 at 05:52:03 -0000, jnf wrote:
> Hello,
> 
> I have a function that adds itself to a wait queue and waits for an event
> to wake it up, then on any (fatal) error condition or when it finishes, it
> needs to readd itself to the wait queue and wait for the same event to
> happen again later. What I am doing right now is just adding to myself to
> the wait queue first thing in the function, then calling myself
> recursivley where necessary, but as i understand it, the stack space in
> the kernel is somewhat limited (anyone know exactly what the limits are?)
> and it seems to me that a function that never returns will net call ret,
> and thus each time it calls itself the stack will be decremented to make
> room for the new frame (assuming it all works the same in the kernel as it
> does in user space), and thus over a long enough time line I should run
> out of stack space? Are my thoughts there correct, and what would be a
> better way to accomplish the same thing?

Yes, your thoughts are correct.

What you need to do is a "tail call elimination". You have two ways to
accomplish it:
  * Manualy: this will surely work. Add a label to the first statement
    of the function and instead of recursive call, set appropriate
    variables and goto that label.
  * Automaticaly: I recently saw an option in gcc, for which the
    documentation claimed it enables a tail-call elimination in simple
    cases (this is a simple case). It's somewhere among the optimization
    options (I don't recall the exact name). Just remember to do the
    recursion as "return the_function(the_arguments...)" so that gcc can
    recognize it's a tail-call.
    I would not rely on this method actualy working however (but it
    might be fun to try it out).

-------------------------------------------------------------------------------
						 Jan 'Bulb' Hudec <bulb@ucw.cz>

--
Kernelnewbies: Help each other learn about the Linux kernel.
Archive:       http://mail.nl.linux.org/kernelnewbies/
FAQ:           http://kernelnewbies.org/faq/


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux