I just identified a little problem in my code:
I use a filter bufferevent wrapped on a socket bufferevent, for example:

bev = bufferevent_socket_new(base, listener, BEV_OPT_CLOSE_ON_FREE);
struct timeval timeout_read = {5, 0};
bufferevent_set_timeouts(bev, &timeout_read, NULL);
bufferevent_setwatermark(bev, EV_READ, 1500, 0);

bev_filter = bufferevent_filter_new(bev, readandfiltercb, NULL, 
bufferevent_setwatermark(bev_filter, EV_READ, 3000, 0);
bufferevent_setcb(bev_filter, freadcb, fwritecb, eventcb, NULL);

I'm sending 1000 bytes packets on this socket.
readandfiltercb is called every 2 packets: it filters data and copy it to the 
bev_filter input buffer.
freadcb is then called ok.

But when udp stream is over, it remains one 1000 bytes packet in the buffer.
eventcb is called because of the timeout: then it flushes bufferevent
readandfiltercb is called ok: it filters and copies last bytes to bev_filter 
input buffer.
But then freadcb is not called at all.

Is it normal?
How to force bypass the watermark and flush bev_filter input buffer as well?

Last point: Is the underlying fd of a bufferevent can be a mmap file?
I could not find reference to the use of EVBUFFER_SENDFILE in the doc...

Thank you!

----- Mail original -----
De: "Azat Khuzhin" <a3at.mail@xxxxxxxxx>
À: libevent-users@xxxxxxxxxxxxx
Envoyé: Jeudi 16 Novembre 2017 11:25:18
Objet: Re: [Libevent-users] filter bufferevents and timeout

On Wed, Nov 15, 2017 at 6:32 PM, Bruno CARLUS <b.carlus@xxxxxxxxxxxxx> wrote:
> Hi,
> I have few questions as I go further in my project:
> - regarding bufferevent_filter: I need to retrieve udp data on a socket, 
> filter it according to my protocol and write received data to a file. I was 
> thinking on a read cb tranfering data (evbuffer_add_buffer or 
> evbuffer_add_buffer_reference) from the input buffer of my bufferevent_filter 
> to the output_buffer of another bufferevent linked to my file (mmaped). Is it 
> the right method? How to minimize memory allocation in these operations for a 
> high throughput?

evbuffer_add_buffer() will *moves* data from one buffer to another,
and I guess that this is pretty much what you need, while
evbuffer_add_buffer_reference() will leave a copy which you don't need
anyway (and it will use EVBUFFER_MULTICAST which will *share* the
chain between two buffers).

If you hadn't been needed filtering, you would have been able to use
EVBUFFER_SENDFILE (via evbuffer directly)

> - i read that bufferevent does not support udp yet but it seems to work in my 
> tests (i receive data only, never send) ... What are exacly the limitations ?

Well most of the code assume that it works with stream oriented data,
for more info look at:
To unsubscribe, send an e-mail to majordomo@xxxxxxxxxxxxx with
unsubscribe libevent-users    in the body.
To unsubscribe, send an e-mail to majord...@freehaven.net with
unsubscribe libevent-users    in the body.

Reply via email to