Userland: suggestion for the userapi code

Matthew Dillon dillon at apollo.backplane.com
Fri Jul 18 10:23:10 PDT 2003


:In the userapi example you have:
:
:ssize_t
:read(int fd, void *buf, size_t bytes)
:{
:    SysReadMsg msg;
:
:    initSysReadMsg(&msg, &_sysreplyport, fd, buf, bytes);
:    error = _syscallport->mp_SendMsg(syscallport, &msg);
:    if (error == EASYNC) {
:        error = waitmsg(&msg);
:        ... blocks ...
:    }
:    errno = error;
:    return(msg.retcode);
:}
:
:I think there would be more flexibility with:
:
:ssize_t
:read(int fd, void *buf, size_t bytes)
:{
:    SysReadMsg msg;
:    SysMsgPort *port, *reply; /* or whatever */
:
:    ... check that fd is valid ...
:    port = _fdtab[fd].messagePort;
:    reply = _fdtab[fd].replyPort;
:
:    initSysReadMsg(&msg, reply, fd, buf, bytes);
:    error = port->mp_SendMsg(port, &msg);
:    if (error == EASYNC) {
:        error = reply->waitmsg(&msg);
:        ... blocks ...
:    }
:    errno = error;
:    return(msg.retcode);
:}
:
:Most of the time the per-fd ports are the system ports.
:
:This doesn't require any change in the kernel, but it makes user-level
:layering a lot easier... you could test and implement pseudo-devices
:as an _unprivileged_ user by wrapping open() or you could shortcut
:implementations of things like /dev/null or /dev/zero so they made
:no kernel crossings at all.
:
:(I hope this doesn't come out in HTML, NewsFlash doesn't seem to have
:a way to say "no, I don't bloody want rich text, I don't care how cool
:it is"... I need a better newsreader for Mac OS X. I wish TRN had
:multiple server support)

    Ah, the first rule of writing examples into web pages:  They become
    instantly obsolete.

    In fact the proper 'reply' port is likely going to be built into the
    thread structure, e.g.  &curthread->td_replyPort or something like
    that (the usermode equivalent, that is).  We probably do not want
    to associate the reply port with the descriptor, because the reply
    port really has nothing to do with the descriptor and everything to do
    with whoever is sending the message.

    I agree with in regards to storing the target port as part of the
    FD array.  Some care must be taken with anything descriptor based
    because the dynamic ELF loader itself (ld.so) will have to be able 
    to work with it, but the target port will wind up being the 'real'
    descriptor here I wager.

					-Matt
					Matthew Dillon 
					<dillon at xxxxxxxxxxxxx>





More information about the Kernel mailing list