Commit f5c03e95 authored by Robert Sprowson's avatar Robert Sprowson Committed by ROOL
Browse files

[541] Fix for returning a stale error pointer

During the rendering process (or Service_DrawObjectRender for unknown objects) the render state may be updated with an error pointer.
However, as rending proceeds and potentially many other SWIs are called also using MessageTrans' shared buffers, by the end of the rendering process the originally captured pointer may be pointing at a totally different message.
Capture the error after each object is despatched in our own buffer.

Version 1.62. Tagged as 'DrawFile-1_62'
parent c1cfb380
......@@ -24,8 +24,8 @@ else
CMHGFILE = header
endif
LIBS = ${OSLIB} ${ASMUTILS}
CINCLUDES = -IOS:
CFLAGS = -ff -fach -wp
CINCLUDES = ${OSINC} ${RINC}
CFLAGS += ${C_NOWARN_NON_ANSI_INCLUDES}
CDFLAGS = -DTRACE=1
CDEFINES = -DDRAWFILE
RAMCDEFINES = -DSTANDALONE
......
/* (1.61)
/* (1.62)
*
* This file is automatically maintained by srccommit, do not edit manually.
*
*/
#define Module_MajorVersion_CMHG 1.61
#define Module_MajorVersion_CMHG 1.62
#define Module_MinorVersion_CMHG
#define Module_Date_CMHG 06 Feb 2021
#define Module_Date_CMHG 09 Jan 2023
#define Module_MajorVersion "1.61"
#define Module_Version 161
#define Module_MajorVersion "1.62"
#define Module_Version 162
#define Module_MinorVersion ""
#define Module_Date "06 Feb 2021"
#define Module_Date "09 Jan 2023"
#define Module_ApplicationDate "06-Feb-21"
#define Module_ApplicationDate "09-Jan-23"
#define Module_ComponentName "DrawFile"
#define Module_FullVersion "1.61"
#define Module_HelpVersion "1.61 (06 Feb 2021)"
#define Module_LibraryVersionInfo "1:61"
#define Module_FullVersion "1.62"
#define Module_HelpVersion "1.62 (09 Jan 2023)"
#define Module_LibraryVersionInfo "1:62"
......@@ -310,6 +310,31 @@ finish:
return error;
}
/*------------------------------------------------------------------------*/
static os_error *render_object(drawfile_object *o, drawfile_render_state *state)
{
static os_error last_error;
osbool unclaimed = TRUE;
os_error *oerror, *error;
state->object = o; /* Beware the callback can recurse */
oerror = state->error;
error = callback(main_render_callback, state, &unclaimed, 1, o->type);
if (error == NULL && unclaimed && o->type >= 0x100)
{
error = xservice_draw_object_render(o->type, state, NULL);
}
if (state->error == NULL) /* Record only the first error */
state->error = error;
if (oerror != state->error && state->error != &last_error)
{ /* Either the callback or the service call
saw an error, copy it to a safe place. */
memcpy(&last_error, state->error, sizeof(last_error));
tracef("render_object latched error '%s' from client %p\n" _ last_error.errmess _ state->error);
state->error = &last_error;
}
return error;
}
/*------------------------------------------------------------------------*/
os_error *render(bits flags, drawfile_diagram * diagram, int size,
os_trfm * trfm, os_box * clip, int flatness)
......@@ -318,7 +343,7 @@ os_error *render(bits flags, drawfile_diagram * diagram, int size,
drawfile_object *end, *o;
drawfile_render_state state;
os_box inv_clip;
osbool can_clip, unclaimed;
osbool can_clip;
int version;
tracef("render\n");
......@@ -357,17 +382,8 @@ os_error *render(bits flags, drawfile_diagram * diagram, int size,
end = (drawfile_object *) & ((byte *) diagram)[size];
for (o = diagram->objects; o < end; *(byte **) & o += o->size)
{
state.object = o;
if ((error = callback(main_render_callback, &state, &unclaimed, 1,
o->type)) != NULL)
if ((error = render_object(o, &state)) != NULL)
goto finish;
if (unclaimed && o->type >= 0x100)
{
if ((error = xservice_draw_object_render(o->type, &state, NULL)) !=
NULL)
goto finish;
}
}
finish:
......@@ -799,7 +815,6 @@ os_error *render_group(void *null, void *s, osbool * unclaimed)
typing */ ;
drawfile_group *group = &state->object->data AS group;
drawfile_object *o, *end;
osbool u;
tracef("render_group\n");
#ifdef TEST
......@@ -819,17 +834,8 @@ os_error *render_group(void *null, void *s, osbool * unclaimed)
for (o = (drawfile_object *) & group->objects; o < end;
*(byte **) & o += o->size)
{
state->object = o;
if ((error = callback(main_render_callback, state, &u, 1,
o->type)) != NULL)
if ((error = render_object(o, state)) != NULL)
goto finish;
if (u && o->type >= 0x100)
{
if ((error = xservice_draw_object_render(o->type, state, NULL))
!= NULL)
goto finish;
}
}
}
......@@ -851,7 +857,6 @@ os_error *render_tagged(void *null, void *s, osbool * unclaimed)
typing */ ;
drawfile_tagged *tagged = &state->object->data AS tagged;
drawfile_object *o, *end;
osbool u;
tracef("render_tagged\n");
#ifdef TEST
......@@ -870,18 +875,9 @@ os_error *render_tagged(void *null, void *s, osbool * unclaimed)
goto finish;
}
state->object = o;
if ((error = callback(main_render_callback, state, &u, 1, o->type)) !=
NULL)
if ((error = render_object(o, state)) != NULL)
goto finish;
if (u && o->type >= 0x100)
{
if ((error = xservice_draw_object_render(o->type, state, NULL)) !=
NULL)
goto finish;
}
*unclaimed = FALSE;
finish:
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment