[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