[Info-vax] Returning data from Cobol AST routine.
Bob Gezelter
gezelter at rlgsc.com
Wed Sep 22 09:01:33 EDT 2021
On Wednesday, September 22, 2021 at 3:41:15 AM UTC-4, Jan-Erik Söderholm wrote:
> Den 2021-09-22 kl. 03:37, skrev Arne Vajhøj:
> > On 9/21/2021 8:31 PM, Jan-Erik Söderholm wrote:
> >> Den 2021-09-22 kl. 01:31, skrev Arne Vajhøj:
> >>> On 9/21/2021 6:55 PM, Jan-Erik Söderholm wrote:
> >>>> This ACCVIO's on the display statement. The weird thing is that
> >>>> the virtual address in the ACCVIO message is ...00042D, and that
> >>>> is the hex for the value I used, in decimal 1234.
> >>>>
> >>>> I must be missing something, it looks like the display statement tries
> >>>> to use the value in reqidt as an address instead of the actual value...
> >>>
> >>> I know next to nothing about COBOL, but if COBOL use call by ref as
> >>> default like FORTRAN, so that the AST routine expects an address,
> >>> then the error makes sense.
> >>
> >> Right. When calling *from* Cobol you can specify "by ref", "by val"
> >> and so on. I have looked but I cannot find anything similar when a
> >> Cobol routine is *called*. But yes, it very much looks like that a
> >> called Cobol routine expects a "by ref" (pointer) parameter.
> >>
> >> But the SETIMR docs says that this parameter is sent by value.
> >>
> >>> And the solution could be to call with
> >>> address of reqidt in main code (I don't know how to do that i COBOL
> >>> but it must be possible).
> >>>
> >>
> >> Good point... And that solved this issue!
> >>
> >>
> >> 01 reqidt pic 9(9) comp.
> >> ...
> >> move 1234 to reqidt
> >> call "sys$setimr"
> >> using omitted
> >> by reference delta-time
> >> by value ast-proc-addr
> >> by reference reqidt <<==
> >> omitted
> >> giving return-value
> >> end-call
> >>
> >> Replaced "by value reqidt" with "by reference reqidt".
> >> That will pass the address (pointer) to reqidt.
> >> Silly not thinking about that...
> >>
> >> The AST routine just uses the paramater as-is as before
> >> an now prints "reqidt: 1234" as expected.
> >
> > I would probably have preferred to keep the formal
> > argument as by val and stuffed the address into an integer
> > and passed that. Slightly more complicated but I just
> > don't like faking the passing mechanism of a system
> > service.
> >
> > Arne
> >
> Not that much more complicated, one additional pointer definition:
>
> 01 reqidt_addr pointer value reference reqidt.
> 01 reqidt pic 9(9) comp.
> ...
> move 1234 to reqidt
>
> call "sys$setimr"
> using omitted
> by reference delta-time
> by value ast-proc-addr
> by value reqidt_addr
> omitted
> giving return-value
> end-call
>
> This also works. A matter of taste, I guess. :-)
>
> Now, a bigger issue is that I found this in the Rdb docs:
>
> ------------------------------------------------------------
> 15.3 Avoiding Asynchronous System Traps
>
> You should not use asynchronous system trap (AST) service routines in
> an application that accesses Oracle Rdb databases. If you do, Oracle
> Rdb cannot guarantee the behavior of the application.
>
> Because several Oracle Rdb components use AST service routines and
> because an AST cannot be delivered while an AST service routine is
> currently executing at the same mode or more privileged mode, using
> an AST service routine in an application can prevent the delivery of
> an AST in one of the components of Oracle Rdb.
> ------------------------------------------------------------
>
> I posted a question on the Rdb mailing list regarding ASTs, and got
> this from, what I regard as, an trustworthy source:
>
> ------------------------------------------------------------
> Seems pretty clear. At any access mode the program can be either in
> non-AST or AST mode.
>
> As long as you are very well aware of this, make certain that your
> AST-mode code does whatever it does, never calls anything related
> to Rdb, and then exits, you are probable just fine. Do not do
> anything that might block (e.g. potential synchronous IO or similar;
> explicitly avoid RMS directly or indirectly).
>
> Best that you studiously avoid anything to do with timers or
> $HIBER/$WAKE to make your future life easier.
> ------------------------------------------------------------
>
> It is very much the general guidelines for any interrupt handling
> on any kind of environment (have done PIC microcontroller work before).
> In all cases, keep your interrupt (or AST) rooutines as short as
> possible and let the main code do the processing...
>
> We'll see. Still under investigation.
Jan-Erik,
Yes, that comment in the Oracle RDB documentation is the point that I was referring to in my DECUS seminar. The solution is to have the main thread read from an interlocked queue.
- Bob Gezelter, http://www.rlgsc.com
More information about the Info-vax
mailing list