Rick,

when invoking that program via Java, then it works without a problem!

If invoked via Java then in the native layer an AttachThread() is
invoked, a Routine object is created and invoked with CallRoutine(),
followed by a matching DetachThread().

---rony



Rony G. Flatscher wrote:
> Rick McGuire wrote:
>> I just thought of one more thing that could cause the error you're
>> seeing.  If you do an AttachThread() at some point and neglect to do a
>> corresponding DetachThread() before returning to your caller, you'll
>> end up with a corrupted activaation stack that will result in problems
>> with legacy callback APIs like RexxVariablePool or RexxStemSort.
>> What;s showing up in this traceback very much appears to match what
>> might happen in that sort of situation.
>>   
>
> In this particular program an external function BSF(), defined as
>
>     RexxRoutine1(RexxObjectPtr, BSF, ARGLIST, argArray) {...}
>       
>
> gets invoked to communicate to the Java side. There are no calls from
> Java into BSF4Rexx occurring, hence there AttachThread() and
> DetachThread() are not invoked in this case (at least not from BSF4Rexx).
>
> Also, BSF4Rexx in this case does not excercise any variable gets or
> sets. It just interacts with Java and returns a (string) value back,
> which gets stored in the stem.
>
> ---rony
>
> P.S.: Just for completeness, here is the Rexx program in question:
>
>     /* classic Rexx version, ---rgf, 2003-02, 2003-05-10, 2003-09-04, 
> 2005-12-28 */
>
>     /* this version works on Java 1.1 too (because using "wrapEnumeration()") 
> */
>
>           /* load the BSF4Rexx functions and start a JVM, if necessary */
>     if rxFuncQuery("BSF") = 1 then   /* BSF() support not loaded yet ? */
>     do
>        call rxFuncAdd "BsfLoadFuncs", "BSF4Rexx", "BsfLoadFuncs"
>        call BsfLoadFuncs          /* load all BSF*() functions  */
>        call BsfLoadJava           /* load Java                  */
>     end
>
>        /* 'Class.class' is pre-registered for Rexx, cf. docs */
>     system=bsf('invoke', 'Class.class', 'forName', 'java.lang.System')
>
>     properties=bsf('invoke', system, "getProperties")  /* get the System 
> properties  */
>
>     enum=bsf('invoke', properties, 'propertyNames')    /* get an enumeration 
> of the property names */
>
>        /* wrap the Enumeration object, so Java 1.1 can handle this too 
> (overcome Java inner class access restriction) */
>        /* the following statement is *not* necessary for Java >= 1.2 */
>     enum=bsf('wrapEnumeration', enum)
>
>     say copies("=", 70)
>
>     stem. = 0
>     deli  = "010203"x
>     do i=1 to 5000 while bsf('invoke', enum, 'hasMoreElements') /* loop over 
> enumeration   */
>        key=bsf('invoke', enum, 'nextElement')
>        stem.i= key || deli || bsf('invoke', properties, 'getProperty', key)
>        stem.0=i       /* remember total of elements */
>     end
>
>     say stem.0 "elements, now sorting..."
>     call sysStemSort "stem."
>
>     l=length(stem.0)
>     do i=1 to stem.0
>        parse var stem.i key (deli) val
>        say i~right(l)":" pp(key)~left(31)"="pp(val)
>     end
>
>     exit
>
>     pp: procedure
>        return "[" || arg(1) || "]"
>         
>

------------------------------------------------------------------------------
Register Now for Creativity and Technology (CaT), June 3rd, NYC. CaT
is a gathering of tech-side developers & brand creativity professionals. Meet
the minds behind Google Creative Lab, Visual Complexity, Processing, & 
iPhoneDevCamp asthey present alongside digital heavyweights like Barbarian
Group, R/GA, & Big Spaceship. http://www.creativitycat.com 
_______________________________________________
Oorexx-devel mailing list
Oorexx-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/oorexx-devel

Reply via email to