* Evgeniy Polyakov <[EMAIL PROTECTED]> wrote:

> > i dont care whether they are separate or not - but you have not 
> > replied to the request that there be a handle_web_request() function 
> > in /both/ files, which is precisely the same function. I didnt ask 
> > you to merge the two files - i only asked for the two web handling 
> > functions to be one and the same function.
> 
> They are not the same in general - if kevent is ready immediately, there 
> will not be its removing from kevent tree, but current kevent server has 
> it always not-immediately for lighttpd tests - so functions are the same:
> open()
> sendfile()
> cork_off
> close(fd)
> close(s)
> remove_event_from_the_kernel
> 
> with the same parameters.

you /STILL/ dont understand. I'm only talking about evserver_epoll.c and 
evserver_kevent.c. Not about lighttpd. Not about historic reasons. I 
simply suggested a common-sense change:

| | Would it be so hard to introduce a single handle_web_request() 
| | function that is exactly the same in the two tests? All the queueing 
| | details (which are of course different in the epoll and the kevent 
| | case) should be in the client function, which calls 
| | handle_web_request().

i.e. put remove_event_from_the_kernel() (kweb_kevent_remove()) and 
evtest_remove()) into a SEPARATE client function, which calls the 
/common/ handle_web_request(sock) function. You can do the 
immediate-removal in that separate, kevent-specific client function - 
but the socket function, handle_web_request(sock) should be /perfectly 
identical/ in the two files.

I.e.:

static inline int handle_web_request(int s)
{
        int err, fd, on = 0;
        off_t offset = 0;
        int count = 40960;
        char path[] = "/tmp/index.html";
        char buf[4096];
                
        err = recv(s, buf, sizeof(buf), 0);
        if (err <= 0)
                return err;

        fd = open(path, O_RDONLY);
        if (fd == -1)
                return fd;

        err = sendfile(s, fd, &offset, count);
        if (err < 0) {
                ulog_err("Failed send %d bytes: fd=%d.\n", count, s);
                close(fd);
                return err;
        }

        setsockopt(s, SOL_TCP, TCP_CORK, &on, sizeof(on));
        close(fd);
        close(s); /* No keepalive */

        return 0;
}

And in evserver_epoll.c do this:

static int evtest_callback_client(int s)
{
        int err = handle_web_request(s);
        if (err)
                evtest_remove(s);
        return err;
}

and in evserver_kevent.c do this:

static int kweb_callback_client(struct ukevent *e, int im)
{
        int err = handle_web_request(e->id.raw[0]);
        if (err || !im)
                kweb_kevent_remove(e);
        return err;
}

ok?

Btw., am i correct that in this particular 'ab' test, the 'immediately' 
flag is always zero, i.e. kweb_kevent_remove() is always called?

        Ingo
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to