This proposal attempts to meet with the discussions that have been taking place in the past years regarding supplying multithreaded related trace information to regular trace. In the following the multithreaded related trace information is referred to as "mtPrefix" (multithreaded prefix) meant to be placed before the formatted trace line.

A few remarks upfront:

 * having by default mtPrefix active was seen as problematic,
 * using an environment variable to activate mtPrefix was not seen to be 
 * Rick came up with the idea of allowing the Rexx programmer to define his own 

The proposal for a multithreaded trace prefix ("mtPrefix") is as follows:

 * define a TraceObject class as a subclass of StringTable with a makeString 
method that yields the
   trace line by default,

 * define a class attribute on TraceObject by the name of "mtPrefix". If the 
programmer sets the
   value to .true, then the mtPrefix will get prepended to each trace line by 
default until the
   value gets changed to .false; this allows the Rexx programmer full control 
such that mtPrefix
   can only be triggered intentionally,

 * ooRexx should create a traceObject in "Activity::traceOutput(...)" filling 
in the trace line and
   all mtPrefix related information with the following index and values:

       index:             value:

       TRACELINE          a string
       INSTANCE           a number (interpreter instance, led in by default: 
       THREAD             a number (activity, led in by default: "T")
       INVOCATION         a number (activation, led in by default: "I")
       VARIABLEDICTIONARY a number, if 0 then the remainder are not stored (led in by 
default: "V")
       ISGUARDED          .true or .false
       LOCKCOUNT          a number (reservecount, led in by default: "L")
       ISLOCKED           .true or .false

     o the default mtPrefix in TraceObject should supply all information in the 
following format to
       allow full analysis of the most complex multithreaded Rexx programs: 
"[R1   T1   I5   G V1  
       L2 *]" where the first three words will always be given, the last four 
words only if the
       traceline is for method routine statements (for a detailed discussion 
please see today's
       posting entitled "Draft: documentation for multithreaded trace prefix 
(mtPrefix)"). The
       square brackets are part of mtPrefix to make parsing easy and as such 
also writing analysis
       programs of mtPrefix traces, if need be.

 * instead of sending the trace line (a string at the moment) in 
   create and send the traceObject that contains among other things the 
traceline entry, hence
   "stream->sendMessage(GlobalNames::LINEOUT, traceObject, result);"

 * a Rexx programmer who wants to define the mtPrefix value on his own will be 
able to do so by:

     o creating an own class that

         + caches .traceOutput~current in its constructor from the time where 
the monitored object
           gets replaced by an instance of this class (for this example using 
the attribute named

         + implements a method LINEOUT to intercept the argument

             # if the argument is not a TraceObject (it may have been already 
processed or changed)
               then pass on the argument unchanged, e.g. with

               FORWARD TO (cachedTraceOutput)

             # if the argument is a TraceObject then create the desired 
mtPrefix taking advantage
               of the information stored in the TraceObject (a StringTable), 
maybe including the
               traceline and forward the result to the attribute 
cachedTraceOutput, e.g. in the
               case of a string in a variable named editedTraceString with

               FORWARD TO (cachedTraceOutput) ARRAY (editedTraceString)

As a result:

 * tracing remains unchanged by default,

 * adding mtPrefix is easy by either

     o setting the TraceObject's class attribute mtPrefix to .true, */or
     o defining an own class to format the  traceline any way the programmer 
sees as helpful as
       described above

 * no need for adding a new function to control mtPrefix , no need to change 
anything in the TRACE
   keyword statement nor in the TRACE() BIF (the language remains small)


Oorexx-devel mailing list

Reply via email to