RexxActivity.hpp
Go to the documentation of this file.
1 /*----------------------------------------------------------------------------*/
2 /* */
3 /* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */
4 /* Copyright (c) 2005-2009 Rexx Language Association. All rights reserved. */
5 /* */
6 /* This program and the accompanying materials are made available under */
7 /* the terms of the Common Public License v1.0 which accompanies this */
8 /* distribution. A copy is also available at the following address: */
9 /* http://www.oorexx.org/license.html */
10 /* */
11 /* Redistribution and use in source and binary forms, with or */
12 /* without modification, are permitted provided that the following */
13 /* conditions are met: */
14 /* */
15 /* Redistributions of source code must retain the above copyright */
16 /* notice, this list of conditions and the following disclaimer. */
17 /* Redistributions in binary form must reproduce the above copyright */
18 /* notice, this list of conditions and the following disclaimer in */
19 /* the documentation and/or other materials provided with the distribution. */
20 /* */
21 /* Neither the name of Rexx Language Association nor the names */
22 /* of its contributors may be used to endorse or promote products */
23 /* derived from this software without specific prior written permission. */
24 /* */
25 /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */
26 /* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */
27 /* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */
28 /* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */
29 /* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */
30 /* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */
31 /* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */
32 /* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */
33 /* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */
34 /* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */
35 /* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
36 /* */
37 /*----------------------------------------------------------------------------*/
38 /******************************************************************************/
39 /* REXX Kernel RexxActivity.hpp */
40 /* */
41 /* Primitive Activity Class Definitions */
42 /* */
43 /******************************************************************************/
44 #ifndef Included_RexxActivity
45 #define Included_RexxActivity
46 
47 #include "ListClass.hpp"
48 #include "RexxInternalStack.hpp"
49 #include "RexxActivationStack.hpp"
50 #include "ExpressionStack.hpp"
51 #include "RexxInternalStack.hpp"
52 #include "RexxLocalVariables.hpp"
53 #include "SourceLocation.hpp"
54 #include "ExitHandler.hpp"
56 #include "SysActivity.hpp"
57 
58 
59 
60 class ProtectedObject; // needed for look aheads
61 class RexxSource;
62 class RexxMethod;
64 class ActivityDispatcher;
65 class CallbackDispatcher;
66 class TrappingDispatcher;
67 class CommandHandler;
68 class ActivationFrame;
69 
70  /* interface values for the */
71  /* activity_queue method */
72 #define QUEUE_FIFO 1
73 #define QUEUE_LIFO 2
74 
75 /******************************************************************************/
76 /* Constants used for trace prefixes */
77 /******************************************************************************/
78 
96 };
97 
98 
99 // marker used for tagged traces to separate tag from the value
100 #define VALUE_MARKER " => "
101 // marker used for tagged traces to separate tag from the value
102 #define ASSIGNMENT_MARKER " <= "
103 
104 
105 #define MAX_TRACEBACK_LIST 80 /* 40 messages are displayed */
106 #define MAX_TRACEBACK_INDENT 20 /* 10 messages are indented */
107 
108 
109 typedef enum
110 {
111  RecursiveStringError, // a recursion problem in error handling
112  FatalError, // bad problem
113  UnhandledCondition // we had an unhandled condition.
115 
116 // used only internally, can be moved to a differnet value, if the using code is adapted accordingly
117 #define LAST_EXIT (RXNOOFEXITS - 1) /* top bound of the exits */
118 
119  /* NOTE: The following object */
120  /* definitions are only included in */
121  /* a module if the define */
122  /* INCL_ACTIVITY_DEFINITIONS is used */
123  /* since they include data types that*/
124  /* are not generally required (or */
125  /* available in other classes that */
126  /* might be using the activity class */
127  /* methods */
129  friend class ProtectedObject;
130  friend class ActivationFrame;
131  public:
132  void *operator new(size_t);
133  inline void *operator new(size_t size, void *ptr) {return ptr;};
134  inline void operator delete(void *) { ; }
135  inline void operator delete(void *, void *) { ; }
136 
137  inline RexxActivity(RESTORETYPE restoreType) : runsem("RexxActivity::runsem"), guardsem("RexxActivity::guardsem") { ; };
139  RexxActivity(bool);
140 
141  void reset();
142  void runThread();
145  wholenumber_t errorNumber(RexxDirectory *conditionObject);
146  wholenumber_t displayCondition(RexxDirectory *conditionObject);
153  void reportAnException(wholenumber_t, const char *);
154  void reportAnException(wholenumber_t, const char *, const char *);
155  void reportAnException(wholenumber_t, const char *, const char *, wholenumber_t);
156  void reportAnException(wholenumber_t, RexxObject *, const char *);
158  void reportAnException(wholenumber_t, const char *, RexxObject *);
159  void reportAnException(wholenumber_t, const char *, RexxObject *, RexxObject *);
160  void reportAnException(wholenumber_t, const char *, RexxObject *, RexxObject *, const char *, RexxObject *);
162  void reportAnException(wholenumber_t, const char *, RexxObject *, RexxObject *, RexxObject *);
165  void reportAnException(wholenumber_t, const char *, wholenumber_t);
178  void reportAnException(wholenumber_t, RexxObject *, RexxObject *, const char *);
182  void reportAnException(wholenumber_t, const char *, RexxObject *, const char *, RexxObject *);
189  void live(size_t);
190  void liveGeneral(int reason);
191  void flatten(RexxEnvelope *);
192  void run();
193  void run(RexxMessage *target);
194  void checkActivationStack();
195  void updateFrameMarkers();
196  void pushStackFrame(RexxActivationBase *new_activation);
198  void popStackFrame(bool reply);
200  void unwindStackFrame();
201  void unwindToDepth(size_t depth);
202  void unwindToFrame(RexxActivation *frame);
203  void cleanupStackFrame(RexxActivationBase *poppedStackFrame);
204  RexxArray *generateStackFrames(bool skipFirst);
206 
207  void exitKernel();
208  void enterKernel();
210  void waitReserve(RexxObject *);
211  void guardWait();
212  void guardPost();
213  void guardSet();
214  void checkDeadLock(RexxActivity *);
215  void postDispatch();
216  void kill(RexxDirectory *);
218  void relinquish();
219  bool halt(RexxString *);
220  bool setTrace(bool);
221  void yieldControl();
222  void yield();
223  void releaseAccess();
224  void requestAccess();
225  static wholenumber_t requestAccessCounter(); // Monitoring
226  void checkStackSpace();
228  void terminatePoolActivity();
230  bool isThread(thread_id_t id) { return currentThread.equals(id); }
231  inline bool isClauseExitUsed() { return clauseExitUsed; }
232  void queryTrcHlt();
233  bool callExit(RexxActivation * activation, const char *exitName, int function, int subfunction, void *exitbuffer);
245  bool callPushExit(RexxActivation *, RexxString *, int);
250  bool callTraceTestExit(RexxActivation *, bool);
255  void queue(RexxActivation *, RexxString *, int);
261  void setupAttachedActivity(InterpreterInstance *interpreter);
262  void addToInstance(InterpreterInstance *interpreter);
263  void detachInstance();
264  void detachThread();
266 
267  inline void nestAttach() { attachCount++; }
268  inline bool isNestedAttach() { return attachCount != 0; }
269  inline void returnAttach() { attachCount--; }
270  inline void activate() { nestedCount++; }
271  inline void deactivate() { nestedCount--; }
272  inline bool isActive() { return nestedCount > 0; }
273  inline bool isInactive() { return nestedCount == 0; }
274  inline size_t getActivationLevel() { return nestedCount; }
275  inline void restoreActivationLevel(size_t l) { nestedCount = l; }
276  inline bool isSuspended() { return suspended; }
277  inline void setSuspended(bool s) { suspended = s; }
278  inline bool isInterpreterRoot() { return interpreterRoot; }
279  inline void setInterpreterRoot() { interpreterRoot = true; }
282  inline bool isAttached() { return attached; }
283  void validateThread();
284 
287  void inheritSettings(RexxActivity *parent);
288  void setupExits();
289  void enterCurrentThread();
290  void exitCurrentThread();
291  void run(ActivityDispatcher &target);
292  void run(CallbackDispatcher &target);
293  void run(TrappingDispatcher &target);
294 
297  inline size_t getActivationDepth() { return stackFrameDepth; }
299  inline RexxObject *runningRequires(RexxString *program) {return this->requiresTable->stringGet(program);}
300  inline void addRunningRequires(RexxString *program) { this->requiresTable->stringAdd((RexxObject *)program, program);}
301  inline void removeRunningRequires(RexxObject *program) {this->requiresTable->remove(program);}
302  inline void resetRunningRequires() {this->requiresTable->reset();}
303  inline bool checkRequires(RexxString *n) { return runningRequires(n) != OREF_NULL; }
304  inline void waitForDispatch() { runsem.wait("runsem", 0); }
305  inline void clearWait() { runsem.reset(); }
306  inline uint64_t getRandomSeed() { return randomSeed; }
307  inline void setRandomSeed(uint64_t seed) { randomSeed = seed; };
310 
313 
314  inline void allocateStackFrame(RexxExpressionStack *stack, size_t entries)
315  {
316  stack->setFrame(frameStack.allocateFrame(entries), entries);
317  }
318 
319  inline RexxObject **allocateFrame(size_t entries)
320  {
321  return frameStack.allocateFrame(entries);
322  }
323 
324  inline void releaseStackFrame(RexxObject **frame)
325  {
326  frameStack.releaseFrame(frame);
327  }
328 
330  {
331  locals->setFrame(frameStack.allocateFrame(locals->size));
332  }
333 
336  void setExitHandler(int exitNum, REXXPFN e) { getExitHandler(exitNum).setEntryPoint(e); }
337  void setExitHandler(int exitNum, const char *e) { getExitHandler(exitNum).resolve(e); }
341  void createCallContext(CallContext &context, RexxNativeActivation *owner);
342  void createExitContext(ExitContext &context, RexxNativeActivation *owner);
347 
348  static void initializeThreadContext();
349 
350  protected:
351 
352  ExitHandler &getExitHandler(int exitNum) { return sysexits[exitNum - 1]; }
353  inline bool isExitEnabled(int exitNum) { return getExitHandler(exitNum).isEnabled(); }
354  inline void disableExit(int exitNum) { getExitHandler(exitNum).disable(); }
355 
356 
357  InterpreterInstance *instance; // the interpreter we're running under
358  ActivityContext threadContext; // the handed out activity context
359  RexxActivity *oldActivity; // pushed nested activity
360  RexxActivationStack frameStack; /* our stack used for activation frames */
361  RexxDirectory *conditionobj; /* condition object for killed activi*/
362  RexxTable *requiresTable; /* Current ::REQUIRES being installed*/
363  RexxMessage *dispatchMessage; // a message object to run on this thread
364 
365 
366  // the activation frame stack. This stack is one RexxActivation or
367  // RexxNativeActivation for every level of the call stack. The activationStackSize
368  // is the current size of the stack (which is expanded, if necessary). The
369  // activationStackDepth is the current count of frames in the stack.
373 
374  // the following two fields represent the current top of the activation stack
375  // and the top Rexx frame in the stack. Generally, if executing Rexx code,
376  // then currentRexxFrame == topStackFrame. If we're at the base of the stack
377  // topStackFrame will be the root stack element (a RexxNativeActivation instance)
378  // and the currentRexxFrame will be OREF_NULL. If we've made a callout from a
379  // Rexx context, then the topStackFrame will be the RexxNativeActivation that
380  // made the callout and the currentRexxFrame will be the predecessor frame.
383  RexxString *currentExit; /* current executing system exit */
384  RexxObject *waitingObject; /* object activity is waiting on */
385  SysSemaphore runsem; /* activity run control semaphore */
386  SysSemaphore guardsem; /* guard expression semaphore */
387  SysActivity currentThread; /* descriptor for this thread */
388  RexxDirectory *threadLocalEnvironment; // the directory of thread's local variables
389  NumericSettings *numericSettings; /* current activation setting values */
390 
391  bool stackcheck; /* stack space is to be checked */
392  bool exit; /* activity loop is to exit */
393  bool requestingString; /* in error handling currently */
394  bool suspended; // the suspension flag
395  bool interpreterRoot; // This is the root activity for an interpreter instance
396  bool attached; // this is attached to an instance (vs. created directly)
397  size_t nestedCount; /* extent of the nesting */
398  size_t attachCount; // extent of nested attaches
399  char *stackBase; /* pointer to base of C stack */
400  bool clauseExitUsed; /* halt/trace sys exit not set ==> 1 */
401  uint64_t randomSeed; /* random number seed */
402  ExitHandler sysexits[LAST_EXIT]; /* Array to hold system exits */
403  ProtectedObject *protectedObjects; // list of stack-based object protectors
404  ActivationFrame *activationFrames; // list of stack-based object protectors
405  RexxActivity *nestedActivity; // used to push down activities in threads with more than one instance
406 
407  // structures containing the various interface vectors
412  };
413 
414 
415 /**
416  * Convert an API context to into the top native activation
417  * context associated with the thread.
418  *
419  * @param c The source API context.
420  *
421  * @return A Native activation context that is the anchor point for the
422  * API activity.
423  */
425 {
426  return contextToActivity(c)->getApiContext();
427 }
428 
429 
430 /**
431  * Convert an API context to into the top native activation
432  * context associated with the thread.
433  *
434  * @param c The source API context.
435  *
436  * @return A Native activation context that is the anchor point for the
437  * API activity.
438  */
440 {
441  return ((CallContext *)c)->context;
442 }
443 
444 
445 /**
446  * Convert an API context to into the top native activation
447  * context associated with the thread.
448  *
449  * @param c The source API context.
450  *
451  * @return A Native activation context that is the anchor point for the
452  * API activity.
453  */
455 {
456  return ((ExitContext *)c)->context;
457 }
458 
459 
460 /**
461  * Convert an API context to into the top native activation
462  * context associated with the thread.
463  *
464  * @param c The source API context.
465  *
466  * @return A Native activation context that is the anchor point for the
467  * API activity.
468  */
470 {
471  return ((MethodContext *)c)->context;
472 }
473 
474 #endif
RexxActivity * contextToActivity(RexxThreadContext *c)
RESTORETYPE
Definition: ObjectClass.hpp:80
TracePrefixes
@ TRACE_PREFIX_CLAUSE
@ TRACE_PREFIX_NAMED_ARGUMENT
@ TRACE_PREFIX_ERROR
@ TRACE_PREFIX_LITERAL
@ TRACE_PREFIX_PREFIX
@ TRACE_PREFIX_OPERATOR
@ TRACE_PREFIX_COMPOUND
@ TRACE_PREFIX_DUMMY
@ TRACE_PREFIX_INVOCATION
@ TRACE_PREFIX_RESULT
@ TRACE_PREFIX_DOTVARIABLE
@ TRACE_PREFIX_ASSIGNMENT
@ TRACE_PREFIX_FUNCTION
@ TRACE_PREFIX_MESSAGE
@ TRACE_PREFIX_VARIABLE
@ TRACE_PREFIX_ARGUMENT
ActivityException
@ FatalError
@ RecursiveStringError
@ UnhandledCondition
#define LAST_EXIT
RexxNativeActivation * contextToActivation(RexxThreadContext *c)
#define OREF_NULL
Definition: RexxCore.h:60
void resolve(const char *name)
Definition: ExitHandler.cpp:86
void setEntryPoint(REXXPFN e)
Definition: ExitHandler.hpp:56
bool isEnabled()
Definition: ExitHandler.hpp:57
void disable()
Definition: ExitHandler.hpp:62
RexxObject ** allocateFrame(size_t entries)
void releaseFrame(RexxObject **frame)
void addRunningRequires(RexxString *program)
size_t getActivationLevel()
bool callTraceTestExit(RexxActivation *, bool)
RexxActivity * nestedActivity
CommandHandler * resolveCommandHandler(RexxString *)
uint64_t getRandomSeed()
void queue(RexxActivation *, RexxString *, int)
void pushStackFrame(RexxActivationBase *new_activation)
void releaseStackFrame(RexxObject **frame)
void requestAccess()
void setupAttachedActivity(InterpreterInstance *interpreter)
static void initializeThreadContext()
void restoreActivationLevel(size_t l)
bool callScriptingExit(RexxActivation *, RexxString *, RexxObject *, ProtectedObject &, RexxObject **, size_t)
RexxDirectory * getThreadLocal()
void reportAnException(wholenumber_t, const char *)
RexxNativeActivation * getApiContext()
wholenumber_t error()
static MethodContextInterface methodContextFunctions
void callTerminationExit(RexxActivation *)
RexxActivation * currentRexxFrame
void kill(RexxDirectory *)
static wholenumber_t requestAccessCounter()
thread_id_t threadIdMethod()
RexxActivity * oldActivity
void enterCurrentThread()
bool halt(RexxString *)
void setExitHandler(RXSYSEXIT &e)
bool isNestedAttach()
bool callHaltTestExit(RexxActivation *)
bool callQueueNameExit(RexxActivation *, RexxString *&)
void setExitHandler(int exitNum, REXXPFN e)
RexxActivationStack frameStack
void generateProgramInformation(RexxDirectory *exObj)
ExitHandler sysexits[LAST_EXIT]
SecurityManager * getEffectiveSecurityManager()
RexxObject * displayDebug(RexxDirectory *)
RexxString * pullInput(RexxActivation *)
bool callObjectFunctionExit(RexxActivation *, RexxString *, RexxObject *, ProtectedObject &, RexxObject **, size_t, size_t)
bool isThread(thread_id_t id)
void yieldControl()
void inheritSettings(RexxActivity *parent)
bool callNovalueExit(RexxActivation *, RexxString *, RexxObject *&)
void traceOutput(RexxActivation *, RexxString *)
void setInterpreterRoot()
void callInitializationExit(RexxActivation *)
static ExitContextInterface exitContextFunctions
RexxObject * getLocalEnvironment(RexxString *name)
void returnAttach()
void createMethodContext(MethodContext &context, RexxNativeActivation *owner)
bool callFunctionExit(RexxActivation *, RexxString *, RexxObject *, ProtectedObject &, RexxObject **, size_t)
RexxString * messageSubstitution(RexxString *, RexxArray *)
void raiseException(wholenumber_t, RexxString *, RexxArray *, RexxObject *)
void terminatePoolActivity()
RexxString * getLastMessageName()
size_t activationStackSize
void setExitHandler(int exitNum, const char *e)
RexxInternalStack * activations
ActivationFrame * activationFrames
NumericSettings * getNumericSettings()
RexxActivationBase * topStackFrame
void disableExit(int exitNum)
RexxActivity(RESTORETYPE restoreType)
void setNestedActivity(RexxActivity *a)
void validateThread()
void allocateLocalVariableFrame(RexxLocalVariables *locals)
SysSemaphore guardsem
void popStackFrame(bool reply)
SysActivity currentThread
void cleanupActivityResources()
RexxActivity * spawnReply()
size_t attachCount
void liveGeneral(int reason)
void checkStackSpace()
RexxDirectory * threadLocalEnvironment
bool callTraceExit(RexxActivation *, RexxString *)
bool isSuspended()
void unwindToDepth(size_t depth)
void removeRunningRequires(RexxObject *program)
InterpreterInstance * instance
RexxString * buildMessage(wholenumber_t, RexxArray *)
RexxActivity * getNestedActivity()
void allocateStackFrame(RexxExpressionStack *stack, size_t entries)
NumericSettings * numericSettings
void addToInstance(InterpreterInstance *interpreter)
void reraiseException(RexxDirectory *)
bool isExitEnabled(int exitNum)
bool checkRequires(RexxString *n)
wholenumber_t displayCondition(RexxDirectory *conditionObject)
size_t getActivationDepth()
RexxString * lineIn(RexxActivation *)
void updateFrameMarkers()
size_t nestedCount
void unwindToFrame(RexxActivation *frame)
void releaseAccess()
RexxDirectory * conditionobj
void createNewActivationStack()
void detachInstance()
bool callPullExit(RexxActivation *, RexxString *&)
void setRandomSeed(uint64_t seed)
void createCallContext(CallContext &context, RexxNativeActivation *owner)
void resetRunningRequires()
void runThread()
void createExitContext(ExitContext &context, RexxNativeActivation *owner)
InterpreterInstance * getInstance()
SecurityManager * getInstanceSecurityManager()
wholenumber_t errorNumber(RexxDirectory *conditionObject)
RexxMessage * dispatchMessage
SysSemaphore runsem
void waitForDispatch()
void checkActivationStack()
void clearCurrentCondition()
void raisePropagate(RexxDirectory *)
bool callPushExit(RexxActivation *, RexxString *, int)
RexxDirectory * createConditionObject(RexxString *, RexxObject *, RexxString *, RexxObject *, RexxObject *)
RexxMethod * getLastMethod()
static CallContextInterface callContextFunctions
bool callHaltClearExit(RexxActivation *)
static RexxThreadInterface threadContextFunctions
void exitCurrentThread()
RexxTable * requiresTable
bool callExit(RexxActivation *activation, const char *exitName, int function, int subfunction, void *exitbuffer)
void live(size_t)
RexxString * resolveProgramName(RexxString *, RexxString *, RexxString *)
void generateRandomNumberSeed()
RexxActivationBase * getTopStackFrame()
void joinKernelQueue()
RexxString * currentExit
void sayOutput(RexxActivation *, RexxString *)
RexxObject ** allocateFrame(size_t entries)
bool callQueueSizeExit(RexxActivation *, RexxInteger *&)
RexxObject * previous()
bool callCommandExit(RexxActivation *, RexxString *, RexxString *, ProtectedObject &result, ProtectedObject &condition)
RexxDirectory * getLocal()
ActivityContext threadContext
RexxArray * generateStackFrames(bool skipFirst)
bool callValueExit(RexxActivation *, RexxString *, RexxString *, RexxObject *, RexxObject *&)
RexxObject * display(RexxDirectory *)
void flatten(RexxEnvelope *)
bool isInterpreterRoot()
void checkDeadLock(RexxActivity *)
RexxDirectory * createExceptionObject(wholenumber_t, RexxString *, RexxArray *, RexxObject *)
void setSuspended(bool s)
RexxObject * waitingObject
ProtectedObject * protectedObjects
ExitHandler & getExitHandler(int exitNum)
bool callSayExit(RexxActivation *, RexxString *)
RexxObject * runningRequires(RexxString *program)
RexxObject * lineOut(RexxString *)
RexxThreadContext * getThreadContext()
void unwindStackFrame()
RexxDirectory * getCurrentCondition()
void cleanupStackFrame(RexxActivationBase *poppedStackFrame)
bool callTerminalInputExit(RexxActivation *, RexxString *&)
void waitReserve(RexxObject *)
size_t stackFrameDepth
bool isClauseExitUsed()
uint64_t randomSeed
bool setTrace(bool)
bool raiseCondition(RexxString *, RexxObject *, RexxString *, RexxObject *, RexxObject *)
bool callDebugInputExit(RexxActivation *, RexxString *&)
RexxActivation * getCurrentRexxFrame()
RexxString * traceInput(RexxActivation *)
void setFrame(RexxObject **frames, size_t items)
virtual RexxObject * remove(RexxObject *key)
void setFrame(RexxObject **frame)
RexxObject * stringAdd(RexxObject *, RexxString *)
Definition: TableClass.cpp:94
void reset()
Definition: TableClass.cpp:156
RexxObject * stringGet(RexxString *key)
Definition: TableClass.hpp:67
bool equals(thread_id_t t)
void wait(const char *ds, int di)
ssize_t wholenumber_t
Definition: rexx.h:230
CONSTANT_STRING sysexit_name
Definition: rexx.h:191
int sysexit_code
Definition: rexx.h:192
RexxThreadContext threadContext
void * REXXPFN
pthread_t thread_id_t
unsigned __int64 uint64_t