My demo code works fine without the BEV_OPT_THREADSAFE option.
With the option segmentation fault 100% will happen.
Maybe it is a platform specified problem, I see no one report before.
=====================================================================
$ /usr/bin/c++ --version
c++ (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46)
$ lsb_release -a
LSB Version:
:core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: CentOS
Description: CentOS release 5.4 (Final)
Release: 5.4
Codename: Final
=====================================================================
*** Aborted at 1270200692 (unix time) try "date -d @1270200692" if you
are using GNU date ***
PC: @ 0x17637a _bufferevent_incref_and_lock
*** SIGSEGV (@0x100) received by PID 32210 (TID 0xb7f8e6d0) from PID
256; stack trace: ***
@ 0x499440 (unknown)
@ 0x176d5c bufferevent_enable
@ 0x804901e accept_conn_cb()
@ 0x179d23 listener_read_cb
@ 0x16e5a9 event_base_loop
@ 0x16f1a5 event_base_dispatch
@ 0x8048f4d main
@ 0xa99e9c (unknown)
@ 0x8048b21 (unknown)
Segmentation fault
=====================================================================
#include <cstring>
#include <event2/util.h>
#include <event2/event.h>
#include <event2/bufferevent.h>
#include <event2/listener.h>
static void accept_conn_cb(struct evconnlistener* listener,
evutil_socket_t sockfd, struct sockaddr* addr, int socklen,
void *user_data) {
struct event_base *base = evconnlistener_get_base(listener);
struct bufferevent *bev = bufferevent_socket_new(
base, sockfd, BEV_OPT_CLOSE_ON_FREE |
BEV_OPT_THREADSAFE);
bufferevent_enable(bev, EV_READ | EV_WRITE);
for (char i='a'; i<'z'; i++) {
bufferevent_write(bev, &i, sizeof(i));
}
}
int main(int argc, char** argv) {
struct event_base *base;
struct sockaddr_in sin;
struct evconnlistener *listener;
base = event_base_new();
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(0);
sin.sin_port = htons(9050);
listener = evconnlistener_new_bind(base, accept_conn_cb, NULL,
LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE, SOMAXCONN,
(struct sockaddr*)&sin, sizeof(sin));
event_base_dispatch(base);
return 0;
} // ---------- end of function main ----------
***********************************************************************
To unsubscribe, send an e-mail to [email protected] with
unsubscribe libevent-users in the body.