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 &quot;event base&quot;<br><br>bool SocketManager::Init() {<br>
&nbsp;&nbsp;&nbsp; m_base = (event_base*)event_init();<br>&nbsp;&nbsp;&nbsp; return (m_base != NULL);<br>}<br><br>2) I run libevent mainloop in new thread with this &quot;event base&quot;<br>void SocketRunnable::ThreadProc() {<br>&nbsp; //<br>&nbsp;&nbsp;&nbsp; while(!g_bExit)<br>
&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; //<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // ....<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if( event_base_loop(m_base, 0) == -1 )<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; outError(&quot;&lt;Socket manager&gt; Critical error is occured in event_loot. Exit.&quot;);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<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>&nbsp; &nbsp; event_set(&amp;pSocket-&gt;m_ev_read, (int)pSocket-&gt;GetHandle(), EV_READ | EV_PERSIST, io_handle_read, pSocket);<br>&nbsp;&nbsp;&nbsp; event_base_set(m_base, &amp;pSocket-&gt;m_ev_read);<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; if(event_add(&amp;pSocket-&gt;m_ev_read, &amp;tv) == -1)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br><br>&nbsp;&nbsp;&nbsp; event_set(&amp;pSocket-&gt;m_ev_write, (int)pSocket-&gt;GetHandle(), EV_WRITE, io_handle_write, pSocket);<br>&nbsp;&nbsp;&nbsp; event_base_set(m_base, &amp;pSocket-&gt;m_ev_write);<br><br>&nbsp;&nbsp;&nbsp; return true;<br>
}<br><br><br>3) After &quot;event_base_set(m_base, &amp;pSocket-&gt;m_ev_write);&quot;<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>&nbsp;&nbsp;&nbsp; //some checks and output buffer operation<br>&nbsp;&nbsp;&nbsp; return (event_add(&amp;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>&nbsp;&nbsp;&nbsp; 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