On 28/06/2010 13:24, Vignatti Tiago (Nokia-D/Helsinki) wrote:
On Mon, Jun 28, 2010 at 01:36:31PM +0200, ext Julien Cristau wrote:
On Mon, Jun 28, 2010 at 14:20:51 +0300, Tiago Vignatti wrote:

On Mon, Jun 28, 2010 at 12:48:53PM +0200, ext Colin Harrison wrote:
Hi,

All XWin DDX builds use libXfont built static.
The following libXfont patch is needed following recent master git changes
(use of register_fpe_functions from libXfont in the server)...

--- ./src/util/save_miscutil.c  2010-06-21 16:47:00.000000000 +0100
+++ ./src/util/miscutil.c       2010-06-28 11:25:19.000000000 +0100
@@ -48,8 +48,10 @@

  extern void BuiltinRegisterFpeFunctions(void);

+#ifndef WIN32
  /* make sure everything initializes themselves at least once */
  weak long serverGeneration = 1;
+#endif


can't we just live without serverGeneration then? My quickly compile&  test
approach here worked well when doing it.

What did you test exactly?  The X server has a non-weak serverGeneration
so removing the weak one from libXfont doesn't make a difference there,
but it might for other libXfont users.

oh, that's true. I forgot that the server and libXfont is not 1:1 mapping.

What do people think about the attached (untested) patch as an approach?

Since register_fpe_functions() is now called by the server for every generation, we can arrange for that to do the needed re-initialization for a new server generation, and avoid libXfont needing to track server generations itself.

This removes serverGeneration from libXfont, so any client which depends on the existence of that weak definition won't build any more, but that seems to me to be a strange thing to do...

>From f99d18b856e985023f2ffaf90421a323d282e66f Mon Sep 17 00:00:00 2001
From: Jon TURNEY <jon.tur...@dronecode.org.uk>
Date: Mon, 28 Jun 2010 16:43:42 +0100
Subject: [PATCH] Remove the weakly defined serverGeneration variable.

Instead, since register_fpe_functions() is called by the xserver
on every generation, arrange for things which need to get reinitialized
for each server regeneration to do so then

Retain just-in-time initialization of that same data for other users
---
 src/bitmap/bitscale.c    |   16 +++++++++-------
 src/fontfile/renderers.c |   25 ++++++++++++++++---------
 src/util/miscutil.c      |   12 +++++++++---
 3 files changed, 34 insertions(+), 19 deletions(-)

diff --git a/src/bitmap/bitscale.c b/src/bitmap/bitscale.c
index a4d991d..24d6b1a 100644
--- a/src/bitmap/bitscale.c
+++ b/src/bitmap/bitscale.c
@@ -60,9 +60,6 @@ from The Open Group.
 #define   MAX(a,b)    (((a)>(b)) ? a : b)
 #endif
 
-/* Should get this from elsewhere */
-extern unsigned long serverGeneration;
-
 static void bitmapUnloadScalable (FontPtr pFont);
 static void ScaleBitmap ( FontPtr pFont, CharInfoPtr opci, 
                          CharInfoPtr pci, double *inv_xform, 
@@ -188,7 +185,7 @@ static fontProp rawFontPropTable[] = {
     { "RAW_X_HEIGHT", 0, }
 };
 
-static void
+void
 initFontPropTable(void)
 {
     int         i;
@@ -598,10 +595,15 @@ ComputeScaledProperties(FontInfoPtr sourceFontInfo, /* 
the font to be scaled */
     char       *isStringProp;
     int                nProps;
 
-    if (bitscaleGeneration != serverGeneration) {
-       initFontPropTable();
-       bitscaleGeneration = serverGeneration;
+    {
+      static Bool fontPropTableInitialized = FALSE;
+      if (!fontPropTableInitialized)
+        {
+          initFontPropTable();
+          fontPropTableInitialized = TRUE;
+        }
     }
+
     nProps = NPROPS + 1 + sizeof(fontPropTable) / sizeof(fontProp) +
                          sizeof(rawFontPropTable) / sizeof(fontProp);
     fp = malloc(sizeof(FontPropRec) * nProps);
diff --git a/src/fontfile/renderers.c b/src/fontfile/renderers.c
index bf82c1c..3b10b4b 100644
--- a/src/fontfile/renderers.c
+++ b/src/fontfile/renderers.c
@@ -41,8 +41,14 @@ static FontRenderersRec      renderers;
  * XXX Maybe should allow unregistering renders. For now, just clear the
  * list at each new generation.
  */
-extern unsigned long serverGeneration;
-static unsigned long rendererGeneration = 0;
+void
+FontFileInitRendererList(void)
+{
+  renderers.number = 0;
+  if (renderers.renderers)
+    free(renderers.renderers);
+  renderers.renderers = NULL;
+}
 
 Bool
 FontFileRegisterRenderer (FontRendererPtr renderer)
@@ -56,12 +62,14 @@ FontFilePriorityRegisterRenderer (FontRendererPtr renderer, 
int priority)
     int                    i;
     struct _FontRenderersElement *new;
 
-    if (rendererGeneration != serverGeneration) {
-       rendererGeneration = serverGeneration;
-       renderers.number = 0;
-       if (renderers.renderers)
-          free(renderers.renderers);
-       renderers.renderers = NULL;
+    {
+      static Bool renderListInitialized = FALSE;
+
+      if (!renderListInitialized)
+        {
+          FontFileInitRendererList();
+          renderListInitialized = TRUE;
+        }
     }
 
     for (i = 0; i < renderers.number; i++) {
@@ -69,7 +77,6 @@ FontFilePriorityRegisterRenderer (FontRendererPtr renderer, 
int priority)
                          renderer->fileSuffix)) {
             if(renderers.renderers[i].priority >= priority) {
                 if(renderers.renderers[i].priority == priority) {
-                    if (rendererGeneration == 1)
                         ErrorF("Warning: font renderer for \"%s\" "
                                "already registered at priority %d\n",
                                renderer->fileSuffix, priority);
diff --git a/src/util/miscutil.c b/src/util/miscutil.c
index 1e76b4b..8ea1d9d 100644
--- a/src/util/miscutil.c
+++ b/src/util/miscutil.c
@@ -42,14 +42,17 @@ from The Open Group.
 
 
 #ifdef __SUNPRO_C
-#pragma weak serverGeneration
 #pragma weak register_fpe_functions
 #endif
 
 extern void BuiltinRegisterFpeFunctions(void);
 
-/* make sure everything initializes themselves at least once */
-weak long serverGeneration = 1;
+static void
+init_stuff(void)
+{
+  initFontPropTable();
+  FontFileInitRendererList();
+}
 
 weak void
 register_fpe_functions (void)
@@ -59,4 +62,7 @@ register_fpe_functions (void)
 #ifdef XFONT_FC
     fs_register_fpe_functions();
 #endif
+
+    /* re-initialize things which need to get re-initialized for every server 
generation */
+    init_stuff();
 }
-- 
1.7.0.4

_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to