[Info-vax] Timeout in a write using QUIW.
Dave Froble
davef at tsoft-inc.com
Thu Jun 22 13:25:59 EDT 2023
On 6/21/2023 7:38 PM, Dave Froble wrote:
> On 6/21/2023 5:36 PM, Jan-Erik Söderholm wrote:
>> Den 2023-06-21 kl. 23:25, skrev Stephen Hoffman:
>>> On 2023-06-21 20:45:12 +0000, Jan-Erik Sderholm said:
>>>
>>>> Now, here is a technical one...
>>>>
>>>> When doing a *read* from a terminal device using QIOW, one
>>>> can use IO$M_TIMED and supply a timeout value in P3. That
>>>> works perfectly and we use that a lot...
>>>
>>> I've never had great success...
>>
>>
>> I'm sorry about that. As I wrote, it works perfectly. In the
>> case of reads, of course, where it is supported.
>>
>> My question was about writes, and it has been confirmed that
>> timeout paramaters are not supported there. Thanks Arne.
>>
>> Now we need to weight the coding work against getting
>> network cables installed to the printers. Wired printers
>> will also "solve" the issue with the current code. We have
>> 15-20 older similar Zebra label printers, all wired, and
>> we do not see these error scenarios with those.
>> All using the same C routine for the QIOW calls.
>>
>>
>> Jan-Erik.
>
>
> Well, if you have an AST routine such as:
>
> 1 !************************************************
> ! Timer AST Timeout Handler to Cancel I/O
> !************************************************
>
> SUB TCP_TIMER( LONG CH% , &
> LONG Z2% , &
> LONG Z3% , &
> LONG Z4% , &
> LONG Z5% )
>
> CALL SYS$CANCEL( Loc(CH%) By Value )
>
> SubEnd
>
> And then in you program define the routine as external:
>
> EXTERNAL LONG FUNCTION TCP_TIMER ! Timer AST routine
>
> And then queue the timer routine:
>
> !***************** Set timer AST *****************
> Stat% = SYS$SETIMR( , WAIT.PRD , ! Delta time &
> LOC(TCP_TIMER) By Value , &
> CH% By Value , ) ! AST rtn and channel
This code has been working well for years, and I hadn't looked at it until
recently. I find the lack of testing the completion status of the system
service to be sloppy. One might ask, "what can go wrong?", and probably will
not, but it is possible, I think. So, a better practice would be to at least
test Stat% AND SS$_NORMAL. Just saying ...
> Stat% = SYS$QIOW( , ! Event flag &
> CH% By Value, ! VMS channel &
> IO$_ACCESS By Value, ! Operation &
> IOSB::Stat%, ! I/O status block &
> , ! AST routine &
> , ! AST parameter &
> , ! P1 &
> , ! P2 &
> SERVER.ITEMLST::LEN%, ! P3 - remote socket n^
> , ! P4 - &
> , ! P5 &
> ) ! P6
>
> If ( Stat% And SS$_NORMAL ) = 0%
> Then Call VMSERR( Stat% , E$ )
> E$ = "Unable to queue connect to host - " + E$
> E% = -1%
> SaveStat% = Stat%
> GoTo Close_Socket
> End If
>
> If ( IOSB::Stat% And SS$_NORMAL ) = 0%
> Then If IOSB::Stat% = SS$_ABORT &
> OR IOSB::Stat% = SS$_CANCEL
> Then E$ = "Timeout"
> Else Call VMSERR( IOSB::Stat% , E$ )
> End If
> E$ = "Unable to connect to host - " + E$
> E% = -1%
> SaveStat% = IOSB::Stat%
> GoTo Close_Socket
> End If
>
> Note, if the QIOW exits with the IOSB status of ABORT or CANCEL then you can
> assume it was the cancel in the AST routine. However, I feel that some other
> reason might set that status. Never bothered to look into it further.
>
> My planning is that if this happens, then the QIOW failed, and it's time to move
> on, regardless of why it failed.
>
> Note, the wait period can be set up with:
>
> WW% = W% ! Set delta time
> Stat% = LIB$CVT_TO_INTERNAL_TIME( LIB$K_DELTA_SECONDS , WW% , WAIT.PRD )
>
> Should be easy to figure out by reading the docs on the various system services
> and LIB$ routines.
>
--
David Froble Tel: 724-529-0450
Dave Froble Enterprises, Inc. E-Mail: davef at tsoft-inc.com
DFE Ultralights, Inc.
170 Grimplin Road
Vanderbilt, PA 15486
More information about the Info-vax
mailing list