[teklib-general] changeset in /hg/teklib/current: Introduced vis_InitRequest in m...
Timm S. Mueller
tmueller at neoscientists.org
Mon Nov 26 16:23:57 CET 2007
changeset 3f892f932fb4 in /hg/teklib/current
details: http://teklib.org:8001/hg/teklib/current?cmd=changeset;node=3f892f932fb4
description:
Introduced vis_InitRequest in modbase for reliable operations without an
instance; added interval messages; enabled asynchronous message processing;
added explicit pen management in display_x11; some cleanup
diffs (truncated from 603 to 300 lines):
diff -r 4e563043c985 -r 3f892f932fb4 src/visual/visual_api.c
--- a/src/visual/visual_api.c Mon Sep 24 23:17:06 2007 +0200
+++ b/src/visual/visual_api.c Tue Sep 25 02:47:00 2007 +0200
@@ -60,7 +60,19 @@ visi_getreq(TMOD_VIS *inst, TUINT cmd, T
{
if (inst->vis_Module.tmd_ModSuper == (struct TModule *) inst)
{
- req = TDisplayAllocReq(d);
+ TExecLock(inst->vis_ExecBase, inst->vis_Lock);
+ if (inst->vis_InitRequest)
+ {
+ req = inst->vis_InitRequest;
+ inst->vis_InitRequest = TNULL;
+ /* when using initreq, base is in LOCKED state */
+ }
+ else
+ {
+ TExecUnlock(inst->vis_ExecBase, inst->vis_Lock);
+ req = TDisplayAllocReq(d);
+ }
+
if (req)
{
req->tvr_Req.io_Command = cmd;
@@ -69,9 +81,34 @@ visi_getreq(TMOD_VIS *inst, TUINT cmd, T
}
else
{
+ /* try to unlink from free requests pool: */
req = (struct TVRequest *) TRemHead(&inst->vis_ReqPool);
+
if (req == TNULL)
+ {
+ /* peek into list of waiting requests: */
+ req = (struct TVRequest *) TFIRSTNODE(&inst->vis_WaitList);
+ if (req)
+ {
+ if (inst->vis_NumRequests >= VISUAL_MAXREQPERINSTANCE)
+ {
+ /* wait and unlink from waitlist: */
+ TExecWaitIO(inst->vis_ExecBase, &req->tvr_Req);
+ TRemove(&req->tvr_Req.io_Node);
+ }
+ else
+ /* allocate new one: */
+ req = TNULL;
+ }
+ }
+
+ if (req == TNULL)
+ {
req = TDisplayAllocReq(d);
+ if (req)
+ inst->vis_NumRequests++;
+ }
+
if (req)
{
req->tvr_Req.io_Command = cmd;
@@ -86,9 +123,34 @@ visi_ungetreq(TMOD_VIS *inst, struct TVR
visi_ungetreq(TMOD_VIS *inst, struct TVRequest *req)
{
if (inst->vis_Module.tmd_ModSuper == (struct TModule *) inst)
- TDisplayFreeReq(req->tvr_Req.io_Device, req);
+ {
+ TExecLock(inst->vis_ExecBase, inst->vis_Lock);
+ if (inst->vis_InitRequest == TNULL)
+ {
+ inst->vis_InitRequest = req;
+ /* after returning initreq, base gets UNLOCKED: */
+ TExecUnlock(inst->vis_ExecBase, inst->vis_Lock);
+ }
+ else
+ TDisplayFreeReq(req->tvr_Req.io_Device, req);
+ TExecUnlock(inst->vis_ExecBase, inst->vis_Lock);
+ }
else
TAddTail(&inst->vis_ReqPool, &req->tvr_Req.io_Node);
+}
+
+static void
+visi_dosync(TMOD_VIS *inst, struct TVRequest *req)
+{
+ TExecDoIO(inst->vis_ExecBase, &req->tvr_Req);
+ visi_ungetreq(inst, req);
+}
+
+static void
+visi_doasync(TMOD_VIS *inst, struct TVRequest *req)
+{
+ TExecPutIO(inst->vis_ExecBase, &req->tvr_Req);
+ TAddTail(&inst->vis_WaitList, &req->tvr_Req.io_Node);
}
/*****************************************************************************/
@@ -110,28 +172,26 @@ EXPORT TAPTR vis_openvisual(TMOD_VIS *mo
visi_getreq(inst, TVCMD_OPENVISUAL, TNULL, TNULL);
if (req)
{
- inst->vis_Display = req->tvr_Req.io_Device;
-
req->tvr_Op.OpenVisual.Instance = TNULL;
req->tvr_Op.OpenVisual.IMsgPort = inst->vis_IMsgPort;
req->tvr_Op.OpenVisual.Tags = tags;
-
TExecDoIO(inst->vis_ExecBase, &req->tvr_Req);
-
- visi_ungetreq(inst, req);
inst->vis_Visual = req->tvr_Op.OpenVisual.Instance;
if (inst->vis_Visual)
{
+ inst->vis_InitRequest = req;
+ inst->vis_Display = req->tvr_Req.io_Device;
+
vis_setinput(inst, TITYPE_NONE, TITYPE_CLOSE);
return inst;
}
- TDBPRINTF(20,("open failed\n"));
+ TDisplayFreeReq(inst->vis_Display, req);
}
TExecCloseModule(mod->vis_ExecBase, inst);
}
-
+ TDBPRINTF(20,("open failed\n"));
return TNULL;
}
@@ -143,8 +203,8 @@ EXPORT void vis_closevisual(TMOD_VIS *mo
inst->vis_Display, TNULL);
req->tvr_Req.io_Command = TVCMD_CLOSEVISUAL;
req->tvr_Op.CloseVisual.Instance = inst->vis_Visual;
- TExecDoIO(inst->vis_ExecBase, &req->tvr_Req);
- visi_ungetreq(inst, req);
+ visi_dosync(inst, req);
+ TDisplayFreeReq(inst->vis_Display, inst->vis_InitRequest);
TExecCloseModule(mod->vis_ExecBase, inst);
}
@@ -166,7 +226,6 @@ EXPORT TAPTR vis_openfont(TMOD_VIS *mod,
{
TAPTR font;
struct TVRequest *req = visi_getreq(mod, TVCMD_OPENFONT, TNULL, tags);
- if (req == TNULL) return TNULL;
req->tvr_Op.OpenFont.Tags = tags;
TExecDoIO(mod->vis_ExecBase, &req->tvr_Req);
font = req->tvr_Op.OpenFont.Font;
@@ -180,10 +239,8 @@ EXPORT void vis_closefont(TMOD_VIS *mod,
{
struct TVRequest *req = visi_getreq(mod, TVCMD_CLOSEFONT,
TGetOwner(font), TNULL);
- if (req == TNULL) return;
req->tvr_Op.CloseFont.Font = font;
- TExecDoIO(mod->vis_ExecBase, &req->tvr_Req);
- visi_ungetreq(mod, req);
+ visi_dosync(mod, req);
}
/*****************************************************************************/
@@ -193,7 +250,6 @@ EXPORT TUINT vis_getfattrs(TMOD_VIS *mod
TUINT n;
struct TVRequest *req = visi_getreq(mod, TVCMD_GETFONTATTRS,
TGetOwner(font), TNULL);
- if (req == TNULL) return 0;
req->tvr_Op.GetFontAttrs.Font = font;
req->tvr_Op.GetFontAttrs.Tags = tags;
TExecDoIO(mod->vis_ExecBase, &req->tvr_Req);
@@ -206,16 +262,15 @@ EXPORT TUINT vis_getfattrs(TMOD_VIS *mod
EXPORT TINT vis_textsize(TMOD_VIS *mod, TAPTR font, TSTRPTR t)
{
- TINT len;
+ TINT size;
struct TVRequest *req = visi_getreq(mod, TVCMD_TEXTSIZE,
TGetOwner(font), TNULL);
- if (req == TNULL) return -1;
req->tvr_Op.TextSize.Font = font;
req->tvr_Op.TextSize.Text = t;
TExecDoIO(mod->vis_ExecBase, &req->tvr_Req);
- len = req->tvr_Op.TextSize.Width;
+ size = req->tvr_Op.TextSize.Width;
visi_ungetreq(mod, req);
- return len;
+ return size;
}
/*****************************************************************************/
@@ -224,7 +279,6 @@ EXPORT TAPTR vis_queryfonts(TMOD_VIS *mo
{
TAPTR handle;
struct TVRequest *req = visi_getreq(mod, TVCMD_QUERYFONTS, TNULL, tags);
- if (req == TNULL) return TNULL;
req->tvr_Op.QueryFonts.Tags = tags;
TExecDoIO(mod->vis_ExecBase, &req->tvr_Req);
handle = req->tvr_Op.QueryFonts.Handle;
@@ -236,10 +290,9 @@ EXPORT TAPTR vis_queryfonts(TMOD_VIS *mo
EXPORT TTAGITEM *vis_getnextfont(TMOD_VIS *mod, TAPTR fqhandle)
{
- TAPTR attrs;
+ TTAGITEM *attrs;
struct TVRequest *req = visi_getreq(mod, TVCMD_GETNEXTFONT,
TGetOwner(fqhandle), TNULL);
- if (req == TNULL) return TNULL;
req->tvr_Op.GetNextFont.Handle = fqhandle;
TExecDoIO(mod->vis_ExecBase, &req->tvr_Req);
attrs = req->tvr_Op.GetNextFont.Attrs;
@@ -262,19 +315,12 @@ EXPORT TUINT vis_setinput(TMOD_VIS *inst
TUINT newmask = (oldmask & ~cmask) | smask;
if (newmask != oldmask)
{
-/* if ((newmask ^ oldmask) & TITYPE_INTERVAL)
- inst->vis_SendInterval = (newmask & TITYPE_INTERVAL);
-
- if (newmask & ~TITYPE_INTERVAL)
- {*/
- struct TVRequest *req = visi_getreq(inst, TVCMD_SETINPUT,
- inst->vis_Display, TNULL);
- req->tvr_Op.SetInput.Instance = inst->vis_Visual;
- req->tvr_Op.SetInput.Mask = newmask /*& ~TITYPE_INTERVAL*/;
- TExecDoIO(inst->vis_ExecBase, &req->tvr_Req);
- visi_ungetreq(inst, req);
- inst->vis_InputMask = newmask;
-// }
+ struct TVRequest *req = visi_getreq(inst, TVCMD_SETINPUT,
+ inst->vis_Display, TNULL);
+ req->tvr_Op.SetInput.Instance = inst->vis_Visual;
+ req->tvr_Op.SetInput.Mask = newmask;
+ visi_dosync(inst, req);
+ inst->vis_InputMask = newmask;
}
return newmask;
}
@@ -283,45 +329,36 @@ EXPORT TUINT vis_setinput(TMOD_VIS *inst
EXPORT TUINT vis_getattrs(TMOD_VIS *inst, TTAGITEM *tags)
{
- TUINT n;
struct TVRequest *req = visi_getreq(inst, TVCMD_GETATTRS,
inst->vis_Display, TNULL);
req->tvr_Op.GetAttrs.Instance = inst->vis_Visual;
req->tvr_Op.GetAttrs.Tags = tags;
- TExecDoIO(inst->vis_ExecBase, &req->tvr_Req);
- n = req->tvr_Op.GetAttrs.Num;
- visi_ungetreq(inst, req);
- return n;
+ visi_dosync(inst, req);
+ return req->tvr_Op.GetAttrs.Num;
}
/*****************************************************************************/
EXPORT TUINT vis_setattrs(TMOD_VIS *inst, TTAGITEM *tags)
{
- TUINT n;
struct TVRequest *req = visi_getreq(inst, TVCMD_SETATTRS,
inst->vis_Display, TNULL);
req->tvr_Op.SetAttrs.Instance = inst->vis_Visual;
req->tvr_Op.SetAttrs.Tags = tags;
- TExecDoIO(inst->vis_ExecBase, &req->tvr_Req);
- n = req->tvr_Op.SetAttrs.Num;
- visi_ungetreq(inst, req);
- return n;
+ visi_dosync(inst, req);
+ return req->tvr_Op.SetAttrs.Num;
}
/*****************************************************************************/
EXPORT TVPEN vis_allocpen(TMOD_VIS *inst, TUINT rgb)
{
- TVPEN pen;
struct TVRequest *req = visi_getreq(inst, TVCMD_ALLOCPEN,
inst->vis_Display, TNULL);
req->tvr_Op.AllocPen.Instance = inst->vis_Visual;
req->tvr_Op.AllocPen.RGB = rgb;
- TExecDoIO(inst->vis_ExecBase, &req->tvr_Req);
- pen = req->tvr_Op.AllocPen.Pen;
- visi_ungetreq(inst, req);
- return pen;
+ visi_dosync(inst, req);
+ return req->tvr_Op.AllocPen.Pen;
}
/*****************************************************************************/
@@ -339,8 +376,7 @@ EXPORT void vis_setfont(TMOD_VIS *inst,
inst->vis_Display, TNULL);
req->tvr_Op.SetFont.Instance = inst->vis_Visual;
req->tvr_Op.SetFont.Font = font;
- TExecDoIO(inst->vis_ExecBase, &req->tvr_Req);
- visi_ungetreq(inst, req);
+ visi_dosync(inst, req);
}
/*****************************************************************************/
@@ -351,8 +387,7 @@ EXPORT void vis_clear(TMOD_VIS *inst, TV
inst->vis_Display, TNULL);
req->tvr_Op.Clear.Instance = inst->vis_Visual;
req->tvr_Op.Clear.Pen = pen;
More information about the teklib-general
mailing list