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 majord...@freehaven.net with > unsubscribe libevent-users in the body. *********************************************************************** To unsubscribe, send an e-mail to majord...@freehaven.net with unsubscribe libevent-users in the body.