So, is it thread-safety **work:
1) On startup I call to event_init() which give me back an "event base"
bool SocketManager::Init() {
m_base = (event_base*)event_init();
return (m_base != NULL);
}
2) I run libevent mainloop in new thread with this "event base"
void SocketRunnable::ThreadProc() {
//
while(!g_bExit)
{
//
// ....
//
if( event_base_loop(m_base, 0) == -1 )
{
outError("<Socket manager> Critical error is occured in
event_loot. Exit.");
return;
}
}
}
This thread handles the listen socket; it calls accept() and
SocketManager::AddSocket() to add new socket event loop
bool SocketManager::AddSocket(SocketBase* pSocket)
{
event_set(&pSocket->m_ev_read, (int)pSocket->GetHandle(), EV_READ |
EV_PERSIST, io_handle_read, pSocket);
event_base_set(m_base, &pSocket->m_ev_read);
if(event_add(&pSocket->m_ev_read, &tv) == -1)
return false;
event_set(&pSocket->m_ev_write, (int)pSocket->GetHandle(), EV_WRITE,
io_handle_write, pSocket);
event_base_set(m_base, &pSocket->m_ev_write);
return true;
}
3) After "event_base_set(m_base, &pSocket->m_ev_write);"
if i want to send from another thread, i can call smth like this:
bool Socket::Send(IN const uint8* pSrc, INOUT uint32 unSize)
{
//some checks and output buffer operation
return (event_add(&m_ev_write, NULL) != -1);
}
and on write callback i send data directly in socket:
void io_handle_write(int fd, short event, void *arg)
{
send(fd, ........);
}
am i right or wrong?
Thanks.
P.S. Sorry for bad English..
Best regards,
Maksim Lapo
_______________________________________________
Libevent-users mailing list
[email protected]
http://monkeymail.org/mailman/listinfo/libevent-users