3
* Copyright (c) 2002-2011 by XMLVM.org
5
* Project Info: http://www.xmlvm.org
7
* This program is free software; you can redistribute it and/or modify it
8
* under the terms of the GNU Lesser General Public License as published by
9
* the Free Software Foundation; either version 2.1 of the License, or
10
* (at your option) any later version.
12
* This library is distributed in the hope that it will be useful, but
13
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15
* License for more details.
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with this library; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
27
const char* errorMessage (I_32 errorCode)
29
PortlibPTBuffers_t ptBuffers;
31
ptBuffers = hyport_tls_peek ();
32
if (0 == ptBuffers->errorMessageBufferSize)
34
ptBuffers->errorMessageBuffer = XMLVM_ATOMIC_MALLOC(HYERROR_DEFAULT_BUFFER_SIZE);
35
if (NULL == ptBuffers->errorMessageBuffer)
39
ptBuffers->errorMessageBufferSize = HYERROR_DEFAULT_BUFFER_SIZE;
42
/* Copy from OS to ptBuffers */
45
ptBuffers->errorMessageBuffer, ptBuffers->errorMessageBufferSize);
47
/* Do not have strerror_r on z/OS so use port library function instead */
48
portLibrary->str_printf(portLibrary, ptBuffers->errorMessageBuffer, ptBuffers->errorMessageBufferSize, strerror(errorCode));
50
ptBuffers->errorMessageBuffer[ptBuffers->errorMessageBufferSize - 1] = '\0';
51
return ptBuffers->errorMessageBuffer;
55
static const char* swapMessageBuffer (PortlibPTBuffers_t ptBuffers, const char *message)
57
char *tempBuffer = ptBuffers->reportedMessageBuffer;
58
U_32 tempBufferSize = ptBuffers->reportedMessageBufferSize;
65
/* Can't swap unknown message buffer */
66
if (message != ptBuffers->errorMessageBuffer)
71
/* Save reported information */
72
ptBuffers->reportedErrorCode = ptBuffers->portableErrorCode;
73
ptBuffers->reportedMessageBuffer = ptBuffers->errorMessageBuffer;
74
ptBuffers->reportedMessageBufferSize = ptBuffers->errorMessageBufferSize;
76
if (tempBufferSize > 0)
81
/* Clear pending fields ready for next error */
82
ptBuffers->portableErrorCode = 0;
83
ptBuffers->errorMessageBuffer = tempBuffer;
84
ptBuffers->errorMessageBufferSize = tempBufferSize;
86
return ptBuffers->reportedMessageBuffer;
90
void* hyport_tls_get ()
92
java_lang_Thread* curThread = (java_lang_Thread*) java_lang_Thread_currentThread__();
93
if (curThread->fields.java_lang_Thread.ptBuffers_ == JAVA_NULL) {
94
curThread->fields.java_lang_Thread.ptBuffers_ = XMLVM_MALLOC(sizeof(PortlibPTBuffers_struct));
95
XMLVM_BZERO(curThread->fields.java_lang_Thread.ptBuffers_, sizeof(PortlibPTBuffers_struct));
98
return curThread->fields.java_lang_Thread.ptBuffers_;
102
void* hyport_tls_peek ()
104
java_lang_Thread* curThread = (java_lang_Thread*) java_lang_Thread_currentThread__();
105
return curThread->fields.java_lang_Thread.ptBuffers_;
109
const char* hyerror_last_error_message ()
111
PortlibPTBuffers_t ptBuffers;
113
/* Was an error saved ? */
114
ptBuffers = hyport_tls_peek ();
115
if (NULL == ptBuffers)
121
if (ptBuffers->portableErrorCode != 0)
123
const char *message = NULL;
125
/* Customized message stored ? */
126
if (ptBuffers->errorMessageBufferSize > 0)
128
if ('\0' != ptBuffers->errorMessageBuffer[0])
130
message = ptBuffers->errorMessageBuffer;
134
/* Call a helper to get the last message from the OS. */
137
message = errorMessage (ptBuffers->platformErrorCode);
140
/* Avoid overwrite by internal portlib errors */
141
return swapMessageBuffer (ptBuffers, message);
144
/* Previous message stored ? */
145
if (ptBuffers->reportedMessageBufferSize > 0)
147
if ('\0' != ptBuffers->reportedMessageBuffer[0])
149
return ptBuffers->reportedMessageBuffer;
158
I_32 hyerror_last_error_number ()
160
PortlibPTBuffers_t ptBuffers;
162
/* get the buffers, return failure if not present */
163
ptBuffers = hyport_tls_peek ();
164
if (NULL == ptBuffers)
170
if (ptBuffers->portableErrorCode != 0)
172
return ptBuffers->portableErrorCode;
176
return ptBuffers->reportedErrorCode;
181
I_32 hyerror_set_last_error (I_32 platformCode, I_32 portableCode)
183
PortlibPTBuffers_t ptBuffers;
185
/* get the buffers, allocate if necessary.
186
* Silently return if not present, what else would the caller do anyway?
188
ptBuffers = hyport_tls_get ();
189
if (NULL == ptBuffers)
194
/* Save the last error */
195
ptBuffers->platformErrorCode = platformCode;
196
ptBuffers->portableErrorCode = portableCode;
198
/* Overwrite any customized messages stored */
199
if (ptBuffers->errorMessageBufferSize > 0)
201
ptBuffers->errorMessageBuffer[0] = '\0';
208
I_32 hyerror_set_last_error_with_message (I_32 portableCode, const char *errorMessage)
210
PortlibPTBuffers_t ptBuffers;
213
/* get the buffers, allocate if necessary.
214
* Silently return if not present, what else would the caller do anyway?
216
ptBuffers = hyport_tls_get ();
217
if (NULL == ptBuffers)
222
/* Save the last error */
223
ptBuffers->platformErrorCode = -1;
224
ptBuffers->portableErrorCode = portableCode;
226
/* Store the message, allocate a bigger buffer if required. Keep the old buffer around
227
* just in case memory can not be allocated
229
requiredSize = strlen (errorMessage) + 1;
232
HYERROR_DEFAULT_BUFFER_SIZE ? HYERROR_DEFAULT_BUFFER_SIZE : requiredSize;
233
if (requiredSize > ptBuffers->errorMessageBufferSize)
235
char *newBuffer = XMLVM_ATOMIC_MALLOC(requiredSize);
236
if (NULL != newBuffer)
238
if (ptBuffers->errorMessageBuffer != NULL)
240
XMLVM_FREE(ptBuffers->errorMessageBuffer);
242
ptBuffers->errorMessageBuffer = newBuffer;
243
ptBuffers->errorMessageBufferSize = requiredSize;
247
/* Save the message */
248
if (ptBuffers->errorMessageBufferSize > 0)
250
sprintf(ptBuffers->errorMessageBuffer, "%s", errorMessage);
251
ptBuffers->errorMessageBuffer[ptBuffers->errorMessageBufferSize - 1] = '\0';