You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by David Reid <ab...@dial.pipex.com> on 1999/11/04 13:58:39 UTC
APR MMAP support
What follows is a CVS diff -u of the changes to add apr mmap support into
Apache. If I don't hear any objections than I'll commit tomorrow evening
(UK time). I've removed the put_statinfo stuff and added a new function for
creating an mmap in keeping with Manoj's comments. It's been tested on
FreeBSD 3.3 and BeOS.
I know we don't normally post cvs diff's but as I had all the files sitting
there I couldn't be bothered doing a normal diff... :-)
david
Index: apache-2.0/src/include/http_protocol.h
===================================================================
RCS file: /home/cvs/apache-2.0/src/include/http_protocol.h,v
retrieving revision 1.6
diff -u -u -r1.6 http_protocol.h
--- http_protocol.h 1999/10/05 05:14:41 1.6
+++ http_protocol.h 1999/11/04 12:50:09
@@ -60,6 +60,7 @@
#include "ap_hooks.h"
#include "apr_portable.h"
+#include "apr_mmap.h"
#ifdef __cplusplus
extern "C" {
@@ -140,7 +141,7 @@
API_EXPORT(long) ap_send_fb(BUFF *f, request_rec *r);
API_EXPORT(long) ap_send_fb_length(BUFF *f, request_rec *r, long length);
-API_EXPORT(size_t) ap_send_mmap(void *mm, request_rec *r, size_t offset,
+API_EXPORT(size_t) ap_send_mmap(ap_mmap_t *mm, request_rec *r, size_t
offset,
size_t length);
/* Hmmm... could macrofy these for now, and maybe forever, though the
Index: apache-2.0/src/main/http_core.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/main/http_core.c,v
retrieving revision 1.21
diff -u -u -r1.21 http_core.c
--- http_core.c 1999/10/21 18:28:14 1.21
+++ http_core.c 1999/11/04 12:50:20
@@ -71,7 +71,7 @@
#include "http_connection.h"
#ifdef USE_MMAP_FILES
-#include <sys/mman.h>
+#include "apr_mmap.h"
/* mmap support for static files based on ideas from John Heidemann's
* patch against 1.0.5. See
@@ -2442,25 +2442,6 @@
static int do_nothing(request_rec *r) { return OK; }
-#ifdef USE_MMAP_FILES
-struct mmap_rec {
- void *mm;
- size_t length;
-};
-
-static ap_status_t mmap_cleanup(void *mmv)
-{
- struct mmap_rec *mmd = mmv;
-
- if (munmap(mmd->mm, mmd->length) == -1) {
- ap_log_error(APLOG_MARK, APLOG_ERR, errno, NULL,
- "Failed to munmap memory of length %ld at 0x%lx",
- (long) mmd->length, (long) mmd->mm);
- }
- return APR_SUCCESS;
-}
-#endif
-
/*
* Default handler for MIME types without other handlers. Only GET
* and OPTIONS at this point... anyone who wants to write a generic
@@ -2478,7 +2459,7 @@
int fd_os;
ap_status_t status;
#ifdef USE_MMAP_FILES
- caddr_t mm;
+ ap_mmap_t *mm = NULL;
#endif
#ifdef CHARSET_EBCDIC
/* To make serving of "raw ASCII text" files easy (they serve faster
@@ -2529,7 +2510,7 @@
return FORBIDDEN;
}
else
- ap_get_os_file(&fd_os, fd);
+ ap_get_os_file(&fd_os, fd);
ap_update_mtime(r, r->finfo.st_mtime);
ap_set_last_modified(r);
@@ -2543,22 +2524,21 @@
#ifdef USE_MMAP_FILES
if ((r->finfo.st_size >= MMAP_THRESHOLD)
- && (r->finfo.st_size < MMAP_LIMIT)
- && (!r->header_only || (d->content_md5 & 1))) {
- /* we need to protect ourselves in case we die while we've got the
- * file mmapped */
- mm = mmap(NULL, r->finfo.st_size, PROT_READ, MAP_PRIVATE,
- fd_os, 0);
- if (mm == (caddr_t)-1) {
- ap_log_rerror(APLOG_MARK, APLOG_CRIT, errno, r,
+ && (r->finfo.st_size < MMAP_LIMIT)
+ && (!r->header_only || (d->content_md5 & 1))) {
+ /* we need to protect ourselves in case we die while we've got the
+ * file mmapped */
+ if ((ap_mmap_size_create(&mm, fd, r->finfo.st_size, r->pool)) !=
APR_SUCCESS)
+ ap_log_rerror(APLOG_MARK, APLOG_CRIT, errno, r,
"default_handler: mmap failed: %s", r->filename);
- }
+ mm = NULL;
+ }
}
else {
- mm = (caddr_t)-1;
+ mm = NULL;
}
- if (mm == (caddr_t)-1) {
+ if (mm == NULL) {
#endif
#ifdef CHARSET_EBCDIC
@@ -2600,18 +2580,13 @@
#ifdef USE_MMAP_FILES
}
else {
- struct mmap_rec *mmd;
-
- mmd = ap_palloc(r->pool, sizeof(*mmd));
- mmd->mm = mm;
- mmd->length = r->finfo.st_size;
- ap_register_cleanup(r->pool, (void *)mmd, mmap_cleanup, mmap_cleanup);
-
+ char *addr;
+ ap_mmap_offset((void**)&addr, mm, 0);
if (d->content_md5 & 1) {
AP_MD5_CTX context;
ap_MD5Init(&context);
- ap_MD5Update(&context, (void *)mm, (unsigned int)r->finfo.st_size);
+ ap_MD5Update(&context, addr, (unsigned int)r->finfo.st_size);
ap_table_setn(r->headers_out, "Content-MD5",
ap_md5contextTo64(r->pool, &context));
}
Index: apache-2.0/src/main/http_protocol.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/main/http_protocol.c,v
retrieving revision 1.35
diff -u -u -r1.35 http_protocol.c
--- http_protocol.c 1999/11/03 12:47:23 1.35
+++ http_protocol.c 1999/11/04 12:50:22
@@ -2172,15 +2172,17 @@
#define MMAP_SEGMENT_SIZE 32768
#endif
+#ifdef USE_MMAP_FILES
/* send data from an in-memory buffer */
-API_EXPORT(size_t) ap_send_mmap(void *mm, request_rec *r, size_t offset,
+API_EXPORT(size_t) ap_send_mmap(ap_mmap_t *mm, request_rec *r, size_t
offset,
size_t length)
{
size_t total_bytes_sent = 0;
int n;
ap_ssize_t w;
ap_status_t rv;
-
+ char *addr;
+
if (length == 0)
return 0;
@@ -2195,7 +2197,8 @@
}
while (n && !r->connection->aborted) {
- rv = ap_bwrite(r->connection->client, (char *) mm + offset, n,
&w);
+ ap_mmap_offset((void**)&addr, mm, offset);
+ rv = ap_bwrite(r->connection->client, addr, n, &w);
if (w > 0) {
total_bytes_sent += w;
n -= w;
@@ -2220,6 +2223,7 @@
SET_BYTES_SENT(r);
return total_bytes_sent;
}
+#endif /* USE_MMAP_FILES */
API_EXPORT(int) ap_rputc(int c, request_rec *r)
{