# include <io.h>
#endif
-#if (PLATFORM_POSIX_VERSION > 0)
-# include <sys/mman.h>
-#endif
-
#include "fileio.h"
#include "fileio_asyncio.h"
#include "fileio_common.h"
return (size_t)fileSize;
}
-/*! FIO_createDictBufferMMap() :
- * creates a buffer, pointed by `*bufferPtr` using mmap,
- * loads entire `filename` content into it.
- * @return : loaded size
- * if fileName==NULL, returns 0 and a NULL pointer
- */
+#if (PLATFORM_POSIX_VERSION > 0)
+#include <sys/mman.h>
+static void* FIO_mmap(size_t fileSize, int fileHandle)
+{
+ return mmap
+ (NULL, (size_t)fileSize, PROT_READ, MAP_PRIVATE, fileHandle, 0);
+}
+static int FIO_munmap(void* buffer, size_t bufferSize)
+{
+ return munmap(buffer, bufferSize);
+}
+/* We might want to also do mapping for windows */
static size_t FIO_createDictBufferMMap(void** bufferPtr, const char* fileName, FIO_prefs_t* const prefs, stat_t* dictFileStat)
{
int fileHandle;
}
fileSize = UTIL_getFileSizeStat(dictFileStat);
-
{
size_t const dictSizeMax = prefs->patchFromMode ? prefs->memLimit : DICTSIZE_MAX;
if (fileSize > dictSizeMax) {
}
}
- *bufferPtr = mmap(NULL, (size_t)fileSize, PROT_READ, MAP_PRIVATE, fileHandle, 0);
+ *bufferPtr = FIO_mmap((size_t)fileSize, fileHandle);
close(fileHandle);
return (size_t)fileSize;
}
+static void FIO_munmapDictBuffer(void* dictBuffer, size_t dictBufferSize) {
+ FIO_munmap(dictBuffer, dictBufferSize);
+}
+#else
+static size_t FIO_createDictBufferMMap(void** bufferPtr, const char* fileName, FIO_prefs_t* const prefs, stat_t* dictFileStat)
+{
+ return FIO_createDictBuffer(bufferPtr, fileName, prefs, dictFileStat);
+}
+static void FIO_munmapDictBuffer(void* dictBuffer, size_t dictBufferSize) {
+ (void)dictBufferSize;
+ free(dictBuffer);
+}
+#endif
static cRess_t FIO_createCResources(FIO_prefs_t* const prefs,
const char* dictFileName, unsigned long long const maxSrcFileSize,
int cLevel, ZSTD_compressionParameters comprParams) {
- U64 const dictSize = UTIL_getFileSize(dictFileName);
- int const mmapDict = prefs->patchFromMode && PLATFORM_POSIX_VERSION < 1 && dictSize > prefs->memLimit;
+ int mmapDict = 0;
cRess_t ress;
memset(&ress, 0, sizeof(ress));
DISPLAYLEVEL(6, "FIO_createCResources \n");
ress.cctx = ZSTD_createCCtx();
- ress.mmapDict = mmapDict;
if (ress.cctx == NULL)
EXM_THROW(30, "allocation error (%s): can't create ZSTD_CCtx",
strerror(errno));
/* need to update memLimit before calling createDictBuffer
* because of memLimit check inside it */
if (prefs->patchFromMode) {
+ U64 const dictSize = UTIL_getFileSize(dictFileName);
unsigned long long const ssSize = (unsigned long long)prefs->streamSrcSize;
+ mmapDict = dictSize > prefs->memLimit;
FIO_adjustParamsForPatchFromMode(prefs, &comprParams, dictSize, ssSize > 0 ? ssSize : maxSrcFileSize, cLevel);
}
- if (!mmapDict) {
+ ress.mmapDict = mmapDict;
+
+ if (!ress.mmapDict) {
ress.dictBufferSize = FIO_createDictBuffer(&ress.dictBuffer, dictFileName, prefs, &ress.dictFileStat); /* works with dictFileName==NULL */
} else {
ress.dictBufferSize = FIO_createDictBufferMMap(&ress.dictBuffer, dictFileName, prefs, &ress.dictFileStat);
if (prefs->patchFromMode) {
CHECK( ZSTD_CCtx_refPrefix(ress.cctx, ress.dictBuffer, ress.dictBufferSize) );
} else {
- CHECK( ZSTD_CCtx_loadDictionary(ress.cctx, ress.dictBuffer, ress.dictBufferSize) );
+ CHECK( ZSTD_CCtx_loadDictionary_byReference(ress.cctx, ress.dictBuffer, ress.dictBufferSize) );
}
return ress;
if (!ress->mmapDict) {
free(ress->dictBuffer);
} else {
- munmap(ress->dictBuffer, ress->dictBufferSize);
+ FIO_munmapDictBuffer(ress->dictBuffer, ress->dictBufferSize);
}
AIO_WritePool_free(ress->writeCtx);
AIO_ReadPool_free(ress->readCtx);
* Decompression
***************************************************************************/
typedef struct {
+ void* dictBuffer;
+ size_t dictBufferSize;
ZSTD_DStream* dctx;
WritePoolCtx_t *writeCtx;
ReadPoolCtx_t *readCtx;
+ int mmapDict;
} dRess_t;
static dRess_t FIO_createDResources(FIO_prefs_t* const prefs, const char* dictFileName)
{
- U64 const dictSize = UTIL_getFileSize(dictFileName);
- int const mmapDict = prefs->patchFromMode && PLATFORM_POSIX_VERSION < 1 && dictSize > prefs->memLimit;
+ int mmapDict = 0;
dRess_t ress;
memset(&ress, 0, sizeof(ress));
- if (prefs->patchFromMode)
+ if (prefs->patchFromMode){
+ U64 const dictSize = UTIL_getFileSize(dictFileName);
+ mmapDict = dictSize > prefs->memLimit;
FIO_adjustMemLimitForPatchFromMode(prefs, dictSize, 0 /* just use the dict size */);
+ }
/* Allocation */
+ ress.mmapDict = mmapDict;
ress.dctx = ZSTD_createDStream();
if (ress.dctx==NULL)
EXM_THROW(60, "Error: %s : can't create ZSTD_DStream", strerror(errno));
CHECK( ZSTD_DCtx_setParameter(ress.dctx, ZSTD_d_forceIgnoreChecksum, !prefs->checksumFlag));
/* dictionary */
- { void* dictBuffer;
- stat_t statbuf;
- size_t dictBufferSize;
-
+ { stat_t statbuf;
if (!mmapDict) {
- dictBufferSize = FIO_createDictBuffer(&dictBuffer, dictFileName, prefs, &statbuf);
+ ress.dictBufferSize = FIO_createDictBuffer(&ress.dictBuffer, dictFileName, prefs, &statbuf);
} else {
- dictBufferSize = FIO_createDictBufferMMap(&dictBuffer, dictFileName, prefs, &statbuf);
+ ress.dictBufferSize = FIO_createDictBufferMMap(&ress.dictBuffer, dictFileName, prefs, &statbuf);
}
- CHECK( ZSTD_DCtx_reset(ress.dctx, ZSTD_reset_session_only) );
- CHECK( ZSTD_DCtx_loadDictionary(ress.dctx, dictBuffer, dictBufferSize) );
+ CHECK(ZSTD_DCtx_reset(ress.dctx, ZSTD_reset_session_only) );
- if (!mmapDict) {
- free(dictBuffer);
+ if (prefs->patchFromMode){
+ CHECK(ZSTD_DCtx_refPrefix(ress.dctx, ress.dictBuffer, ress.dictBufferSize));
} else {
- munmap(dictBuffer, dictBufferSize);
+ CHECK(ZSTD_DCtx_loadDictionary_byReference(ress.dctx, ress.dictBuffer, ress.dictBufferSize));
}
}
static void FIO_freeDResources(dRess_t ress)
{
+ if (!ress.mmapDict) {
+ free(ress.dictBuffer);
+ } else {
+ FIO_munmapDictBuffer(ress.dictBuffer, ress.dictBufferSize);
+ }
CHECK( ZSTD_freeDStream(ress.dctx) );
AIO_WritePool_free(ress.writeCtx);
AIO_ReadPool_free(ress.readCtx);