Re: [Opalvoip-devel] Incorrect pthread_kill usage in unix version of PTLib
Brought to you by:
csoutheren,
rjongbloed
From: Robert J. <ro...@vo...> - 2013-07-20 00:42:44
|
Is there some way at run time you can tell if DEBUGGING_P is enabled in the OS you are running on? If so, then I am very happy to just include your code into the SVN. *Robert Jongbloed* OPAL/OpenH323/PTLib Architect and Co-founder. Commercial support at http://www.voxlucida.com.au /Travelling, so email responses may be slow!/ On 19/07/13 12:41 AM, Юра Чернявский wrote: > Robert, thank you for you idea about using PX_linuxId and /proc - it > seem works :). > Below is my working tiny patch of ptlib/unix/tlibthrd.cxx (may be it > will be useful for someone): > > PBoolean PThread::IsTerminated() const > { > if (m_type == e_IsProcess) > return false; // Process is always still running > + if (m_type == e_IsExternal) { > + char fn[24]; // 6 + 5 + 6 + 5 + 1 > + sprintf(fn, "/proc/%u/task/%u/", getpid(), PX_linuxId); > + return access(fn, R_OK) != 0; > + } > + > if (PX_state == PX_finished) > return true; > // See if thread is still running, copy variable in case changes > between two statements > pthread_t id = m_threadId; > - return id == PNullThreadIdentifier || pthread_kill(id, 0) != 0; > + return id == PNullThreadIdentifier; > } > > Of course I understand that using /proc is not optimal solution, but > is works and I happy with it :). > > > On 17 июля 2013, at 04:16, Robert Jongbloed <ro...@vo... > <mailto:ro...@vo...>> wrote: > >> Don't use any PTLib functions from within PThread::IsTerminated(), >> you will get infinite recursion. >> >> Just use the standard ostringstream class and access() function. >> >> *Robert Jongbloed* >> OPAL/OpenH323/PTLib Architect and Co-founder. >> Commercial support at http://www.voxlucida.com.au >> <http://www.voxlucida.com.au/> >> /Travelling, so email responses may be slow!/ >> >> On 17/07/13 12:55 AM, Юра Чернявский wrote: >>> Today I have tried to implement PX_linuxId and /proc logic - below >>> is my tiny patch >>> >>> PBoolean PThread::IsTerminated() const >>> { >>> if (m_type == e_IsProcess) >>> return false; // Process is always still running >>> >>> if (PX_state == PX_finished) >>> return true; >>> >>> // See if thread is still running, copy variable in case changes >>> between two statements >>> pthread_t id = m_threadId; >>> - return id == PNullThreadIdentifier || pthread_kill(id, 0) != 0; >>> + if (id == PNullThreadIdentifier) >>> + return true; >>> + >>> +PStringStream statFileName; >>> + statFileName << "/proc/" << getpid() << "/task/" << PX_linuxId << >>> "/stat"; >>> + for (int retry = 0; retry < 3; ++retry) { >>> + PTextFile statfile(statFileName, PFile::ReadOnly); >>> + if (statfile.IsOpen()) { >>> + return false; >>> + } >>> + } >>> + >>> + return true; >>> } >>> >>> >> >> ------------------------------------------------------------------------------ >> See everything from the browser to the database with AppDynamics >> Get end-to-end visibility with application monitoring from AppDynamics >> Isolate bottlenecks and diagnose root cause in seconds. >> Start your free trial of AppDynamics Pro today! >> http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk_______________________________________________ >> Opalvoip-devel mailing list >> Opa...@li... >> https://lists.sourceforge.net/lists/listinfo/opalvoip-devel > |