ExitHandler.cpp
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.ibm.com/developerworks/oss/CPLv1.0.htm */
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
40
#include "
RexxCore.h
"
41
#include "
ExitHandler.hpp
"
42
#include "
RexxActivity.hpp
"
43
#include "
ActivityManager.hpp
"
44
#include "
RexxInternalApis.h
"
45
46
47
/**
48
* Call an exit
49
*
50
* @param activity The current activity.
51
* @param activation The top-most activation.
52
* @param function The exit major function code.
53
* @param subfunction
54
* The exit minor function code.
55
* @param parms The parameter block passed to the exit.
56
*
57
* @return The exit handler return code.
58
*/
59
int
ExitHandler::call
(
RexxActivity
*activity,
RexxActivation
*activation,
int
function
,
int
subfunction,
void
*parms)
60
{
61
if
(
type
==
REGISTERED_NAME
)
62
{
63
ExitHandlerDispatcher
dispatcher(
entryPoint
,
function
, subfunction, parms);
64
65
// run this and give back the return code
66
activity->
run
(dispatcher);
67
return
dispatcher.
rc
;
68
}
69
else
70
{
71
ContextExitHandlerDispatcher
dispatcher(
entryPoint
,
function
, subfunction, parms);
72
73
// run this and give back the return code
74
activity->
run
(dispatcher);
75
return
dispatcher.
rc
;
76
}
77
}
78
79
80
/**
81
* Resolve a classic-style exit handler to the actual target
82
* entry point address and invocation style.
83
*
84
* @param name The registered exit name.
85
*/
86
void
ExitHandler::resolve
(
const
char
*name)
87
{
88
RexxResolveExit
(name, &
entryPoint
);
89
type
=
REGISTERED_NAME
;
90
}
91
92
93
/**
94
* Resolve a classic-style exit handler to the actual target
95
* entry point address and invocation style.
96
*
97
* @param name The registered exit name.
98
*/
99
void
ExitHandler::resolve
(
RexxContextExitHandler
*handler)
100
{
101
entryPoint
= (
REXXPFN
)handler;
102
type
=
DIRECT
;
103
}
104
105
106
107
/**
108
* Process a callout to a system exit function.
109
*/
110
void
ExitHandlerDispatcher::run
()
111
{
112
RexxExitHandler
*exit_address = (
RexxExitHandler
*)
entryPoint
;
113
rc
= (int)(*exit_address)(
major
,
minor
, (
PEXIT
)
parms
);
114
}
115
116
117
118
/**
119
* Process a callout to a system exit function.
120
*/
121
void
ContextExitHandlerDispatcher::run
()
122
{
123
RexxContextExitHandler
*exit_address = (
RexxContextExitHandler
*)
entryPoint
;
124
125
ExitContext
context;
126
127
// build a context pointer to pass out
128
activity
->
createExitContext
(context,
activation
);
129
130
rc
= (int)(*exit_address)(&context.
threadContext
,
major
,
minor
, (
PEXIT
)
parms
);
131
}
ActivityManager.hpp
ExitHandler.hpp
RexxActivity.hpp
RexxCore.h
RexxInternalApis.h
RexxResolveExit
int REXXENTRY RexxResolveExit(const char *, REXXPFN *)
Definition:
RegistrationAPI.cpp:405
CallbackDispatcher::activity
RexxActivity * activity
Definition:
CallbackDispatcher.hpp:62
CallbackDispatcher::activation
RexxNativeActivation * activation
Definition:
CallbackDispatcher.hpp:63
ContextExitHandlerDispatcher
Definition:
ExitHandler.hpp:109
ContextExitHandlerDispatcher::run
virtual void run()
Definition:
ExitHandler.cpp:121
ExitHandlerDispatcher
Definition:
ExitHandler.hpp:93
ExitHandlerDispatcher::entryPoint
REXXPFN entryPoint
Definition:
ExitHandler.hpp:103
ExitHandlerDispatcher::minor
int minor
Definition:
ExitHandler.hpp:102
ExitHandlerDispatcher::run
virtual void run()
Definition:
ExitHandler.cpp:110
ExitHandlerDispatcher::parms
void * parms
Definition:
ExitHandler.hpp:104
ExitHandlerDispatcher::rc
int rc
Definition:
ExitHandler.hpp:100
ExitHandlerDispatcher::major
int major
Definition:
ExitHandler.hpp:101
ExitHandler::resolve
void resolve(const char *name)
Definition:
ExitHandler.cpp:86
ExitHandler::DIRECT
@ DIRECT
Definition:
ExitHandler.hpp:83
ExitHandler::REGISTERED_NAME
@ REGISTERED_NAME
Definition:
ExitHandler.hpp:82
ExitHandler::call
int call(RexxActivity *activity, RexxActivation *activation, int major, int minor, void *parms)
Definition:
ExitHandler.cpp:59
ExitHandler::type
ExitType type
Definition:
ExitHandler.hpp:88
ExitHandler::entryPoint
REXXPFN entryPoint
Definition:
ExitHandler.hpp:87
RexxActivation
Definition:
RexxActivation.hpp:164
RexxActivity
Definition:
RexxActivity.hpp:128
RexxActivity::run
void run()
Definition:
RexxActivity.cpp:1708
RexxActivity::createExitContext
void createExitContext(ExitContext &context, RexxNativeActivation *owner)
Definition:
RexxActivity.cpp:3535
RexxContextExitHandler
int REXXENTRY RexxContextExitHandler(RexxExitContext *, int, int, PEXIT)
Definition:
oorexxapi.h:165
PEXIT
char * PEXIT
Definition:
rexx.h:215
RexxExitHandler
int REXXENTRY RexxExitHandler(int, int, PEXIT)
Definition:
rexx.h:630
ExitContext
Definition:
ActivationApiContexts.hpp:85
ExitContext::threadContext
RexxExitContext threadContext
Definition:
ActivationApiContexts.hpp:86
REXXPFN
void * REXXPFN
Definition:
unix/rexxapitypes.h:64
oorexx
executor
sandbox
jlf
trunk
interpreter
concurrency
ExitHandler.cpp
Generated by
1.9.2