@@ -508,6 +508,110 @@ var _inputFns = new Map([
508508 }
509509 _$o ( _r , options )
510510 } ] ,
511+ [ "javathread" , ( _res , options ) => {
512+ var lines
513+ _showTmpMsg ( )
514+ if ( isDef ( params . javathreadpid ) ) {
515+ ow . loadJava ( )
516+ try {
517+ lines = ow . java . jcmd ( params . javathreadpid , "Thread.print" )
518+ lines = lines . split ( "\n" ) . filter ( l => l . startsWith ( "\"" ) )
519+ } catch ( e ) {
520+ _exit ( - 1 , "Error getting Java thread dump: " + e . message )
521+ }
522+ } else {
523+ if ( isString ( _res ) ) {
524+ lines = _res . split ( "\n" )
525+ } else {
526+ _exit ( - 1 , "javathreads is only supported with a raw input or javathreadpid=." )
527+ }
528+ }
529+
530+ // TODO: remove after OpenAF stable > 20240212
531+ var fnFromTimeAbbr = aStr => {
532+ _$ ( aStr , "aStr" ) . isString ( ) . $_ ( )
533+
534+ var ars = aStr . trim ( ) . match ( / [ \d \. ] + [ a - z A - Z ] + / g) , res = 0 ;
535+ if ( ! isArray ( ars ) || ars . length === 0 ) return parseFloat ( aStr ) ;
536+ for ( var i in ars ) {
537+ var ar = ars [ i ] . match ( / ( \d + (?: \. \d + ) ? ) \s * ( [ a - z A - Z ] + ) / ) ;
538+ if ( isArray ( ar ) && ar . length > 0 ) {
539+ var v = Number ( ar [ 1 ] )
540+ var u = String ( ar [ 2 ] )
541+
542+ var _u = {
543+ "ms" : 1 ,
544+ "s" : 1000 ,
545+ "m" : 60 * 1000 ,
546+ "h" : 60 * 60 * 1000 ,
547+ "d" : 24 * 60 * 60 * 1000 ,
548+ "w" : 7 * 24 * 60 * 60 * 1000 ,
549+ "M" : 30 * 24 * 60 * 60 * 1000 ,
550+ "y" : 365 * 24 * 60 * 60 * 1000
551+ }
552+ if ( isDef ( _u [ u ] ) ) {
553+ res += v * _u [ u ]
554+ } else {
555+ res += v
556+ }
557+ }
558+ }
559+
560+ return res
561+ }
562+
563+ var fnJavaTrans = ( v , tA ) => {
564+ if ( v === null ) return ""
565+ if ( v === undefined ) return ""
566+ if ( isBoolean ( v ) ) return Boolean ( v )
567+ if ( isNumber ( v ) ) return Number ( v )
568+ if ( tA ) return fnFromTimeAbbr ( String ( v ) )
569+ return String ( v )
570+ }
571+ ow . loadFormat ( )
572+
573+ var _r = [ ]
574+ lines . forEach ( line => {
575+ if ( line . startsWith ( "\"" ) ) {
576+ var pt = java . util . regex . Pattern . compile ( "^\\\"(?<threadName>[^\"]+)\\\"" +
577+ "(?:\\s+#(?<threadId>\\d+))?" +
578+ "(?:\\s+\\[(?<threadIndex>\\d+)\\])?" +
579+ "(?:\\s+(?<daemon>daemon))?" +
580+ "(?:\\s+prio=(?<prio>\\d+))?" +
581+ "\\s+os_prio=(?<osPrio>\\d+)" +
582+ "(?:\\s+cpu=(?<cpu>[0-9.]+ms))?" +
583+ "(?:\\s+elapsed=(?<elapsed>[0-9.]+s))?" +
584+ "(?:\\s+tid=(?<tid>0x[a-fA-F0-9]+))?" +
585+ "(?:\\s+nid=(?<nid>0x[a-fA-F0-9]+|\\d+|\\S+))?" +
586+ "(?:\\s+(?<state>.*?))?" +
587+ "(?:\\s+\\[(?<address>[^\\]]+)\\])?" +
588+ "\\s*$" )
589+
590+ var mt = pt . matcher ( line )
591+ if ( mt . find ( ) ) {
592+ var m = {
593+ threadGroup : fnJavaTrans ( mt . group ( "threadName" ) ) . replace ( / [ ^ a - z A - z ] ? \d + $ / , "" ) ,
594+ threadName : fnJavaTrans ( mt . group ( "threadName" ) ) ,
595+ threadId : fnJavaTrans ( mt . group ( "threadId" ) ) ,
596+ threadIndex : fnJavaTrans ( mt . group ( "threadIndex" ) ) ,
597+ daemon : fnJavaTrans ( mt . group ( "daemon" ) ) ,
598+ prio : fnJavaTrans ( mt . group ( "prio" ) ) ,
599+ osPrio : fnJavaTrans ( mt . group ( "osPrio" ) ) ,
600+ cpu_ms : fnJavaTrans ( mt . group ( "cpu" ) , true ) ,
601+ elapsed_ms : fnJavaTrans ( mt . group ( "elapsed" ) , true ) ,
602+ tid : fnJavaTrans ( mt . group ( "tid" ) ) ,
603+ nid : fnJavaTrans ( mt . group ( "nid" ) ) ,
604+ state : fnJavaTrans ( mt . group ( "state" ) ) ,
605+ address : fnJavaTrans ( mt . group ( "address" ) )
606+ }
607+ _r . push ( m )
608+ } else {
609+ _r . push ( { error : "Could not parse line: " + line } )
610+ }
611+ }
612+ } )
613+ _$o ( _r , options )
614+ } ] ,
511615 [ "javagc" , ( _res , options ) => {
512616 if ( ! isBoolean ( params . javagcjoin ) ) params . javagcjoin = toBoolean ( _$ ( params . javagcjoin , "javagcjoin" ) . isString ( ) . default ( __ ) )
513617
0 commit comments