forked from eclipse-omr/omr
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathOMR_Agent.hpp
150 lines (127 loc) · 4.02 KB
/
OMR_Agent.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/*******************************************************************************
* Copyright IBM Corp. and others 2014
*
* This program and the accompanying materials are made available under
* the terms of the Eclipse Public License 2.0 which accompanies this
* distribution and is available at https://www.eclipse.org/legal/epl-2.0/
* or the Apache License, Version 2.0 which accompanies this distribution and
* is available at https://www.apache.org/licenses/LICENSE-2.0.
*
* This Source Code may also be made available under the following
* Secondary Licenses when the conditions for such availability set
* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
* General Public License, version 2 with the GNU Classpath
* Exception [1] and GNU General Public License, version 2 with the
* OpenJDK Assembly Exception [2].
*
* [1] https://www.gnu.org/software/classpath/license.html
* [2] https://openjdk.org/legal/assembly-exception.html
*
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 OR GPL-2.0-only WITH OpenJDK-assembly-exception-1.0
*******************************************************************************/
#if !defined(OMR_AGENT_HPP_INCLUDED)
#define OMR_AGENT_HPP_INCLUDED
/*
* @ddr_namespace: default
*/
#include "omr.h"
#include "omragent.h"
struct OMR_Agent
{
/*
* Data members
*/
public:
static OMR_TI const theOmrTI;
/* The following private data has been made public so that this header file can be processed for DDR */
typedef omr_error_t (*onloadfunc_t)(OMR_TI const *ti, OMR_VM *vm, char const *options, OMR_AgentCallbacks *agentCallbacks, ...);
typedef omr_error_t (*onunloadfunc_t)(OMR_TI const *ti, OMR_VM *vm);
enum State {
UNINITIALIZED,
INITIALIZED,
LIBRARY_OPENED,
ONLOAD_COMPLETED,
OPEN_LIBRARY_ERROR,
LOOKUP_ONLOAD_ERROR,
LOOKUP_ONUNLOAD_ERROR,
ONLOAD_ERROR,
ONUNLOAD_SUCCESS
};
uintptr_t _handle;
OMR_VM *_vm;
onloadfunc_t _onload;
onunloadfunc_t _onunload;
char const *_dllpath;
char const *_options;
State _state;
OMR_AgentCallbacks _agentCallbacks;
protected:
private:
/*
* Function members
*/
public:
/**
* Create an OMR agent.
*
* @param[in] vm The OMR VM.
* @param[in] arg An argument of the form "<agent-path>[=<options>]".
* arg can be freed after this function is called.
*
* @return An OMR agent. NULL on failure.
*/
static OMR_Agent *createAgent(OMR_VM *vm, char const *arg);
/**
* Destroy an OMR agent.
*
* @param[in] agent The OMR agent.
*/
static void destroyAgent(OMR_Agent *agent);
/**
* Load the agent library, and lookup the OnLoad and OnUnload functions.
* @return OMR_ERROR_NONE if the load and lookups succeeded,
* OMR_ERROR_ILLEGAL_ARGUMENT otherwise.
*/
omr_error_t openLibrary(void);
/**
* Invoke the agent's OnLoad function.
* @return the return value from the OnLoad function,
* OMR_ERROR_ILLEGAL_ARGUMENT if the agent is in an invalid state for invoking OnLoad.
*/
omr_error_t callOnLoad(void);
/**
* Invoke the agent's OnUnload function.
* @return the return value from the agent's OnUnload function
*/
omr_error_t callOnUnload(void);
/**
* Invoke the agent's OnPreFork function.
* @return the return value from the agent's OnPreFork function
*/
omr_error_t callOnPreFork(void);
/**
* Invoke the agent's OnPostForkParent function.
* @return the return value from the agent's OnPostForkParent function
*/
omr_error_t callOnPostForkParent(void);
/**
* Invoke the agent's OnPostForkChild function.
* @return the return value from the agent's OnPostForkChild function
*/
omr_error_t callOnPostForkChild(void);
protected:
private:
OMR_Agent(OMR_VM *vm, char const *arg);
void *operator new(size_t size, void *memoryPtr)
{
return memoryPtr;
}
void operator delete(void *agent, void *memoryPtr)
{
destroyAgent(static_cast<OMR_Agent *>(agent));
}
static omr_error_t onPreForkDefault(void);
static omr_error_t onPostForkParentDefault(void);
static omr_error_t onPostForkChildDefault(void);
};
#endif /* OMR_AGENT_HPP_INCLUDED */