From 618bb244dbefe8c7aabe3b1e34c5cf0985c4a55d Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Wed, 25 Mar 2009 10:37:51 +0100 Subject: [PATCH] add patch to speedup xorg (from Xorg ML - for Moblin --- packages/virtual/Xorg/init.d/65_xorg | 2 +- packages/virtual/Xorg/install | 1 + .../xinit/scripts/xinitrc.d/20_windowmanager | 2 +- packages/x11/xserver/xorg-server/build | 1 - packages/x11/xserver/xorg-server/install | 2 +- ...ache-xkbcomp-output-for-fast-start-up.diff | 340 ++++++++++++++++++ 6 files changed, 344 insertions(+), 4 deletions(-) create mode 100644 packages/x11/xserver/xorg-server/patches/cache-xkbcomp-output-for-fast-start-up.diff diff --git a/packages/virtual/Xorg/init.d/65_xorg b/packages/virtual/Xorg/init.d/65_xorg index f32d0a87f9..5edfba1133 100755 --- a/packages/virtual/Xorg/init.d/65_xorg +++ b/packages/virtual/Xorg/init.d/65_xorg @@ -16,4 +16,4 @@ if /usr/bin/test "${ELISA_DEBUG}" = "yes" ; then mount -o bind /storage /var/tmp fi -xinit $XINITRC -- $XSERVERRC \ No newline at end of file +xinit $XINITRC -- $XSERVERRC & \ No newline at end of file diff --git a/packages/virtual/Xorg/install b/packages/virtual/Xorg/install index 7cb3bff58c..c30b08e310 100755 --- a/packages/virtual/Xorg/install +++ b/packages/virtual/Xorg/install @@ -34,6 +34,7 @@ $SCRIPTS/install xf86-video-nv $SCRIPTS/install xinit #+$SCRIPTS/install pciutils $SCRIPTS/install evilwm-ewmh +$SCRIPTS/install ratpoison #mkdir -p $INSTALL/usr/bin #cp $PKG_DIR/scripts/oe_wrapper $INSTALL/usr/bin #cp $PKG_DIR/scripts/startx $INSTALL/usr/bin diff --git a/packages/x11/app/xinit/scripts/xinitrc.d/20_windowmanager b/packages/x11/app/xinit/scripts/xinitrc.d/20_windowmanager index 289a39c005..d5ab564cf7 100644 --- a/packages/x11/app/xinit/scripts/xinitrc.d/20_windowmanager +++ b/packages/x11/app/xinit/scripts/xinitrc.d/20_windowmanager @@ -13,7 +13,7 @@ if test -f /usr/bin/mrxvt; then fi if /usr/bin/test "${OE_X_WM_ENABLED}" = "yes" ; then - /usr/bin/evilwm ${args}> /dev/null 2>&1 & + /usr/bin/evilwm ${args}> /dev/null 2>&1 & fi # /usr/bin/evilwm -fn ${WM_FONT} ${args}> /dev/null 2>&1 & diff --git a/packages/x11/xserver/xorg-server/build b/packages/x11/xserver/xorg-server/build index fe18dc4a75..76bd2347d3 100755 --- a/packages/x11/xserver/xorg-server/build +++ b/packages/x11/xserver/xorg-server/build @@ -57,7 +57,6 @@ cd $BUILD/$1* --disable-debug \ --disable-builddocs \ --enable-largefile \ - --disable-builtin-fonts \ --enable-install-libxf86config \ --disable-xselinux \ --enable-aiglx \ diff --git a/packages/x11/xserver/xorg-server/install b/packages/x11/xserver/xorg-server/install index e9e69b26e1..8afe954b53 100755 --- a/packages/x11/xserver/xorg-server/install +++ b/packages/x11/xserver/xorg-server/install @@ -58,7 +58,7 @@ mkdir -p $XORG_DST/multimedia cp $XORG_SRC/i2c/.libs/*_drv.so $XORG_DST/multimedia mkdir -p $INSTALL/etc/X11 -cp $BUILD/$1*/dix/protocol.txt $INSTALL/usr/lib/xorg +cp $BUILD/$1*/dix/protocol.txt $INSTALL/etc/X11 mkdir -p $INSTALL/etc/dbus-1/system.d cp $BUILD/$1*/config/xorg-server.conf $INSTALL/etc/dbus-1/system.d diff --git a/packages/x11/xserver/xorg-server/patches/cache-xkbcomp-output-for-fast-start-up.diff b/packages/x11/xserver/xorg-server/patches/cache-xkbcomp-output-for-fast-start-up.diff new file mode 100644 index 0000000000..faa75e9295 --- /dev/null +++ b/packages/x11/xserver/xorg-server/patches/cache-xkbcomp-output-for-fast-start-up.diff @@ -0,0 +1,340 @@ +From e7046c26d7ac970bfd75cae16262845bef72423b Mon Sep 17 00:00:00 2001 +From: Yan Li +Date: Tue, 24 Mar 2009 17:43:12 +0800 +Subject: [PATCH] Cache xkbcomp output for fast start-up + +xkbcomp outputs will be cached in files with hashed keymap as +names. This saves boot time for around 1s on commodity netbooks. + +Signed-off-by: Yan Li +--- + xkb/ddxLoad.c | 188 +++++++++++++++++++++++++++++++++++++++++--------------- + xkb/xkbfmisc.c | 18 +++++- + 2 files changed, 153 insertions(+), 53 deletions(-) + +diff --git a/xkb/ddxLoad.c b/xkb/ddxLoad.c +index 4d5dfb6..799622d 100644 +--- a/xkb/ddxLoad.c ++++ b/xkb/ddxLoad.c +@@ -32,6 +32,12 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. + #include + #endif + ++#ifdef HAVE_SHA1_IN_LIBMD /* Use libmd for SHA1 */ ++# include ++#else /* Use OpenSSL's libcrypto */ ++# include /* buggy openssl/sha.h wants size_t */ ++# include ++#endif + #include + #include + #define NEED_EVENTS 1 +@@ -159,25 +165,61 @@ OutputDirectory( + size_t size) + { + #ifndef WIN32 +- if (getuid() == 0 && (strlen(XKM_OUTPUT_DIR) < size)) +- { +- /* if server running as root it *may* be able to write */ +- /* FIXME: check whether directory is writable at all */ +- (void) strcpy (outdir, XKM_OUTPUT_DIR); ++ if (getuid() == 0 && (strlen(XKM_OUTPUT_DIR) < size)) { ++ /* if server running as root it *may* be able to write */ ++ /* FIXME: check whether directory is writable at all */ ++ (void) strcpy (outdir, XKM_OUTPUT_DIR); + } else + #else +- if (strlen(Win32TempDir()) + 1 < size) +- { +- (void) strcpy(outdir, Win32TempDir()); +- (void) strcat(outdir, "\\"); ++ if (strlen(Win32TempDir()) + 1 < size) { ++ (void) strcpy(outdir, Win32TempDir()); ++ (void) strcat(outdir, "\\"); + } else + #endif +- if (strlen("/tmp/") < size) +- { +- (void) strcpy (outdir, "/tmp/"); ++ if (strlen("/tmp/") < size) { ++ (void) strcpy (outdir, "/tmp/"); ++ } ++} ++ ++static Bool ++Sha1Asc(char sha1Asc[SHA_DIGEST_LENGTH*2+1], const char * input) ++{ ++ int i; ++ unsigned char sha1[SHA_DIGEST_LENGTH]; ++ ++#ifdef HAVE_SHA1_IN_LIBMD /* Use libmd for SHA1 */ ++ SHA1_CTX ctx; ++ ++ SHA1Init (&ctx); ++ SHA1Update (&ctx, input, strlen(input)); ++ SHA1Final (sha1, &ctx); ++#else /* Use OpenSSL's libcrypto */ ++ SHA_CTX ctx; ++ int success; ++ ++ success = SHA1_Init (&ctx); ++ if (! success) ++ return BadAlloc; ++ ++ success = SHA1_Update (&ctx, input, strlen(input)); ++ if (! success) ++ return BadAlloc; ++ ++ success = SHA1_Final (sha1, &ctx); ++ if (! success) ++ return BadAlloc; ++#endif ++ ++ /* convert sha1 to sha1_asc */ ++ for(i=0; i nameRtrnLen) && nameRtrn) { ++ ErrorF("[xkb] nameRtrn too small to hold xkmfile name\n"); ++ return False; ++ } ++ strncpy(nameRtrn, xkmfile, nameRtrnLen); ++ ++ /* if the xkb file already exists, reuse it */ ++ canonicalXkmfileName = Xprintf("%s%s.xkm", xkmOutputDir, xkmfile); ++ LogMessage(X_INFO, "[xkb] xkmfile %s ", canonicalXkmfileName); ++ if (access(canonicalXkmfileName, R_OK) == 0) { ++ /* yes, we can reuse old xkb file */ ++ LogMessage(X_INFO, "reused\n"); ++ xfree(canonicalXkmfileName); ++ return True; ++ } ++ LogMessage(X_INFO, "is being compiled\n"); ++ xfree(canonicalXkmfileName); + +- XkbEnsureSafeMapName(keymap); +- OutputDirectory(xkm_output_dir, sizeof(xkm_output_dir)); ++ /* continue to call xkbcomp to compile the keymap */ + + #ifdef WIN32 + strcpy(tmpname, Win32TempDir()); +@@ -215,19 +302,19 @@ XkbDDXCompileKeymapByNames( XkbDescPtr xkb, + #endif + + if (XkbBaseDirectory != NULL) { +- xkbbasedirflag = Xprintf("\"-R%s\"", XkbBaseDirectory); ++ xkbbasedirflag = Xprintf("\"-R%s\"", XkbBaseDirectory); + } + + if (XkbBinDirectory != NULL) { +- int ld = strlen(XkbBinDirectory); +- int lps = strlen(PATHSEPARATOR); ++ int ld = strlen(XkbBinDirectory); ++ int lps = strlen(PATHSEPARATOR); + +- xkbbindir = XkbBinDirectory; ++ xkbbindir = XkbBinDirectory; + +- if ((ld >= lps) && +- (strcmp(xkbbindir + ld - lps, PATHSEPARATOR) != 0)) { +- xkbbindirsep = PATHSEPARATOR; +- } ++ if ((ld >= lps) && ++ (strcmp(xkbbindir + ld - lps, PATHSEPARATOR) != 0)) { ++ xkbbindirsep = PATHSEPARATOR; ++ } + } + + buf = Xprintf("\"%s%sxkbcomp\" -w %d %s -xkm \"%s\" " +@@ -235,12 +322,12 @@ XkbDDXCompileKeymapByNames( XkbDescPtr xkb, + xkbbindir, xkbbindirsep, + ( (xkbDebugFlags < 2) ? 1 : + ((xkbDebugFlags > 10) ? 10 : (int)xkbDebugFlags) ), +- xkbbasedirflag, xkmfile, ++ xkbbasedirflag, xkbfile, + PRE_ERROR_MSG, ERROR_PREFIX, POST_ERROR_MSG1, +- xkm_output_dir, keymap); ++ xkmOutputDir, xkmfile); + + if (xkbbasedirflag != emptystring) { +- xfree(xkbbasedirflag); ++ xfree(xkbbasedirflag); + } + + #ifndef WIN32 +@@ -248,33 +335,34 @@ XkbDDXCompileKeymapByNames( XkbDescPtr xkb, + #else + out= fopen(tmpname, "w"); + #endif +- ++ + if (out!=NULL) { + #ifdef DEBUG +- if (xkbDebugFlags) { +- ErrorF("[xkb] XkbDDXCompileKeymapByNames compiling keymap:\n"); +- XkbWriteXKBKeymapForNames(stderr,names,xkb,want,need); +- } ++ if (xkbDebugFlags) { ++ ErrorF("[xkb] XkbDDXCompileKeymapByNames compiling keymap:\n"); ++ XkbWriteXKBKeymapForNames(stderr,names,xkb,want,need); ++ } + #endif +- XkbWriteXKBKeymapForNames(out,names,xkb,want,need); ++ /* write XKBKeyMapBuf to xkbcomp */ ++ if (EOF==fputs(xkbKeyMapBuf, out)) ++ { ++ ErrorF("[xkb] sending keymap to xkbcomp\n"); ++ return False; ++ } + #ifndef WIN32 +- if (Pclose(out)==0) ++ if (Pclose(out)==0) { + #else +- if (fclose(out)==0 && System(buf) >= 0) ++ if (fclose(out)==0 && System(buf) >= 0) { + #endif +- { + if (xkbDebugFlags) + DebugF("[xkb] xkb executes: %s\n",buf); +- if (nameRtrn) { +- strncpy(nameRtrn,keymap,nameRtrnLen); +- nameRtrn[nameRtrnLen-1]= '\0'; +- } + if (buf != NULL) + xfree (buf); +- return True; +- } +- else +- LogMessage(X_ERROR, "Error compiling keymap (%s)\n", keymap); ++ return True; ++ } ++ else ++ LogMessage(X_ERROR, "Error compiling keymap (%s)\n", xkbfile); ++ + #ifdef WIN32 + /* remove the temporary file */ + unlink(tmpname); +@@ -282,13 +370,14 @@ XkbDDXCompileKeymapByNames( XkbDescPtr xkb, + } + else { + #ifndef WIN32 +- LogMessage(X_ERROR, "XKB: Could not invoke xkbcomp\n"); ++ LogMessage(X_ERROR, "XKB: Could not invoke xkbcomp\n"); + #else +- LogMessage(X_ERROR, "Could not open file %s\n", tmpname); ++ LogMessage(X_ERROR, "Could not open file %s\n", tmpname); + #endif + } ++ + if (nameRtrn) +- nameRtrn[0]= '\0'; ++ nameRtrn[0]= '\0'; + if (buf != NULL) + xfree (buf); + return False; +@@ -375,7 +464,6 @@ unsigned missing; + DebugF("Loaded XKB keymap %s, defined=0x%x\n",fileName,(*xkbRtrn)->defined); + } + fclose(file); +- (void) unlink (fileName); + return (need|want)&(~missing); + } + +diff --git a/xkb/xkbfmisc.c b/xkb/xkbfmisc.c +index ae752e9..5abf3c7 100644 +--- a/xkb/xkbfmisc.c ++++ b/xkb/xkbfmisc.c +@@ -293,15 +293,27 @@ unsigned wantNames,wantConfig,wantDflts; + multi_section= 1; + if (((complete&XkmKeymapRequired)==XkmKeymapRequired)&& + ((complete&(~XkmKeymapLegal))==0)) { +- fprintf(file,"xkb_keymap \"%s\" {\n",name); ++ if (fprintf(file,"xkb_keymap \"%s\" {\n",name) <= 0) ++ { ++ ErrorF("[xkb] writting XKB Keymap\n"); ++ return False; ++ } + } + else if (((complete&XkmSemanticsRequired)==XkmSemanticsRequired)&& + ((complete&(~XkmSemanticsLegal))==0)) { +- fprintf(file,"xkb_semantics \"%s\" {\n",name); ++ if (fprintf(file,"xkb_semantics \"%s\" {\n",name)<=0) ++ { ++ ErrorF("[xkb] writting XKB Keymap\n"); ++ return False; ++ } + } + else if (((complete&XkmLayoutRequired)==XkmLayoutRequired)&& + ((complete&(~XkmLayoutLegal))==0)) { +- fprintf(file,"xkb_layout \"%s\" {\n",name); ++ if (fprintf(file,"xkb_layout \"%s\" {\n",name)<=0) ++ { ++ ErrorF("[xkb] writting XKB Keymap\n"); ++ return False; ++ } + } + else if (XkmSingleSection(complete&(~XkmVirtualModsMask))) { + multi_section= 0; +-- +1.5.6.5 +