I have a library that implements CMS/TSO Piprlines support for the PC.

I have interfaced this library to ooRexx 4.0. To accomplish this I had 
to make so changes
to the 4.0 beta.

1) The interface is thru a SubCom environment. I had to modify the 
subcom CommandHandler to
     pass a CallContext to the library entry point. Like the following:
              
    __declspec(dllexport) RexxReturnCode REXXENTRY PipeSubCom(
          RexxCallContext *context,
          PCONSTRXSTRING Command, /* Command string passed from the 
caller */
          unsigned short *Flags, /* pointer too short for return of flags */
           PRXSTRING Retstr) /* pointer to RXSTRING for RC return */
   
     This was necessary because the PipeLine library creates several 
threads to process the request.
      Thus the RexxVariablePool is not available to these new threads.
    
      The RexxCallContext provides the needed access via 
GetContextVariable() and SetContextVariable().

      Although for my testing purposes I did not do this, I think the 
best way to handle this
      would be to add a fourth optional parameter to the "RxSubCom 
Register" request.
       This optional parameter would specify the context to passed on a 
call to the subcom entry point. IE
             "rxsubcom register  rxpipe rxpipe pipesubcom  callcontext"

2)  The user is able to write their own pipeline stages in Rexx. The 
pipeline invokes these stages via
     a new Rexx function "RexxStartSubCom". This routine is just 
RexxStart with an additional parameter.
     I had to add an additional parameter for a pointer to the pipeline 
context that the user stages is running
     under. I stored this pointer in the "LocalEnvironment" directory. 
The RexxCallContext has routines to
     access this directory.  I am not particular where this pointer is 
stored as long as I have access to it.
     Also I am happy to use the new interface to invoke the user stages. 
This way just seemed easier for my
     testing purposes.
     This is my new RexxStartSubCom:

         int REXXENTRY RexxStartSubCom (
           size_t,                       /* Num of args passed to rexx */
           PCONSTRXSTRING,               /* Array of args passed to rex */
           const char *,                 /* [d:][path] filename[.ext]  */
           PRXSTRING,                    /* Loc of rexx proc in memory */
            void *,                       /* SubCom context             */
            const char *,                 /* ASCIIZ initial environment.*/
            int,                          /* type (command,subrtn,funct) */
            PRXSYSEXIT,                   /* SysExit env. names &  codes */
            short *,                      /* Ret code from if numeric   */
            PRXSTRING );                  /* Retvalue from the rexx proc */

typedef RexxReturnCode (REXXENTRY *PFNREXXSTARTSUBCOM)(size_t, 
PCONSTRXSTRING,
       const  char *, PRXSTRING,  void *, const char *, int, PRXSYSEXIT, 
short *,   PRXSTRING);

#define REXXSTARTSUBCOM RexxStartSubCom
 
       In ActivityDispather.hpp I changed the definition of
            "virtual void invoke(PRXSYSEXIT exits, const char *env);"
       to the following:
               virtual void invoke(PRXSYSEXIT exits, const char *env, 
void *subComContext);

       Thus in my RexxStartSubCOm I have the following:
           arguments.invoke(exits, envname, subComContext);

        I also changed the other occurrences of arguments.invoke() to be:
            arguments.invoke(exits, envname, NULL);

         I modified the ActivityDispatcher::invoke() routine as follows:
         void ActivityDispatcher::invoke(PRXSYSEXIT exits, const char 
*env, void * subComContext)
        {
            // this creates a new instance to run under, with an active 
activity
           InstanceBlock instance(exits, env);
           if (subComContext) {
              RexxString *index = new_string("SubComContext");
              RexxPointer *ptr = new_pointer(subComContext);
              RexxDirectory *local = instance.instance->getLocal();
              local->put(ptr, index);
          }
        // go run the instance on the current activity
        instance.activity->run(*this);
        } 


Is there any chance of getting these changes into ooRexx 4.0?

------------------------------------------------------------------------------
The NEW KODAK i700 Series Scanners deliver under ANY circumstances! Your
production scanning environment may not be a perfect world - but thanks to
Kodak, there's a perfect scanner to get the job done! With the NEW KODAK i700
Series Scanner you'll get full speed at 300 dpi even with all image 
processing features enabled. http://p.sf.net/sfu/kodak-com
_______________________________________________
Oorexx-devel mailing list
Oorexx-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/oorexx-devel

Reply via email to