Rick,

When you have time can you take a look at this.  It is another case
where I see why the problem is happening but don't know what a good
fix is.

I added a subdirectory to the incubator at:

oorexx/incubator/4.0.0.examples/api/reader.writer/no.prologue

that has the code to create a program that demonstrates this problem:

When RexxStart() is used to call the interpreter several times in the
same process to run a Rexx program that has a ::requires, and the
required file has a prologue of executable code, the prologue only
executes for the first use of RexxStart().  On the successive
RexxStart()s the prologue does not execute.  But, it only happens for
some ::requires files.

There is a make file to build the executable, you'll just need to edit
the line towards the top to point to your build directory.  After you
build run rxStart.exe with no args to see an example of when the
prologue does execute for each RexxStart().  Run rxStart with the arg
of logon.rex to see an example of when the prologue only executes for
the first RexxStart().  You'll get output similar to:

E:\work.ooRexx\other\examples\4.0.examples\no.prologue>rxstart
C++, round # [1] ...
  req02.rex: in prolog code of [req02.rex]
Hello World from prolog code of req02.rex
  req01.rex: in prolog code of [req01.rex]
Hello World from prolog code of req01.rex
  simple.rex: in [simple.rex], received arg: [1]
... RexxStart() return code=[0] | returned result value=[returning
from ooRexx: <1>] | converted return code=[0]
---
C++, round # [2] ...
  req02.rex: in prolog code of [req02.rex]
Hello World from prolog code of req02.rex
  req01.rex: in prolog code of [req01.rex]
Hello World from prolog code of req01.rex
  simple.rex: in [simple.rex], received arg: [2]
... RexxStart() return code=[0] | returned result value=[returning
from ooRexx: <2>] | converted return code=[0]
---
C++, round # [3] ...
  req02.rex: in prolog code of [req02.rex]
Hello World from prolog code of req02.rex
  req01.rex: in prolog code of [req01.rex]
Hello World from prolog code of req01.rex
  simple.rex: in [simple.rex], received arg: [3]
... RexxStart() return code=[0] | returned result value=[returning
from ooRexx: <3>] | converted return code=[0]
---

E:\work.ooRexx\other\examples\4.0.examples\no.prologue>rxstart logon
C++, round # [1] ...
In oodPlain.cls
XXXXXXX-Make sure this marker is seen-XXXXXXXXXXXXXXXXXXXXX
The user is granted access to the system.
... RexxStart() return code=[1] | returned result value=[1] |
converted return code=[1]
---
C++, round # [2] ...
The user is granted access to the system.
... RexxStart() return code=[2] | returned result value=[2] |
converted return code=[2]
---
C++, round # [3] ...
The user is granted access to the system.
... RexxStart() return code=[3] | returned result value=[3] |
converted return code=[3]
---

E:\work.ooRexx\other\examples\4.0.examples\no.prologue>

What happens is, in PackageManager::loadRequires(), for the first
RexxStart(), the checkRequiresCache() for the resolvedName returns
OREF_NULL, and then getRequiresFile() is called and the prologue gets
executed for both cases.

For the second RexxStart().

For the case where the prologue is executed: in checkRequiresCache()
for this code:

    WeakReference *requiresRef = (WeakReference *)loadedRequires->get(name);
    if (requiresRef != OREF_NULL)
    {
        PackageClass *resolved = (PackageClass *)requiresRef->get();
        if (resolved != OREF_NULL)
        {
            result = resolved;
            return resolved;
        }
        // this was garbage collected, remove it from the table
        loadedRequires->remove(name);
    }

The weak reference requiresRef is not null, but the resolved
PackageClass is null, so OREF_NULL is returned, getRequiresFile() is
invoked and the prologue executes.

For the case where the prologue is not executed, requiresRef is not
null and resolved is not null, so resolved is returned and
getRequiresFile() is skipped.  With getRequiresFile() skipped, the
prologue is never executed.

--
Mark Miesfeld

------------------------------------------------------------------------------
_______________________________________________
Oorexx-devel mailing list
Oorexx-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/oorexx-devel

Reply via email to