From 966b0fc7c96b1dba63fa755312a2be64e18ff471 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 5 Sep 2003 21:30:50 +0000 Subject: More cachegrind tuning, plus fix an error message. Jeremy. (This used to be commit 8cb9ec5d533085d40fc6bfe4ca9647d80bf41ac7) --- source3/lib/charcnv.c | 43 ++++++++++++++++++++++++++++++++----------- source3/smbd/statcache.c | 8 +++++--- source3/smbd/trans2.c | 2 +- 3 files changed, 38 insertions(+), 15 deletions(-) (limited to 'source3') diff --git a/source3/lib/charcnv.c b/source3/lib/charcnv.c index ceb9d57fc7..5a922e226c 100644 --- a/source3/lib/charcnv.c +++ b/source3/lib/charcnv.c @@ -511,22 +511,43 @@ size_t unix_strupper(const char *src, size_t srclen, char *dest, size_t destlen) char *strdup_upper(const char *s) { - size_t size; - wpstring buffer; pstring out_buffer; - - size = convert_string(CH_UNIX, CH_UCS2, s, -1, buffer, sizeof(buffer)); - if (size == -1) { - return NULL; + const unsigned char *p = (const unsigned char *)s; + unsigned char *q = (unsigned char *)out_buffer; + + /* this is quite a common operation, so we want it to be + fast. We optimise for the ascii case, knowing that all our + supported multi-byte character sets are ascii-compatible + (ie. they match for the first 128 chars) */ + + while (1) { + if (*p & 0x80) + break; + *q++ = toupper(*p); + if (!*p) + break; + p++; + if (p - ( const unsigned char *)s >= sizeof(pstring)) + break; } - strupper_w(buffer); + if (*p) { + /* MB case. */ + size_t size; + wpstring buffer; + size = convert_string(CH_UNIX, CH_UCS2, s, -1, buffer, sizeof(buffer)); + if (size == -1) { + return NULL; + } + + strupper_w(buffer); - size = convert_string(CH_UCS2, CH_UNIX, buffer, sizeof(buffer), out_buffer, sizeof(out_buffer)); - if (size == -1) { - return NULL; + size = convert_string(CH_UCS2, CH_UNIX, buffer, sizeof(buffer), out_buffer, sizeof(out_buffer)); + if (size == -1) { + return NULL; + } } - + return strdup(out_buffer); } diff --git a/source3/smbd/statcache.c b/source3/smbd/statcache.c index 28915a30a0..948173687d 100644 --- a/source3/smbd/statcache.c +++ b/source3/smbd/statcache.c @@ -217,10 +217,10 @@ BOOL stat_cache_lookup(connection_struct *conn, pstring name, pstring dirpath, /* * Don't lookup trivial valid directory entries. */ - if((*name == '\0') || (strcmp(name, ".") == 0) || (strcmp(name, "..") == 0)) { - DO_PROFILE_INC(statcache_misses); + if((*name == '\0') || (name[0] == '.' && + ((name[1] == '\0') || + (name[1] == '.' && name[1] == '\0')))) return False; - } if (case_sensitive) { chk_name = strdup(name); @@ -248,6 +248,7 @@ BOOL stat_cache_lookup(connection_struct *conn, pstring name, pstring dirpath, while (1) { hash_elem = hash_lookup(&stat_cache, chk_name); if(hash_elem == NULL) { + DEBUG(10,("stat_cache_lookup: lookup failed for name [%s]\n", chk_name )); /* * Didn't find it - remove last component for next try. */ @@ -277,6 +278,7 @@ BOOL stat_cache_lookup(connection_struct *conn, pstring name, pstring dirpath, } } else { scp = (stat_cache_entry *)(hash_elem->value); + DEBUG(10,("stat_cache_lookup: lookup succeeded for name [%s] -> [%s]\n", chk_name, scp->translated_path )); DO_PROFILE_INC(statcache_hits); if(SMB_VFS_STAT(conn,scp->translated_path, pst) != 0) { /* Discard this entry - it doesn't exist in the filesystem. */ diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 7e46a6b6ab..033e76a33e 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -1781,7 +1781,7 @@ static int call_trans2setfsinfo(connection_struct *conn, int set_bad_path_error(int err, BOOL bad_path, char *outbuf, int def_class, uint32 def_code) { - DEBUG(10,("set_bad_path_error: err = %dm bad_path = %d\n", + DEBUG(10,("set_bad_path_error: err = %d bad_path = %d\n", err, (int)bad_path )); if(err == ENOENT) { -- cgit