|
Hello Vengoal, Here's an example using the QWVRCSTK API without a specific thread identifier: The open job list API locates the most CPU consuming jobs on a system and subsequently retrieves the program currently running in that job: **-- Runtime requirement: ----------------------------------------------** ** ** Open list APIs are located in library QGY. ** **-- Control spec: -----------------------------------------------------** H Option( *SrcStmt: *NoDebugIo ) BndDir( 'QC2LE' ) **-- API error data structure: -----------------------------------------** D ApiError Ds D AeBytPrv 10i 0 Inz( %Size( ApiError )) D AeBytAvl 10i 0 D AeExcpId 7a D 1a D AeExcpDta 128a **-- API parameters: ---------------------------------------------------** D JlRtnRcdNbr s 10i 0 Inz( 1 ) D JlNbrFldRtn s 10i 0 Inz( %Elem( JlKeyFld )) D JlKeyFld s 10i 0 Dim( 3 ) **-- Job information: D JlJobInf Ds 512 D JbJobId 26a D JbJobUsd 10a Overlay( JbJobId: 1 ) D JbUsrUsd 10a Overlay( JbJobId: *Next ) D JbNbrUsd 6a Overlay( JbJobId: *Next ) D JbActSts 4a D JbJobTyp 1a D JbJobSubTyp 1a D JbDtaLen 10i 0 D 4a **-- Key information: D JlKeyInf Ds D KiFldNbrRtn 10i 0 D KiKeyInf 20a Dim( %Elem( JlKeyFld )) D KiFldInfLen 10i 0 Overlay( KiKeyInf : 1 ) D KiKeyFld 10i 0 Overlay( KiKeyInf : 5 ) D KiDtaTyp 1a Overlay( KiKeyInf : 9 ) D 3a Overlay( KiKeyInf : 10 ) D KiDtaLen 10i 0 Overlay( KiKeyInf : 13 ) D KiDtaOfs 10i 0 Overlay( KiKeyInf : 17 ) **-- Sort information: D JlSrtInf Ds D SiNbrKeys 10i 0 Inz( 1 ) D SiSrtInf 12a Dim( 10 ) D SiKeyFldOfs 10i 0 Overlay( SiSrtInf : 1 ) D SiKeyFldLen 10i 0 Overlay( SiSrtInf : 5 ) D SiKeyFldTyp 5i 0 Overlay( SiSrtInf : 9 ) D SiSrtOrd 1a Overlay( SiSrtInf : 11 ) D SiRsv 1a Overlay( SiSrtInf : 12 ) **-- List information: D JlLstInf Ds D LiRcdNbrTot 10i 0 D LiRcdNbrRtn 10i 0 D LiHandle 4a D LiRcdLen 10i 0 D LiInfSts 1a D LiDts 13a D LiLstSts 1a D 1a D LiInfLen 10i 0 D LiRcd1 10i 0 D 40a **-- Selection information: D JlSltInf Ds D SiJobNam 10a Inz( '*ALL' ) D SiUsrNam 10a Inz( '*ALL' ) D SiJobNbr 6a Inz( '*ALL' ) D SiJobTyp 1a Inz( '*' ) D 1a D SiOfsPriSts 10i 0 Inz( 60 ) D SiNbrPriSts 10i 0 Inz( 0 ) D SiOfsActSts 10i 0 Inz( 70 ) D SiNbrActSts 10i 0 Inz( 0 ) D SiOfsJbqSts 10i 0 Inz( 78 ) D SiNbrJbqSts 10i 0 Inz( 0 ) D SiOfsJbqNam 10i 0 Inz( 88 ) D SiNbrJbqNam 10i 0 Inz( 0 ) ** D SiPriSts 10a Dim( 1 ) D SiActSts 4a Dim( 2 ) D SiJbqSts 10a Dim( 1 ) D SiJbqNam 20a Dim( 1 ) **-- Job information key fields: D JbKeyDta Ds D JbPrcUniTim 20u 0 D JbPrcUniPct 10i 0 D JbPrcUniTimE 20u 0 **-- General return data: D JlGenDta Ds D GdBytRtn 10i 0 D GdBytAvl 10i 0 D GdElpTim 20u 0 D 16a **-- Global variables: -------------------------------------------------** D Ix s 5i 0 D Msg s 256a Varying D MsgKey s 4a D PgmNam_q s 20a **-- API constants: ----------------------------------------------------** D JOB_RESET_STAT c '1' D JOB_KEEP_STAT c '0' **-- Open list of jobs: ------------------------------------------------** D LstJobs Pr ExtPgm( 'QGYOLJOB' ) D LjRcvVar 65535a Options( *VarSize ) D LjRcvVarLen 10i 0 Const D LjFmtNam 8a Const D LjRcvVarDfn 65535a Options( *VarSize ) D LjRcvDfnLen 10i 0 Const D LjLstInf 80a D LjNbrRcdRtn 10i 0 Const D LjSrtInf 1024a Const Options( *VarSize ) D LjJobSltInf 1024a Const Options( *VarSize ) D LjJobSltLen 10i 0 Const D LjNbrFldRtn 10i 0 Const D LjKeyFldRtn 10i 0 Const Options( *VarSize ) Dim( 32 ) D LjError 1024a Options( *VarSize ) ** D LjJobSltFmt 8a Const Options( *NoPass ) ** D LjResStc 1a Const Options( *NoPass ) D LjGenRtnDta 32a Options( *NoPass: *VarSize ) D LjGenRtnDtaLn 10i 0 Const Options( *NoPass ) **-- Get list entry: ---------------------------------------------------** D GetLstEnt Pr ExtPgm( 'QGYGTLE' ) D GlRcvVar 65535a Options( *VarSize ) D GlRcvVarLen 10i 0 Const D GlHandle 4a Const D GlLstInf 80a D GlNbrRcdRtn 10i 0 Const D GlRtnRcdNbr 10i 0 Const D GlError 1024a Options( *VarSize ) **-- Close list: -------------------------------------------------------** D CloseLst Pr ExtPgm( 'QGYCLST' ) D ClHandle 4a Const D ClError 1024a Options( *VarSize ) **-- Copy memory: ------------------------------------------------------** D MemCpy Pr * ExtProc( '_MEMMOVE' ) D pOutMem * Value D pInpMem * Value D iMemSiz 10u 0 Value **-- Delay job: --------------------------------------------------------** D sleep Pr 10i 0 ExtProc( 'sleep' ) D seconds 10u 0 Value **-- Get job program: --------------------------------------------------** D GetJobPgmX Pr 20a D PxJobId 26a Const ** **-- Mainline: ---------------------------------------------------------** ** C* Eval SiNbrActSts = SiNbrActSts + 1 C* Eval SiActSts(SiNbrActSts) = 'HLD ' ** C Eval JlKeyFld(1) = 312 C Eval JlKeyFld(2) = 314 C Eval JlKeyFld(3) = 315 ** C Eval SiNbrKeys = 1 C Eval SiKeyFldOfs(1) = 49 C Eval SiKeyFldLen(1) = 4 C Eval SiKeyFldTyp(1) = 0 C Eval SiSrtOrd(1) = '2' C Eval SiRsv(1) = x'00' ** C CallP LstJobs( JlJobInf C : %Size( JlJobInf ) C : 'OLJB0300' C : JlKeyInf C : %Size( JlKeyInf ) C : JlLstInf C : 0 C : JlSrtInf C : JlSltInf C : %Size( JlSltInf ) C : JlNbrFldRtn C : JlKeyFld C : ApiError C : 'OLJS0100' C : JOB_RESET_STAT C : JlGenDta C : %Size( JlGenDta ) C ) ** C CallP sleep( 30 ) ** C CallP LstJobs( JlJobInf C : %Size( JlJobInf ) C : 'OLJB0300' C : JlKeyInf C : %Size( JlKeyInf ) C : JlLstInf C : 1 C : JlSrtInf C : JlSltInf C : %Size( JlSltInf ) C : JlNbrFldRtn C : JlKeyFld C : ApiError C : 'OLJS0100' C : JOB_KEEP_STAT C : JlGenDta C : %Size( JlGenDta ) C ) ** C If AeBytAvl = *Zero ** C DoW LiLstSts <> '2' Or C LiRcdNbrTot > JlRtnRcdNbr ** C If JbJobTyp <> 'X' C ExSr GetKeyDta C ExSr GetJobPgm C EndIf ** C Eval JlRtnRcdNbr = JlRtnRcdNbr + 1 ** C CallP GetLstEnt( JlJobInf C : %Size( JlJobInf ) C : LiHandle C : JlLstInf C : 1 C : JlRtnRcdNbr C : ApiError C ) ** C If JbPrcUniTimE <= *Zero C Leave C EndIf ** C EndDo ** C CallP CloseLst( LiHandle C : ApiError C ) ** C EndIf ** C Eval *InLr = *On ** C Return ** **-- Get Key Field Data: -----------------------------------------------** C GetKeyDta BegSr ** C Clear JbKeyDta ** C For Ix = 1 To KiFldNbrRtn ** C Select C When KiKeyFld(Ix)= 312 C CallP MemCpy( %Addr( JbPrcUniTim ) C : %Addr( JlJobInf ) + C KiDtaOfs(Ix) C : KiDtaLen(Ix) C ) ** C When KiKeyFld(Ix)= 314 C CallP MemCpy( %Addr( JbPrcUniPct ) C : %Addr( JlJobInf ) + C KiDtaOfs(Ix) C : KiDtaLen(Ix) C ) ** C When KiKeyFld(Ix)= 315 C CallP MemCpy( %Addr( JbPrcUniTimE ) C : %Addr( JlJobInf ) + C KiDtaOfs(Ix) C : KiDtaLen(Ix) C ) C EndSl ** C EndFor ** C EndSr **-- Get job program: --------------------------------------------------** C GetJobPgm BegSr ** C Eval PgmNam_q = GetJobPgmX( JbJobId ) ** C EndSr **-- Get job program: --------------------------------------------------** P GetJobPgmX B Export D Pi 20a D PxJobId 26a Const **-- API error data structure: -----------------------------------------** D ApiError Ds D AeBytPrv 10i 0 Inz( %Size( ApiError )) D AeBytAvl 10i 0 D AeExcpId 7a D 1a D AeExcpDta 128a **-- Retrieve call stack API parameters: -------------------------------** D CsRcvVar Ds D CsBytRtn 10i 0 D CsBytAvl 10i 0 D CsNbrStkE 10i 0 D CsOfsStkE 10i 0 D CsNbrEntRtn 10i 0 D CsThrId 8a D CsInfSts 1a D CsCalStk 32767a ** D CsCalStkE Ds Based( pCalStkE ) D CsStkEntLen 10i 0 D CsOfsStmIds 10i 0 D CsNbrStmIds 10i 0 D CsOfsPrcNam 10i 0 D CsLenPrcNam 10i 0 D CsRqsLvl 10i 0 D CsPgmNam 10a D CsPgmLib 10a D CsMiInst 10i 0 D CsModNam 10a D CsModLib 10a D CsCtlBdy 1a D CsRsv 3a D CsActGrpNbr 10u 0 D CsActGrpNam 10a D CsAddInf 4096a ** D CsStmIds 10a Dim( 16 ) D CsPrcNam 512a ** D CsJobId Ds D JiJobId 26a D JiJobNam 10a Overlay( JiJobId: 1 ) D JiUsrNam 10a Overlay( JiJobId: *Next ) D JiJobNbr 6a Overlay( JiJobId: *Next ) D JiIntId 16a D JiRsv 2a Inz( *Allx'00' ) D JiThrInd 10i 0 Inz( 2 ) D JiThrId 8a Inz( *Allx'00' ) ** D RtvCalStk Pr ExtPgm( 'QWVRCSTK' ) D RcRcvVar 32767a D RcRcvVarLen 10i 0 Const D RcRcvInfFmt 8a Const D RcJobId 56a Const D RcJobIdFmt 8a Const D RcError 32767a Options( *VarSize ) ** D EntNbr s 5u 0 ** **-- Mainline: ---------------------------------------------------------** ** C Eval JiJobId = PxJobId ** C CallP RtvCalStk( CsRcvVar C : %Size( CsRcvVar ) C : 'CSTK0100' C : CsJobId C : 'JIDF0100' C : ApiError C ) ** C If AeBytAvl = *Zero C Eval pCalStkE = %Addr( CsRcvVar ) + CsOfsStkE ** C For EntNbr = 1 to CsNbrEntRtn ** C If EntNbr = 1 ** C Eval CsStmIds = *Blanks C Eval CsPrcNam = *Blanks ** C If CsOfsStmIds > *Zero C CallP MemCpy( %Addr( CsStmIds ) C : %Addr( CsCalStkE ) + C CsOfsStmIds C : CsNbrStmIds * %Size( CsStmIds ) C ) C EndIf ** C If CsOfsPrcNam > *Zero C CallP MemCpy( %Addr( CsPrcNam ) C : %Addr( CsCalStkE ) + C CsOfsPrcNam C : CsLenPrcNam C ) C EndIf ** C Leave C EndIf ** C If EntNbr < CsNbrEntRtn C Eval pCalStkE = PCalStkE + CsStkEntLen C EndIf ** C EndFor C EndIf ** C Return CsPgmNam + CsPgmLib ** P GetJobPgmX E Best regards, Carsten Flensburg ----- Original Message ----- From: "Vengoal Chang" <vengoal@ddsc.com.tw> To: <rpg400-l@midrange.com> Sent: Thursday, November 21, 2002 5:19 AM Subject: How do I get a Thread id of job ? > Dear All, > I want to get some job's call stack, but the QWVRCSTK API need > the Thread identifier in JIDF0100 Format. How do I get the job thread > identifier ?
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.