[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
Re: [Libevent-users] Different behavior of my code
OpenBSD is libevent 1.4.13.
OS X polling mechanisms are pretty bad: their poll() and kqueue() only
support sockets, so you will need to use select (set EVENT_NOPOLL=1
EVENT_NOKQUEUE= in the environment).
On Thu, Sep 01, 2011 at 11:19:52PM +0100, Bernd Schoeller wrote:
> Dear List,
>
> I am currently taking my first steps in experimenting with libevent.
> To do that, I have written the small example below that should copy
> a file. I am currently trying to restrict myself to the core
> functions, and I know that the buffer handling is too primitive.
>
> I am trying the code on 3 different platforms:
>
> a) On OpenBSD 4.9, the code seems to work and the file is copied. I
> am not sure what version OpenBSD is using and what they changed.
>
> b) On MacOS Lion, using libevent 2.0.10, the program copies the
> file, but seems to never receive the 0 bytes EOF read, thus blocking
> after the last write. Output ends with:
>
> ...
> read callback
> Read: 6, 2 - 81953
> write callback
> Written: 7, 4 - 81953 (81953) of 81953
> Sub read.
>
> c) On Linux (Ubuntu LTS), using libevent 1.4.13, the read operation
> is never triggered and the main loop exits immediately. The output
> printed is:
>
> Starting.
> Opened read file handle 6.
> Opened write file handle 7.
> Exited with 1
>
> With these 3 different behaviors, I am pretty sure that I have not
> understood some fundamental detail of libevent. I do not think the
> different versions are to blame, and it should be possible to create
> some code that runs on all versions, as I am using very basic
> functions that seem to be the same in all versions.
>
> Thanks for your help,
> Bernd
>
>
> ---> c_libevent_test.c <---
>
> #include <event.h>
> #include <stdio.h>
> #include <fcntl.h>
> #include <sys/types.h>
> #include <sys/stat.h>
>
> #define READ_FILE_NAME "in.dat"
> #define WRITE_FILE_NAME "out.dat"
>
> #define BUFFER_SIZE 100000
>
> struct event fd_read;
> struct event fd_write;
>
> int buffer[BUFFER_SIZE];
> int full;
> int written;
>
> void onRead(int fd, short mode, void* data)
> {
> printf("read callback\n");
> full = read(fd, buffer, BUFFER_SIZE);
> printf("Read: %d, %d - %d\n", fd, mode, full);
> if (full > 0) {
> written = 0;
> event_add(&fd_write, NULL);
> }
> }
>
> void onWrite(int fd, short mode, void *data)
> {
> printf("write callback\n");
> int wr = write(fd, buffer+written, full-written);
> written += wr;
> printf("Written: %d, %d - %d (%d) of %d\n", fd, mode,
> wr, written, full);
> if (wr >= full) {
> written = 0;
> full = 0;
> printf("Sub read.\n");
> event_add(&fd_read, NULL);
> } else {
> event_add(&fd_write, NULL);
> }
> }
>
> int main(int argc, char** argv)
> {
> full = 0;
>
> event_init();
>
> printf("Starting.\n");
>
> int fd;
> fd = open(READ_FILE_NAME, O_RDONLY);
> printf("Opened read file handle %d.\n", fd);
> event_set(&fd_read, fd, EV_READ, onRead, 0);
>
> fd = open(WRITE_FILE_NAME, O_WRONLY | O_CREAT, 0600);
> printf("Opened write file handle %d.\n", fd);
> event_set(&fd_write, fd, EV_WRITE, onWrite, 0);
>
> event_add(&fd_read, NULL);
> printf("Exited with %d\n", event_dispatch());
> return 0;
> }
>
> ***********************************************************************
> To unsubscribe, send an e-mail to majordomo@xxxxxxxxxxxxx with
> unsubscribe libevent-users in the body.
***********************************************************************
To unsubscribe, send an e-mail to majordomo@xxxxxxxxxxxxx with
unsubscribe libevent-users in the body.