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