From 416f9a1ed6283aa2de2f1c4961c6d68f3d28f30f Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sun, 19 Oct 2014 17:16:00 +0000 Subject: read only one of ls-R and ls-r if they are same_file_p git-svn-id: svn://tug.org/texlive/trunk@35399 c570f23f-e606-0410-a88d-b1316a301751 --- Build/source/texk/kpathsea/ChangeLog | 11 +++++ Build/source/texk/kpathsea/db.c | 86 +++++++++++++++++++++++++++--------- 2 files changed, 77 insertions(+), 20 deletions(-) diff --git a/Build/source/texk/kpathsea/ChangeLog b/Build/source/texk/kpathsea/ChangeLog index bb68c836caa..c26653f5130 100644 --- a/Build/source/texk/kpathsea/ChangeLog +++ b/Build/source/texk/kpathsea/ChangeLog @@ -1,3 +1,14 @@ +2014-10-19 Karl Berry + + * db.c (db_names): list DB_NAME_LC first, and list both always, + dropping WIN32 conditional. + (init_db): check at runtime if ls-R and ls-R are same_file_p, + and only read one on any system, not just hardwiring Windows. + Output debugging lines. Basic patch from Adam Maxwell + (since MacOSX now uses a case-preserving filesystem). + + * db.c (DB_HASH_SIZE): increase per current texmf-dist/ls-R. + 2014-10-17 Karl Berry * line.c (getc, FLOCKFILE, FUNLOCKFILE): #define to getc_unlocked, etc. diff --git a/Build/source/texk/kpathsea/db.c b/Build/source/texk/kpathsea/db.c index 41aeb80835a..9a4516d40bb 100644 --- a/Build/source/texk/kpathsea/db.c +++ b/Build/source/texk/kpathsea/db.c @@ -1,6 +1,6 @@ /* db.c: an external database to avoid filesystem lookups. - Copyright 1994, 1995, 1996, 1997, 2008, 2009, 2011, 2012 Karl Berry. + Copyright 1994, 1995, 1996, 1997, 2008, 2009, 2011, 2012, 2014 Karl Berry. Copyright 1997-2005 Olaf Weber. This library is free software; you can redistribute it and/or @@ -31,10 +31,8 @@ #include #ifndef DB_HASH_SIZE -/* Based on the size of 2008 texmf-dist/ls-R, about 62000 entries. But - we don't want to make it too big, since texmf/ls-R only has about - 1300 entries. We should dynamically adapt the size. */ -#define DB_HASH_SIZE 32003 +/* Based on the size of 2014 texmf-dist/ls-R, about 130,000 entries. */ +#define DB_HASH_SIZE 64007 #endif #ifndef DB_NAME #define DB_NAME "ls-R" @@ -43,17 +41,13 @@ #define DB_NAME_LC "ls-r" #endif -static char db_name[] = DB_NAME; -#ifndef WIN32 -static char db_name_lc[] = DB_NAME_LC; -#endif - -/* read ls-R only on WIN32 */ +/* In the loop in init() below where we check for DB_NAME_LC and DB_NAME + being the same file, it's convenient to ignore the first of a pair. + So put the canonical name second. Sure wish I hadn't used a capital + letter in the name in the first place. */ static string db_names[] = { - db_name, -#ifndef WIN32 - db_name_lc, -#endif + DB_NAME_LC, + DB_NAME, NULL }; @@ -380,23 +374,75 @@ alias_build (kpathsea kpse, hash_table_type *table, void kpathsea_init_db (kpathsea kpse) { - boolean ok = false; const_string db_path; string *db_files; string *orig_db_files; + str_list_type unique_list; + int dbi; + boolean ok = false; assert (sizeof(DB_NAME) == sizeof(DB_NAME_LC)); db_path = kpathsea_init_format (kpse, kpse_db_format); - db_files = kpathsea_path_search_list_generic (kpse, db_path, db_names, true, true); + db_files = kpathsea_path_search_list_generic (kpse, db_path, db_names, + true, true); + orig_db_files = db_files; + + /* Mac OS X and others can use a case-insensitive, case-preserving + filesystem by default, in which case ls-R and ls-r point to the + same file. Also, Windows is case-insensitive. In these cases, + we want to avoid reading the same file multiple times. */ + dbi = 0; + unique_list = str_list_init (); + + while (db_files[dbi] != NULL) { + string path1 = db_files[dbi]; + string path2 = db_files[dbi + 1]; + + /* first-pass check in case path1/path2 aren't even + potentially equal; mainly in case the order from + kpathsea_path_search_list_generic changes. */ + if (path2 + && strcasecmp (path1, path2) == 0 + && same_file_p (path1, path2)) { + /* they are the same, skip over path1, we'll add path2 + on the next iteration (when it's path1). */ +#ifdef KPSE_DEBUG + if (KPATHSEA_DEBUG_P (KPSE_DEBUG_HASH)) { + DEBUGF2 ("db:init(): skipping db same_file_p %s, will add %s.\n", + path1, path2); + } +#endif + free (path1); + + } else { + /* they are not the same, add path1. */ +#ifdef KPSE_DEBUG + if (KPATHSEA_DEBUG_P (KPSE_DEBUG_HASH)) { + DEBUGF1 ("db:init(): using db file %s.\n", path1); + } +#endif + str_list_add (&unique_list, path1); + } + + /* could be more clever and increment by two, but then would + have to avoid jumping off the end of db_files */ + dbi++; + } + + /* always add a NULL terminator. */ + str_list_add (&unique_list, NULL); + + free (orig_db_files); + db_files = STR_LIST (unique_list); orig_db_files = db_files; /* Must do this after the path searching (which ends up calling - kpse_db_search recursively), so kpse->db.buckets stays NULL. */ + kpse_db_search recursively), so kpse->db.buckets stays NULL. */ kpse->db = hash_create (DB_HASH_SIZE); while (db_files && *db_files) { - if (db_build (kpse, &(kpse->db), *db_files)) + if (db_build (kpse, &(kpse->db), *db_files)) ok = true; free (*db_files); db_files++; @@ -421,7 +467,7 @@ kpathsea_init_db (kpathsea kpse) kpse->alias_db = hash_create (ALIAS_HASH_SIZE); while (db_files && *db_files) { - if (alias_build (kpse, &(kpse->alias_db), *db_files)) + if (alias_build (kpse, &(kpse->alias_db), *db_files)) ok = true; free (*db_files); db_files++; -- cgit v1.2.3