dgaudet 98/03/13 16:32:08
Modified: src/include alloc.h
src/main alloc.c util_uri.c
Log:
I really don't think any other definition of pstrndup() makes sense --
especially since it always allocates n+1 bytes of memory, even if I go
back to its original definition. And on examination, all of our uses
of pstrndup() are cases where we want a substring of another string, and
we know the substring is of a certain length. So speed up pstrndup() by
using memcpy(). (This small change was worth another 50% performance
boost when I tested it on test-util-uri.)
Revision Changes Path
1.48 +1 -0 apache-1.3/src/include/alloc.h
Index: alloc.h
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/include/alloc.h,v
retrieving revision 1.47
retrieving revision 1.48
diff -u -r1.47 -r1.48
--- alloc.h 1998/03/09 22:42:54 1.47
+++ alloc.h 1998/03/14 00:32:05 1.48
@@ -115,6 +115,7 @@
API_EXPORT(void *) palloc(struct pool *, int nbytes);
API_EXPORT(void *) pcalloc(struct pool *, int nbytes);
API_EXPORT(char *) pstrdup(struct pool *, const char *s);
+/* make a nul terminated copy of the n characters starting with s */
API_EXPORT(char *) pstrndup(struct pool *, const char *s, int n);
API_EXPORT(char *) pstrcat(struct pool *,...); /* all '...' must be
char* */
1.77 +3 -1 apache-1.3/src/main/alloc.c
Index: alloc.c
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/main/alloc.c,v
retrieving revision 1.76
retrieving revision 1.77
diff -u -r1.76 -r1.77
--- alloc.c 1998/03/13 13:28:15 1.76
+++ alloc.c 1998/03/14 00:32:06 1.77
@@ -726,10 +726,12 @@
API_EXPORT(char *) pstrndup(struct pool *a, const char *s, int n)
{
char *res;
+
if (s == NULL)
return NULL;
res = palloc(a, n + 1);
- ap_cpystrn(res, s, n + 1);
+ memcpy(res, s, n);
+ res[n] = '\0';
return res;
}
1.11 +10 -25 apache-1.3/src/main/util_uri.c
Index: util_uri.c
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/main/util_uri.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- util_uri.c 1998/03/13 08:13:54 1.10
+++ util_uri.c 1998/03/14 00:32:07 1.11
@@ -417,21 +417,6 @@
uri_delims['\0'] = T_NUL;
}
-/* Since we know that the string we're duping is of exactly length l
- * we don't need to go through the expensive (silly) pstrndup(). We
- * can do much better on our own. This is worth another 50%
- * improvement.
- */
-static char *special_strdup(pool *p, const char *s, size_t l)
-{
- char *d;
-
- d = palloc(p, l + 1);
- memcpy(d, s, l);
- d[l] = '\0';
- return d;
-}
-
/* parse_uri_components():
* Parse a given URI, fill in all supplied fields of a uri_components
* structure. This eliminates the necessity of extracting host, port,
@@ -468,7 +453,7 @@
++s;
}
if (s != uri) {
- uptr->path = special_strdup(p, uri, s - uri);
+ uptr->path = pstrndup(p, uri, s - uri);
}
if (*s == 0) {
return HTTP_OK;
@@ -478,7 +463,7 @@
s1 = strchr(s, '#');
if (s1) {
uptr->fragment = pstrdup(p, s1 + 1);
- uptr->query = special_strdup(p, s, s1 - s);
+ uptr->query = pstrndup(p, s, s1 - s);
}
else {
uptr->query = pstrdup(p, s);
@@ -500,14 +485,14 @@
goto deal_with_path; /* backwards predicted taken! */
}
- uptr->scheme = special_strdup(p, uri, s - uri);
+ uptr->scheme = pstrndup(p, uri, s - uri);
s += 3;
hostinfo = s;
while ((uri_delims[*(unsigned char *)s] & NOTEND_HOSTINFO) == 0) {
++s;
}
uri = s; /* whatever follows hostinfo is start of uri */
- uptr->hostinfo = special_strdup(p, hostinfo, uri - hostinfo);
+ uptr->hostinfo = pstrndup(p, hostinfo, uri - hostinfo);
/* If there's a username:[EMAIL PROTECTED]:port, the @ we want is the
last @...
* too bad there's no memrchr()... For the C purists, note that hostinfo
@@ -527,12 +512,12 @@
s = memchr(hostinfo, ':', uri - hostinfo);
if (s == NULL) {
/* we expect the common case to have no port */
- uptr->hostname = special_strdup(p, hostinfo, uri - hostinfo);
+ uptr->hostname = pstrndup(p, hostinfo, uri - hostinfo);
goto deal_with_path;
}
- uptr->hostname = special_strdup(p, hostinfo, s - hostinfo);
+ uptr->hostname = pstrndup(p, hostinfo, s - hostinfo);
++s;
- uptr->port_str = special_strdup(p, s, uri - s);
+ uptr->port_str = pstrndup(p, s, uri - s);
if (uri != s) {
port = strtol(uptr->port_str, &endstr, 10);
uptr->port = port;
@@ -549,12 +534,12 @@
/* first colon delimits username:password */
s1 = memchr(hostinfo, ':', s - hostinfo);
if (s1) {
- uptr->user = special_strdup(p, hostinfo, s1 - hostinfo);
+ uptr->user = pstrndup(p, hostinfo, s1 - hostinfo);
++s1;
- uptr->password = special_strdup(p, s1, s - s1);
+ uptr->password = pstrndup(p, s1, s - s1);
}
else {
- uptr->user = special_strdup(p, hostinfo, s - hostinfo);
+ uptr->user = pstrndup(p, hostinfo, s - hostinfo);
}
hostinfo = s + 1;
goto deal_with_host;