Call for Developers! Userland threading

Matthew Dillon dillon at apollo.backplane.com
Tue Jul 22 13:21:23 PDT 2003


:Guess I can give up Usenet for a few months. :)
:
:We should probably agree on a common name for the thread struct that 
:isn't likely to overlap anyone else's likely names for thread structs: 
:lwkt_thread, lwthread, lw_thread, something like that. maybe grab some 
:mindspace: dragonthread?

    hahahaha.  dragonthread... hahahaha.

    lwkt_thread is good for userland.  I was going to call the kernel 
    thread's lwkt_thread but I decided to stick with the 5.x 'thread'
    convention.

:> 	       * Use the convenient mostly pre-built message stored in the
:> 	       * userthread structure
:> 	       */
:> 	      msg = &curthread->td_sysmsg;
:
:msg = &curthread->td_sysmsg[READ] or something like that, no?

    Not unless you want your user thread structure to become hugely bloated!

    td_sysmsg would be a union I think, similar to what I use for DEV

    struct syscall_msg {
	struct lwkt_msg	lmsg;
	...
    }

    struct syscall_read_msg {
	struct syscall_msg	sysmsg;	/* base message structure */
	ssize_t result;			/* non-error result */
	int fd;
	void *buf;
	size_t bytes;
    }

    union lwkt_sysmsg {
	struct syscall_msg		msg;	/* base message structure */
	struct syscall_read_msg 	read;
	struct syscall_write_msg	write;
	...
    }

    Then in the read system call:

	struct syscall_read_msg *msg = &curthread->td_sysmsg.read;

    (Naming is up for grabs, I'm not set on any particular naming scheme)

    A user thread will only be in one direct system call interface 
    (i.e. read(), write(), gettimeofday()) at a time, so a single 
    union'd syscall message structure embedded in the lwkt_thread is
    sufficient.  Other forms of system calls, such as asynch calls or
    calls related to the core userland scheduler, would allocate and/or
    use their own message structures.  There is nothing wrong with,
    say, declaring a message structure on the stack, but it does cost
    more to have to re-initialize the message every time you want to
    send one.

    Embedd a single union in lwkt_thread allows us to reuse a message
    over and over again without having to reinitialize the core pieces of
    it (just like we did on the Amiga with IOReq's).

:> 	* (later on) development of a kernel-supported signal infrastructure
:> 	  for proper POSIX signal handling.
:
:First pass would be synchronous signal handlers, so caught signals are 
:delivered as messages, otherwise they kill or ignore as now?

    Right.  Ultimately that may be what we choose to use but I think it will
    be easier to add a kernel API that allows the threading system to tell
    the kernel to just funnel all signals through in a particular way, 
    regardless of what the user program told the kernel to do in the
    signal() (and related) calls.  Or something like that.  Once the main
    pieces of the threading system are working the direction that needs to
    be taken in regard to signals will become more obvious.

:>     I will be focusing on the kernel side of things.  I would like those
:>     interested in doing the userland threading project to focus on the
:>     userland side of things.
:
:dragonfly.userapi?

    I would leave it in .kernel for the moment, because everyone is
    interested in everything.  When list volume goes up we can break it
    and other categories off.

					-Matt
					Matthew Dillon 
					<dillon at xxxxxxxxxxxxx>





More information about the Kernel mailing list