Does this require NPTL to be turned off? Do sub-threads have their own PIDs 
with NPTL?

On Tuesday 28 August 2007 01:50, you wrote:
> Author: zothar
> Date: 2007-08-28 00:50:36 +0000 (Tue, 28 Aug 2007)
> New Revision: 14897
> 
> Added:
>    trunk/freenet/src/freenet/support/OSThread.java
> Modified:
>    trunk/freenet/src/freenet/client/async/BackgroundBlockEncoder.java
> Log:
> Potential debugging tool: provide getPID() and logPID() to get or log the 
thread's PID on Linux with /proc/self/stat available to the JVM (support 
could later be expanded with JNI or other methods).  These tools are 
currently configured with static variables, are currently only configurable 
at compile time and are currently off.
> 
> Modified: trunk/freenet/src/freenet/client/async/BackgroundBlockEncoder.java
> ===================================================================
> --- trunk/freenet/src/freenet/client/async/BackgroundBlockEncoder.java        
2007-08-28 00:47:06 UTC (rev 14896)
> +++ trunk/freenet/src/freenet/client/async/BackgroundBlockEncoder.java        
2007-08-28 00:50:36 UTC (rev 14897)
> @@ -45,6 +45,7 @@
>       }
>       
>       public void run() {
> +         freenet.support.OSThread.logPID(this);
>               while(true) {
>                       SingleBlockInserter sbi = null;
>                       synchronized(this) {
> 
> Added: trunk/freenet/src/freenet/support/OSThread.java
> ===================================================================
> --- trunk/freenet/src/freenet/support/OSThread.java                           
(rev 0)
> +++ trunk/freenet/src/freenet/support/OSThread.java   2007-08-28 00:50:36 UTC 
(rev 14897)
> @@ -0,0 +1,208 @@
> +/* This code is part of Freenet. It is distributed under the GNU General
> + * Public License, version 2 (or at your option any later version). See
> + * http://www.gnu.org/ for further details of the GPL. */
> +package freenet.support;
> +
> +import java.io.File;
> +import java.io.FileInputStream;
> +import java.io.FileNotFoundException;
> +import java.io.IOException;
> +import java.util.regex.PatternSyntaxException;
> +
> +import freenet.support.Logger;
> +
> +/**
> + * Get OS/Thread information using one or more methods
> + */
> +public class OSThread {
> +
> +    public static boolean getPIDEnabled = false;
> +    public static boolean getPPIDEnabled = false;
> +    public static boolean procSelfStatEnabled = false;
> +
> +    /**
> +     * Get the thread's process ID or return -1 if it's unavailable for 
some reason
> +     */
> +     public synchronized static int getPID(Object o) {
> +             if(!getPIDEnabled) {
> +                     return -1;
> +             }
> +             return getPIDFromProcSelfStat(o);
> +     }
> +
> +    /**
> +     * Get the thread's parent process ID or return -1 if it's unavailable 
for some reason
> +     */
> +     public synchronized static int getPPID(Object o) {
> +             if(!getPPIDEnabled) {
> +                     return -1;
> +             }
> +             return getPPIDFromProcSelfStat(o);
> +     }
> +
> +    /**
> +     * Get the thread's process ID using the /proc/self/stat method or
> +      * return -1 if it's unavailable for some reason.  This is an ugly
> +      * hack required by Java to get the OS process ID of a thread on
> +      * Linux without using JNI.
> +     */
> +     public synchronized static int getPIDFromProcSelfStat(Object o) {
> +             StringBuffer sb = null;
> +             int b = -1;
> +             int pid = -1;
> +             String msg = null;
> +
> +             if(!getPIDEnabled) {
> +                     return -1;
> +             }
> +             if(!procSelfStatEnabled) {
> +                     return -1;
> +             }
> +
> +             // read /proc/self/stat and parse for the PID
> +             FileInputStream fis = null;
> +             File procFile = new File("/proc/self/stat");
> +             if(procFile.exists()) {
> +                     try {
> +                             fis = new FileInputStream(procFile);
> +                     } catch (FileNotFoundException e1) {
> +                             Logger.normal(o, "'/proc/self/stat' not found");
> +                             fis = null;
> +                     }
> +                     if(null != fis) {
> +                             sb = new StringBuffer();
> +                             while( true ) {
> +                                     try {
> +                                             b = fis.read();
> +                                     } catch (IOException e) {
> +                                             Logger.error(o, "Caught 
> IOException in fis.read() of 
OSThread.getPIDFromProcSelfStat()", e);
> +                                             b = -1;
> +                                     }
> +                                     if( -1 == b ) {
> +                                             break;
> +                                     }
> +                                     sb.append( (char) b );
> +                             }
> +                             try {
> +                                 msg = "DEBUG: Gonna parse 
> ["+sb.toString()+"]";
> +                                     System.out.println(msg + ": " + o);
> +                             Logger.normal(o, msg);
> +                                     String[] procStrings = 
> sb.toString().trim().split(" ");
> +                                     if(4 <= procStrings.length) {
> +                                             String pidString = procStrings[ 
> 0 ];
> +                                             try {
> +                                                     pid = Integer.parseInt( 
> pidString.trim() );
> +                                             } catch (NumberFormatException 
> e) {
> +                                                     Logger.error(o, "Caught 
> NumberFormatException in Integer.parseInt() 
of OSThread.getPIDFromProcSelfStat() while parsing '"+pidString+"'", e);
> +                                             }
> +                                     }
> +                             } catch (PatternSyntaxException e) {
> +                                     Logger.error(o, "Caught 
> PatternSyntaxException in 
sb.toString().trim().split(\" \") of OSThread.getPIDFromProcSelfStat() while 
parsing '"+sb.toString()+"'", e);
> +                             }
> +                     }
> +             }
> +             return pid;
> +     }
> +
> +    /**
> +     * Get the thread's parent process ID using the /proc/self/stat
> +      * method or return -1 if it's unavailable for some reason.  This
> +      * is ugly hack required by Java to get the OS parent process ID of
> +      * a thread on Linux without using JNI.
> +     */
> +     public synchronized static int getPPIDFromProcSelfStat(Object o) {
> +             StringBuffer sb = null;
> +             int b = -1;
> +             int ppid = -1;
> +             String msg = null;
> +
> +             if(!getPPIDEnabled) {
> +                     return -1;
> +             }
> +             if(!procSelfStatEnabled) {
> +                     return -1;
> +             }
> +
> +             // read /proc/self/stat and parse for the PPID
> +             FileInputStream fis = null;
> +             File procFile = new File("/proc/self/stat");
> +             if(procFile.exists()) {
> +                     try {
> +                             fis = new FileInputStream(procFile);
> +                     } catch (FileNotFoundException e1) {
> +                             Logger.normal(o, "'/proc/self/stat' not found");
> +                             fis = null;
> +                     }
> +                     if(null != fis) {
> +                             sb = new StringBuffer();
> +                             while( true ) {
> +                                     try {
> +                                             b = fis.read();
> +                                     } catch (IOException e) {
> +                                             Logger.error(o, "Caught 
> IOException in fis.read() of 
OSThread.getPPIDFromProcSelfStat()", e);
> +                                             b = -1;
> +                                     }
> +                                     if( -1 == b ) {
> +                                             break;
> +                                     }
> +                                     sb.append( (char) b );
> +                             }
> +                             try {
> +                                 msg = "DEBUG: Gonna parse 
> ["+sb.toString()+"]";
> +                                     System.out.println(msg + ": " + o);
> +                             Logger.normal(o, msg);
> +                                     String[] procStrings = 
> sb.toString().trim().split(" ");
> +                                     if(4 <= procStrings.length) {
> +                                             String ppidString = 
> procStrings[ 3 ];
> +                                             try {
> +                                                     ppid = 
> Integer.parseInt( ppidString.trim() );
> +                                             } catch (NumberFormatException 
> e) {
> +                                                     Logger.error(o, "Caught 
> NumberFormatException in Integer.parseInt() 
of OSThread.getPPIDFromProcSelfStat() while parsing '"+ppidString+"'", e);
> +                                             }
> +                                     }
> +                             } catch (PatternSyntaxException e) {
> +                                     Logger.error(o, "Caught 
> PatternSyntaxException in 
sb.toString().trim().split(\" \") of OSThread.getPPIDFromProcSelfStat() while 
parsing '"+sb.toString()+"'", e);
> +                             }
> +                     }
> +             }
> +             return ppid;
> +     }
> +
> +    /**
> +     * Log the thread's process ID or return -1 if it's unavailable for 
some reason
> +     */
> +     public synchronized static int logPID(Object o) {
> +             if(!getPIDEnabled) {
> +                     return -1;
> +             }
> +             int pid = getPID(o);
> +             String msg;
> +             if(-1 != pid) {
> +                     msg = "This thread's OS PID is " + pid;
> +             } else {
> +                     msg = "This thread's OS PID could not be determined";
> +             }
> +             System.out.println(msg + ": " + o);
> +        Logger.normal(o, msg);
> +        return pid;
> +     }
> +
> +    /**
> +     * Log the thread's process ID or return -1 if it's unavailable for 
some reason
> +     */
> +     public synchronized static int logPPID(Object o) {
> +             if(!getPPIDEnabled) {
> +                     return -1;
> +             }
> +             int ppid = getPPID(o);
> +             String msg;
> +             if(-1 != ppid) {
> +                     msg = "This thread's OS PPID is " + ppid;
> +             } else {
> +                     msg = "This thread's OS PPID could not be determined";
> +             }
> +             System.out.println(msg + ": "+o);
> +        Logger.normal(o, msg);
> +        return ppid;
> +     }
> +}
> 
> _______________________________________________
> cvs mailing list
> cvs at freenetproject.org
> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs
> 
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: 
<https://emu.freenetproject.org/pipermail/devl/attachments/20070828/03da226e/attachment.pgp>

Reply via email to