/*
- * $Id$
+ * Copyright (C) 1996-2015 The Squid Software Foundation and contributors
*
- * DEBUG: section 47 Store Directory Routines
+ * Squid software is distributed under GPLv2+ license and includes
+ * contributions from numerous individuals and organizations.
+ * Please see the COPYING and CONTRIBUTORS files for details.
*/
+/* DEBUG: section 47 Store Directory Routines */
+
#include "squid.h"
+#include "Debug.h"
+#include "disk.h"
#include "DiskIO/IORequestor.h"
#include "DiskIO/Mmapped/MmappedFile.h"
#include "DiskIO/ReadRequest.h"
#include "DiskIO/WriteRequest.h"
+#include "globals.h"
+
+#include <cerrno>
+#if HAVE_SYS_MMAN_H
#include <sys/mman.h>
+#endif
+#if HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+
+// Some systems such as Hurd provide mmap() API but do not support MAP_NORESERVE
+#ifndef MAP_NORESERVE
+#define MAP_NORESERVE 0
+#endif
CBDATA_CLASS_INIT(MmappedFile);
void *buf; ///< buffer returned by mmap, needed for munmap
};
-
-void *
-MmappedFile::operator new(size_t sz)
-{
- CBDATA_INIT_TYPE(MmappedFile);
- MmappedFile *result = cbdataAlloc(MmappedFile);
- /* Mark result as being owned - we want the refcounter to do the delete
- * call */
- return result;
-}
-
-void
-MmappedFile::operator delete(void *address)
-{
- MmappedFile *t = static_cast<MmappedFile *>(address);
- cbdataFree(t);
-}
-
MmappedFile::MmappedFile(char const *aPath): fd(-1),
- minOffset(0), maxOffset(-1), error_(false)
+ minOffset(0), maxOffset(-1), error_(false)
{
assert(aPath);
path_ = xstrdup(aPath);
// XXX: almost a copy of BlockingFile::open
void
-MmappedFile::open(int flags, mode_t mode, RefCount<IORequestor> callback)
+MmappedFile::open(int flags, mode_t, RefCount<IORequestor> callback)
{
assert(fd < 0);
if (fd >= 0) {
file_close(fd);
fd = -1;
- store_open_disk_fd--;
+ --store_open_disk_fd;
}
}
const ssize_t written =
pwrite(fd, aRequest->buf, aRequest->len, aRequest->offset);
if (written < 0) {
- debugs(79,1, HERE << "error: " << xstrerr(errno));
+ debugs(79, DBG_IMPORTANT, HERE << "error: " << xstrerr(errno));
error_ = true;
} else if (static_cast<size_t>(written) != aRequest->len) {
- debugs(79,1, HERE << "problem: " << written << " < " << aRequest->len);
+ debugs(79, DBG_IMPORTANT, HERE << "problem: " << written << " < " << aRequest->len);
error_ = true;
}
}
Mmapping::Mmapping(int aFd, size_t aLength, int aProt, int aFlags, off_t anOffset):
- fd(aFd), length(aLength), prot(aProt), flags(aFlags), offset(anOffset),
- delta(-1), buf(NULL)
+ fd(aFd), length(aLength), prot(aProt), flags(aFlags), offset(anOffset),
+ delta(-1), buf(NULL)
{
}
}
// TODO: check MAP_NORESERVE, consider MAP_POPULATE and MAP_FIXED
+