|
Hi,
I'm trying to use the DEQ instruction and i have a problem with keyed queue.
With sequential queue the code is ok but with keyed queue the time out is
reached without retrieving queue entry.
Here the code:
/*-------------------------------------------------------------------*/
/*?Entry Point
/*-------------------------------------------------------------------*/
ENTRY * (*ENTRY) EXT;
/*-------------------------------------------------------------------*/
/*?Template For Entry Parms
/*-------------------------------------------------------------------*/
DCL SPCPTR E_QUEUE@ PARM;
DCL SPCPTR E_MSG@ PARM;
DCL SPCPTR E_RET@ PARM;
DCL SPCPTR E_TYPE@ PARM;
DCL SPCPTR E_REL@ PARM;
DCL SPCPTR E_WAIT@ PARM;
DCL SPCPTR E_KEY@ PARM;
DCL SPCPTR E_DUMMY@ PARM;
DCL DD E_QUEUE CHAR( 20) BAS(E_QUEUE@);
DCL DD E_MSG CHAR(32767) BAS(E_MSG@);
DCL DD E_MSG$ BIN( 4) DEF(E_MSG) POS( 1);
DCL DD E_RET PKD( 1) BAS(E_RET@);
DCL DD E_TYPE CHAR( 1) BAS(E_TYPE@);
DCL DD E_REL CHAR( 2) BAS(E_REL@);
DCL DD E_WAIT BIN( 4) BAS(E_WAIT@);
DCL DD E_KEY CHAR( 260) BAS(E_KEY@);
DCL DD E_KEY$ BIN( 4) DEF(E_KEY) POS( 1);
DCL DD E_DUMMY CHAR( 1) BAS(E_DUMMY@);
DCL OL *ENTRY (E_QUEUE@,
E_MSG@,
E_RET@,
E_TYPE@,
E_REL@,
E_WAIT@,
E_KEY@,
E_DUMMY@) PARM EXT;
/COPY MI_ERR1
/COPY MI_ERR2
/COPY MI_RSLV
/COPY M2_MITIME
/*-------------------------------------------------------------------*/
/*?Others Data
/*-------------------------------------------------------------------*/
DCL DD *USQ CHAR( 2) AUTO INIT(X'0A02');
DCL SYSPTR *USQ_PTR@ AUTO;
DCL DD KEY$ BIN( 4) AUTO INIT(0);
DCL SPCPTR MESSAGE@ AUTO INIT(MESSAGE);
DCL DD MESSAGE CHAR(32767) AUTO BDRY(16);
DCL DD MSG_PREFIX CHAR(533) BDRY(16) AUTO;
DCL DD MSG_P_TS CHAR( 8) DEF(MSG_PREFIX) POS( 1);
DCL DD MSG_P_WAITT CHAR( 8) DEF(MSG_PREFIX) POS( 9);
DCL DD MSG_P_SOMSQ BIN( 4) DEF(MSG_PREFIX) POS( 17);
DCL DD MSG_P_STATE CHAR( 1) DEF(MSG_PREFIX) POS( 21);
DCL DD MSG_P_SKEY CHAR( 256) DEF(MSG_PREFIX) POS( 22);
DCL DD MSG_P_MKEY CHAR( 256) DEF(MSG_PREFIX) POS(278);
/*-------------------------------------------------------------------*/
/*?Starting Program
/*-------------------------------------------------------------------*/
CMPBLA(B) E_DUMMY,X'FA'/NEQ(EXIT);
CPYNV E_RET,P'+0';
/*-------------------------------------------------------------------*/
/*?Resolve Pointer To Space
/*-------------------------------------------------------------------*/
CMPBLA(B) E_QUEUE(11:10),'*LIBL '/EQ(RSL2);
CMPBLA(B) E_QUEUE(11:10),'QTEMP '/EQ(RSL3);
RSL1:
CPYBLA RSL_TYPE,*LIB;
CPYBLAP RSL_NAME,E_QUEUE(11:10),' ';
RSLVSP *LIB_PTR@,RSL_PTR,*,*;
CPYBLA RSL_TYPE,*USQ;
CPYBLAP RSL_NAME,E_QUEUE(01:10),' ';
RSLVSP *USQ_PTR@,RSL_PTR,*LIB_PTR@,*;
B QUEUE;
RSL2:
CPYBLA RSL_TYPE,*USQ;
CPYBLAP RSL_NAME,E_QUEUE(01:10),' ';
RSLVSP *USQ_PTR@,RSL_PTR,*,*;
B QUEUE;
RSL3:
CPYBLA RSL_TYPE,*USQ;
CPYBLAP RSL_NAME,E_QUEUE(01:10),' ';
RSLVSP *USQ_PTR@,RSL_PTR,QTEMP@,*;
B QUEUE;
/*-------------------------------------------------------------------*/
/*?Dequeue Message
/*-------------------------------------------------------------------*/
QUEUE:
DCL EXCM _KEY EXCID(H'2401') BP(SKIP1) SKP;
MODEXCPD _KEY,X'A000',X'01';
CPYNV KEY$,E_KEY$;
SKIP1:
MODEXCPD _KEY,X'2000',X'01';
CPYBREP MSG_P_STATE,X'00';
CPYBREP MSG_P_SKEY,' ';
SETBTS MSG_P_STATE,0;
SETBTS MSG_P_STATE,1;
SETBTS MSG_P_STATE,2;
CMPNV(B) E_WAIT,-1/NEQ(NOMAX);
SETBTS MSG_P_STATE,3;
B ENOMAX;
NOMAX:
CPYNV XMI_SECONDS,E_WAIT;
CALLX MITIME$@,MITIME$_OL,*;
CPYBLA MSG_P_WAITT,XMI_RETURN;
ENOMAX:
CMPBLA(B) E_TYPE,'F'/EQ(DOF0001);
CMPNV(B) KEY$,0/EQ(EXIT);
CPYBLA MSG_P_SKEY,E_KEY(5:E_KEY$);
CMPBLA(B) E_REL,X'0010'/NEQ(ELF0001);
BLF0001:
OR(S) MSG_P_STATE ,X'02';
B DOF0001;
ELF0001:
CMPBLA(B) E_REL,X'0100'/NEQ(ELF0002);
BLF0002:
OR(S) MSG_P_STATE ,X'04';
B DOF0001;
ELF0002:
CMPBLA(B) E_REL,X'0110'/NEQ(ELF0003);
BLF0003:
OR(S) MSG_P_STATE ,X'06';
B DOF0001;
ELF0003:
CMPBLA(B) E_REL,X'1000'/NEQ(ELF0004);
BLF0004:
OR(S) MSG_P_STATE ,X'08';
B DOF0001;
ELF0004:
CMPBLA(B) E_REL,X'1010'/NEQ(ELF0005);
BLF0005:
OR(S) MSG_P_STATE ,X'0A';
B DOF0001;
ELF0005:
CMPBLA(B) E_REL,X'1100'/NEQ(EXIT);
BLF0006:
OR(S) MSG_P_STATE ,X'0C';
B DOF0001;
ELF0006:
DOF0001:
BRK '100';
DEQ MSG_PREFIX,MESSAGE@,*USQ_PTR@;
CMPNV(B) MSG_P_SOMSQ,0/EQ(EXIT);
CPYNV E_RET,P'+1';
CPYBLA E_MSG(5:E_MSG$),MESSAGE(1:MSG_P_SOMSQ);
/*-------------------------------------------------------------------*/
/*?Exit Program
/*-------------------------------------------------------------------*/
EXIT:
DEACTPG *;
RTX *;
/COPY MI_EXCM
/COPY MI_HNDL
If someone could take a look and find where is the problem it will be fine.
Regards
Philippe
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 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.