mirror of
https://github.com/veracrypt/VeraCrypt.git
synced 2026-05-21 21:30:48 -05:00
Windows: Update LZMA SDK to version 26.01
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/* 7zTypes.h -- Basic types
|
/* 7zTypes.h -- Basic types
|
||||||
2024-01-24 : Igor Pavlov : Public domain */
|
: Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#ifndef ZIP7_7Z_TYPES_H
|
#ifndef ZIP7_7Z_TYPES_H
|
||||||
#define ZIP7_7Z_TYPES_H
|
#define ZIP7_7Z_TYPES_H
|
||||||
@@ -46,8 +46,9 @@ typedef int SRes;
|
|||||||
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
|
#define MY_ALIGN_IN_STRUCT(n) __declspec(align(n))
|
||||||
#if _MSC_VER > 1200
|
#if _MSC_VER > 1200
|
||||||
#define MY_ALIGN(n) __declspec(align(n))
|
#define MY_ALIGN(n) MY_ALIGN_IN_STRUCT(n)
|
||||||
#else
|
#else
|
||||||
#define MY_ALIGN(n)
|
#define MY_ALIGN(n)
|
||||||
#endif
|
#endif
|
||||||
@@ -58,6 +59,7 @@ typedef int SRes;
|
|||||||
#define MY_ALIGN(n) alignas(n)
|
#define MY_ALIGN(n) alignas(n)
|
||||||
*/
|
*/
|
||||||
#define MY_ALIGN(n) __attribute__ ((aligned(n)))
|
#define MY_ALIGN(n) __attribute__ ((aligned(n)))
|
||||||
|
#define MY_ALIGN_IN_STRUCT(n) MY_ALIGN(n)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,17 @@
|
|||||||
/* 7zWindows.h -- StdAfx
|
/* 7zWindows.h -- Windows.h and related code
|
||||||
2023-04-02 : Igor Pavlov : Public domain */
|
Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#ifndef ZIP7_INC_7Z_WINDOWS_H
|
#ifndef ZIP7_INC_7Z_WINDOWS_H
|
||||||
#define ZIP7_INC_7Z_WINDOWS_H
|
#define ZIP7_INC_7Z_WINDOWS_H
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
|
#if defined(_MSC_VER) && _MSC_VER >= 1950 && !defined(__clang__) // VS2026
|
||||||
|
// <Windows.h> and some another windows files need that option
|
||||||
|
// VS2026: wtypesbase.h: warning C4865: 'tagCLSCTX': the underlying type will change from 'int' to 'unsigned int' when '/Zc:enumTypes' is specified on the command line
|
||||||
|
#pragma warning(disable : 4865)
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__clang__)
|
#if defined(__clang__)
|
||||||
# pragma clang diagnostic push
|
# pragma clang diagnostic push
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+208
-39
@@ -1,5 +1,5 @@
|
|||||||
/* Alloc.c -- Memory allocation functions
|
/* Alloc.c -- Memory allocation functions
|
||||||
2024-02-18 : Igor Pavlov : Public domain */
|
: Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#include "Precomp.h"
|
#include "Precomp.h"
|
||||||
|
|
||||||
@@ -24,8 +24,6 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// #define SZ_ALLOC_DEBUG
|
// #define SZ_ALLOC_DEBUG
|
||||||
/* #define SZ_ALLOC_DEBUG */
|
|
||||||
|
|
||||||
/* use SZ_ALLOC_DEBUG to debug alloc/free operations */
|
/* use SZ_ALLOC_DEBUG to debug alloc/free operations */
|
||||||
#ifdef SZ_ALLOC_DEBUG
|
#ifdef SZ_ALLOC_DEBUG
|
||||||
|
|
||||||
@@ -34,9 +32,10 @@
|
|||||||
static int g_allocCount = 0;
|
static int g_allocCount = 0;
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
static int g_allocCountMid = 0;
|
static int g_allocCountMid = 0;
|
||||||
|
#ifdef Z7_LARGE_PAGES
|
||||||
static int g_allocCountBig = 0;
|
static int g_allocCountBig = 0;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#define CONVERT_INT_TO_STR(charType, tempSize) \
|
#define CONVERT_INT_TO_STR(charType, tempSize) \
|
||||||
char temp[tempSize]; unsigned i = 0; \
|
char temp[tempSize]; unsigned i = 0; \
|
||||||
@@ -140,8 +139,10 @@ static void PrintAddr(void *p)
|
|||||||
#else
|
#else
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
#ifdef Z7_LARGE_PAGES
|
||||||
#define PRINT_ALLOC(name, cnt, size, ptr)
|
#define PRINT_ALLOC(name, cnt, size, ptr)
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
#define PRINT_FREE(name, cnt, ptr)
|
#define PRINT_FREE(name, cnt, ptr)
|
||||||
#define Print(s)
|
#define Print(s)
|
||||||
#define PrintLn()
|
#define PrintLn()
|
||||||
@@ -245,6 +246,7 @@ void MidFree(void *address)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef Z7_LARGE_PAGES
|
#ifdef Z7_LARGE_PAGES
|
||||||
|
// #pragma message("Z7_LARGE_PAGES")
|
||||||
|
|
||||||
#ifdef MEM_LARGE_PAGES
|
#ifdef MEM_LARGE_PAGES
|
||||||
#define MY_MEM_LARGE_PAGES MEM_LARGE_PAGES
|
#define MY_MEM_LARGE_PAGES MEM_LARGE_PAGES
|
||||||
@@ -253,32 +255,14 @@ void MidFree(void *address)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern
|
extern
|
||||||
SIZE_T g_LargePageSize;
|
size_t g_LargePageSize;
|
||||||
SIZE_T g_LargePageSize = 0;
|
size_t g_LargePageSize = 0;
|
||||||
typedef SIZE_T (WINAPI *Func_GetLargePageMinimum)(VOID);
|
extern
|
||||||
|
size_t g_LargePageThresholdMin;
|
||||||
void SetLargePageSize(void)
|
size_t g_LargePageThresholdMin = 0;
|
||||||
{
|
extern
|
||||||
SIZE_T size;
|
UInt32 g_LargePageFlags;
|
||||||
#ifdef Z7_USE_DYN_GetLargePageMinimum
|
UInt32 g_LargePageFlags = 0;
|
||||||
Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION
|
|
||||||
|
|
||||||
const
|
|
||||||
Func_GetLargePageMinimum fn =
|
|
||||||
(Func_GetLargePageMinimum) Z7_CAST_FUNC_C GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),
|
|
||||||
"GetLargePageMinimum");
|
|
||||||
if (!fn)
|
|
||||||
return;
|
|
||||||
size = fn();
|
|
||||||
#else
|
|
||||||
size = GetLargePageMinimum();
|
|
||||||
#endif
|
|
||||||
if (size == 0 || (size & (size - 1)) != 0)
|
|
||||||
return;
|
|
||||||
g_LargePageSize = size;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // Z7_LARGE_PAGES
|
|
||||||
|
|
||||||
void *BigAlloc(size_t size)
|
void *BigAlloc(size_t size)
|
||||||
{
|
{
|
||||||
@@ -289,12 +273,10 @@ void *BigAlloc(size_t size)
|
|||||||
|
|
||||||
#ifdef Z7_LARGE_PAGES
|
#ifdef Z7_LARGE_PAGES
|
||||||
{
|
{
|
||||||
SIZE_T ps = g_LargePageSize;
|
const size_t ps = g_LargePageSize - 1;
|
||||||
if (ps != 0 && ps <= (1 << 30) && size > (ps / 2))
|
if (ps < (1u << 30) && size > g_LargePageThresholdMin)
|
||||||
{
|
{
|
||||||
size_t size2;
|
const size_t size2 = (size + ps) & ~ps;
|
||||||
ps--;
|
|
||||||
size2 = (size + ps) & ~ps;
|
|
||||||
if (size2 >= size)
|
if (size2 >= size)
|
||||||
{
|
{
|
||||||
void *p = VirtualAlloc(NULL, size2, MEM_COMMIT | MY_MEM_LARGE_PAGES, PAGE_READWRITE);
|
void *p = VirtualAlloc(NULL, size2, MEM_COMMIT | MY_MEM_LARGE_PAGES, PAGE_READWRITE);
|
||||||
@@ -303,6 +285,8 @@ void *BigAlloc(size_t size)
|
|||||||
PRINT_ALLOC("Alloc-BM ", g_allocCountMid, size2, p)
|
PRINT_ALLOC("Alloc-BM ", g_allocCountMid, size2, p)
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
if (g_LargePageFlags & Z7_LARGE_PAGES_FLAG_FAIL_STOP)
|
||||||
|
return p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -317,6 +301,7 @@ void BigFree(void *address)
|
|||||||
MidFree(address);
|
MidFree(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif // Z7_LARGE_PAGES
|
||||||
#endif // _WIN32
|
#endif // _WIN32
|
||||||
|
|
||||||
|
|
||||||
@@ -327,9 +312,12 @@ const ISzAlloc g_Alloc = { SzAlloc, SzFree };
|
|||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
static void *SzMidAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p) return MidAlloc(size); }
|
static void *SzMidAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p) return MidAlloc(size); }
|
||||||
static void SzMidFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p) MidFree(address); }
|
static void SzMidFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p) MidFree(address); }
|
||||||
|
const ISzAlloc g_MidAlloc = { SzMidAlloc, SzMidFree };
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(Z7_LARGE_PAGES)
|
||||||
static void *SzBigAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p) return BigAlloc(size); }
|
static void *SzBigAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p) return BigAlloc(size); }
|
||||||
static void SzBigFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p) BigFree(address); }
|
static void SzBigFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p) BigFree(address); }
|
||||||
const ISzAlloc g_MidAlloc = { SzMidAlloc, SzMidFree };
|
|
||||||
const ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree };
|
const ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree };
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -371,10 +359,16 @@ typedef
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(_WIN32) \
|
#ifndef _WIN32
|
||||||
&& (defined(Z7_ALLOC_NO_OFFSET_ALLOCATOR) \
|
#include <unistd.h> // for _POSIX_ADVISORY_INFO : for some linux
|
||||||
|| defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L))
|
#if (defined(Z7_ALLOC_NO_OFFSET_ALLOCATOR) \
|
||||||
|
|| defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L) \
|
||||||
|
|| defined(_POSIX_ADVISORY_INFO) && (_POSIX_ADVISORY_INFO >= 200112L) \
|
||||||
|
|| defined(__APPLE__) \
|
||||||
|
/* || defined(__linux__) */)
|
||||||
#define USE_posix_memalign
|
#define USE_posix_memalign
|
||||||
|
// #pragma message("USE_posix_memalign")
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef USE_posix_memalign
|
#ifndef USE_posix_memalign
|
||||||
@@ -488,6 +482,181 @@ static void SzAlignedFree(ISzAllocPtr pp, void *address)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
|
|
||||||
|
#ifdef Z7_LARGE_PAGES
|
||||||
|
|
||||||
|
#if 0 // 1 for debug
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h> // for strerror()
|
||||||
|
#define PRF(x) x
|
||||||
|
#else
|
||||||
|
#define PRF(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_posix_memalign
|
||||||
|
/* madvise():
|
||||||
|
glibc <= 2.19 : _BSD_SOURCE
|
||||||
|
glibc > 2.19 : _DEFAULT_SOURCE
|
||||||
|
*/
|
||||||
|
/* && (defined(_DEFAULT_SOURCE) || defined(_BSD_SOURCE)) */
|
||||||
|
#if 1 && !defined(Z7_NO_MADVISE) && \
|
||||||
|
(defined(__linux__) || defined(__unix__) || defined(__APPLE__))
|
||||||
|
#include <sys/mman.h> // for madvise
|
||||||
|
// #pragma message("sys/mman.h")
|
||||||
|
#if (defined(MADV_HUGEPAGE) && defined(MADV_NOHUGEPAGE))
|
||||||
|
#define Z7_USE_BIG_ALLOC_MADVISE
|
||||||
|
// #pragma message("Z7_USE_BIG_ALLOC_MADVISE")
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif // USE_posix_memalign
|
||||||
|
|
||||||
|
#ifdef Z7_USE_BIG_ALLOC_MADVISE
|
||||||
|
#define LARGE_PAGE_SIZE_DEFAULT (1 << 21)
|
||||||
|
#else
|
||||||
|
#define LARGE_PAGE_SIZE_DEFAULT 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern
|
||||||
|
size_t g_LargePageSize;
|
||||||
|
size_t g_LargePageSize = LARGE_PAGE_SIZE_DEFAULT;
|
||||||
|
extern
|
||||||
|
size_t g_LargePageThresholdMin;
|
||||||
|
size_t g_LargePageThresholdMin = LARGE_PAGE_SIZE_DEFAULT / 2;
|
||||||
|
extern
|
||||||
|
UInt32 g_LargePageFlags;
|
||||||
|
UInt32 g_LargePageFlags = 0;
|
||||||
|
|
||||||
|
void *BigAlloc(size_t size)
|
||||||
|
{
|
||||||
|
if (size == 0)
|
||||||
|
return NULL;
|
||||||
|
#ifdef USE_posix_memalign
|
||||||
|
{
|
||||||
|
const size_t pageSize = g_LargePageSize;
|
||||||
|
void *buf = NULL; // on Linux (and other systems), posix_memalign() does not modify memptr on failure (POSIX.1-2008 TC2).
|
||||||
|
PRF(printf("\nBigAlloc 0x%08x=%5uMB", (unsigned)(size), (unsigned)(size >> 20));)
|
||||||
|
if (pageSize && size > g_LargePageThresholdMin)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
const size_t mask = pageSize - 1;
|
||||||
|
/* we can allocate aligned size, so data at the end of buffer also will use huge page
|
||||||
|
if (size2 for madvise() is not aligned for huge page size)
|
||||||
|
{ Last data block will use small pages. It reduces memory allocation,
|
||||||
|
but last data block with small pages can work slower.
|
||||||
|
It's useful, if we have very large HUGE_PAGE: 32MB or 512MB. }
|
||||||
|
*/
|
||||||
|
size_t size2 = (size + mask) & ~mask;
|
||||||
|
if (size2 < size || (size & mask) <= g_LargePageThresholdMin)
|
||||||
|
size2 = size;
|
||||||
|
res = posix_memalign(&buf, pageSize, size2);
|
||||||
|
PRF(printf(" posix_memalign size=0x%08x=%5uMB align=%u",
|
||||||
|
(unsigned)(size2), (unsigned)(size2 >> 20), (unsigned)pageSize);)
|
||||||
|
PRF(printf(" buf=%p", (void *)buf);)
|
||||||
|
if (res == 0)
|
||||||
|
{
|
||||||
|
#ifdef Z7_USE_BIG_ALLOC_MADVISE
|
||||||
|
if ((g_LargePageFlags & Z7_LARGE_PAGES_FLAG_NO_MADVISE) == 0)
|
||||||
|
{
|
||||||
|
// Advise the kernel to use huge pages for this memory range
|
||||||
|
// MADV_HUGEPAGE / MADV_NOHUGEPAGE : since Linux 2.6.38
|
||||||
|
// madvise() only operates on whole pages, therefore addr must be page-aligned (4KB/8KB/16KB/64KB).
|
||||||
|
// The value of size is rounded up to a multiple of page size.
|
||||||
|
PRF(printf(" madvise g_LargePageFlags=%x", (unsigned)g_LargePageFlags);)
|
||||||
|
res = madvise(buf, size2, (g_LargePageFlags & Z7_LARGE_PAGES_FLAG_NO_HUGEPAGE) ? MADV_NOHUGEPAGE : MADV_HUGEPAGE);
|
||||||
|
if (res)
|
||||||
|
{
|
||||||
|
PRF(printf("\nERROR res=%d, errno=%d=%s\n", res, (int)errno, strerror(errno));)
|
||||||
|
if (g_LargePageFlags & Z7_LARGE_PAGES_FLAG_FAIL_STOP)
|
||||||
|
{
|
||||||
|
free(buf);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif // Z7_USE_BIG_ALLOC_MADVISE
|
||||||
|
PRF(printf("\n");)
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
PRF(printf("\nERROR res=%d=%s\n", res, strerror(res));)
|
||||||
|
if (g_LargePageFlags & Z7_LARGE_PAGES_FLAG_FAIL_STOP)
|
||||||
|
return NULL;
|
||||||
|
// (res == ENOMEM) "Out of memory" is possible, if pageSize is too big.
|
||||||
|
// so we do second attempt with smaller alignment
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif // !USE_posix_memalign
|
||||||
|
PRF(printf(" z7_AlignedAlloc size=0x%08x=%5uMB\n", (unsigned)(size), (unsigned)(size >> 20));)
|
||||||
|
return z7_AlignedAlloc(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BigFree(void *address)
|
||||||
|
{
|
||||||
|
z7_AlignedFree(address);
|
||||||
|
}
|
||||||
|
#endif // Z7_LARGE_PAGES
|
||||||
|
#endif // !_WIN32
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef Z7_LARGE_PAGES
|
||||||
|
void z7_LargePage_Set(UInt32 flags, size_t pageSize, size_t threshold)
|
||||||
|
{
|
||||||
|
g_LargePageFlags = flags;
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
if ((flags & Z7_LARGE_PAGES_FLAG_USE_HUGEPAGE) == 0)
|
||||||
|
{
|
||||||
|
g_LargePageSize = 0;
|
||||||
|
g_LargePageThresholdMin = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ((flags & Z7_LARGE_PAGES_FLAG_DIRECT_PAGE_SIZE) == 0)
|
||||||
|
{
|
||||||
|
#ifdef Z7_USE_DYN_GetLargePageMinimum
|
||||||
|
Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION
|
||||||
|
typedef SIZE_T (WINAPI *Func_GetLargePageMinimum)(VOID);
|
||||||
|
const
|
||||||
|
Func_GetLargePageMinimum fn =
|
||||||
|
(Func_GetLargePageMinimum) Z7_CAST_FUNC_C GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),
|
||||||
|
"GetLargePageMinimum");
|
||||||
|
if (fn)
|
||||||
|
pageSize = fn();
|
||||||
|
else
|
||||||
|
pageSize = 0;
|
||||||
|
#else
|
||||||
|
pageSize = GetLargePageMinimum();
|
||||||
|
#endif
|
||||||
|
if (pageSize & (pageSize - 1))
|
||||||
|
pageSize = 0;
|
||||||
|
}
|
||||||
|
g_LargePageSize = pageSize;
|
||||||
|
if ((flags & Z7_LARGE_PAGES_FLAG_DIRECT_THRESHOLD) == 0)
|
||||||
|
threshold = pageSize / 2;
|
||||||
|
g_LargePageThresholdMin = threshold;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else // !_WIN32
|
||||||
|
|
||||||
|
if (flags & Z7_LARGE_PAGES_FLAG_NO_PAGECODE)
|
||||||
|
{
|
||||||
|
g_LargePageSize = 0;
|
||||||
|
g_LargePageThresholdMin = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ((flags & Z7_LARGE_PAGES_FLAG_DIRECT_PAGE_SIZE) == 0)
|
||||||
|
pageSize = LARGE_PAGE_SIZE_DEFAULT;
|
||||||
|
g_LargePageSize = pageSize;
|
||||||
|
if ((flags & Z7_LARGE_PAGES_FLAG_DIRECT_THRESHOLD) == 0)
|
||||||
|
threshold = pageSize / 2;
|
||||||
|
g_LargePageThresholdMin = threshold;
|
||||||
|
}
|
||||||
|
// PRF(printf("\ng_LargePageSize=%x g_LargePageThresholdMin = %x g_LargePageFlags = %x", (unsigned)g_LargePageSize, (unsigned)g_LargePageThresholdMin, (unsigned)g_LargePageFlags);)
|
||||||
|
#endif // !_WIN32
|
||||||
|
}
|
||||||
|
#endif // Z7_LARGE_PAGES
|
||||||
|
|
||||||
const ISzAlloc g_AlignedAlloc = { SzAlignedAlloc, SzAlignedFree };
|
const ISzAlloc g_AlignedAlloc = { SzAlignedAlloc, SzAlignedFree };
|
||||||
|
|
||||||
|
|||||||
+26
-26
@@ -1,5 +1,5 @@
|
|||||||
/* Alloc.h -- Memory allocation functions
|
/* Alloc.h -- Memory allocation functions
|
||||||
2024-01-22 : Igor Pavlov : Public domain */
|
: Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#ifndef ZIP7_INC_ALLOC_H
|
#ifndef ZIP7_INC_ALLOC_H
|
||||||
#define ZIP7_INC_ALLOC_H
|
#define ZIP7_INC_ALLOC_H
|
||||||
@@ -25,40 +25,40 @@ void *MyRealloc(void *address, size_t size);
|
|||||||
void *z7_AlignedAlloc(size_t size);
|
void *z7_AlignedAlloc(size_t size);
|
||||||
void z7_AlignedFree(void *p);
|
void z7_AlignedFree(void *p);
|
||||||
|
|
||||||
|
extern const ISzAlloc g_Alloc;
|
||||||
|
extern const ISzAlloc g_AlignedAlloc;
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
void *MidAlloc(size_t size);
|
||||||
|
void MidFree(void *address);
|
||||||
|
extern const ISzAlloc g_MidAlloc;
|
||||||
|
#else
|
||||||
|
#define MidAlloc(size) z7_AlignedAlloc(size)
|
||||||
|
#define MidFree(address) z7_AlignedFree(address)
|
||||||
|
#define g_MidAlloc g_AlignedAlloc
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef Z7_LARGE_PAGES
|
#ifdef Z7_LARGE_PAGES
|
||||||
void SetLargePageSize(void);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void *MidAlloc(size_t size);
|
#define Z7_LARGE_PAGES_FLAG_USE_HUGEPAGE (1 << 0) // PAGE_ALIGNED / MADV_HUGEPAGE
|
||||||
void MidFree(void *address);
|
#define Z7_LARGE_PAGES_FLAG_NO_PAGECODE (1 << 1) // no PAGE_ALIGNED / no madvise
|
||||||
void *BigAlloc(size_t size);
|
#define Z7_LARGE_PAGES_FLAG_NO_MADVISE (1 << 2) // PAGE_ALIGNED / no madvise : for THP=always
|
||||||
void BigFree(void *address);
|
#define Z7_LARGE_PAGES_FLAG_NO_HUGEPAGE (1 << 3) // PAGE_ALIGNED / MADV_NOHUGEPAGE
|
||||||
|
#define Z7_LARGE_PAGES_FLAG_FAIL_STOP (1 << 15) // for benchmarks
|
||||||
|
#define Z7_LARGE_PAGES_FLAG_DIRECT_PAGE_SIZE (1 << 16)
|
||||||
|
#define Z7_LARGE_PAGES_FLAG_DIRECT_THRESHOLD (1 << 17)
|
||||||
|
|
||||||
/* #define Z7_BIG_ALLOC_IS_ZERO_FILLED */
|
void z7_LargePage_Set(UInt32 flags, size_t pageSize, size_t threshold);
|
||||||
|
|
||||||
|
void *BigAlloc(size_t size);
|
||||||
|
void BigFree(void *address);
|
||||||
|
extern const ISzAlloc g_BigAlloc;
|
||||||
#else
|
#else
|
||||||
|
#define BigAlloc(size) MidAlloc(size)
|
||||||
#define MidAlloc(size) z7_AlignedAlloc(size)
|
#define BigFree(address) MidFree(address)
|
||||||
#define MidFree(address) z7_AlignedFree(address)
|
#define g_BigAlloc g_MidAlloc
|
||||||
#define BigAlloc(size) z7_AlignedAlloc(size)
|
|
||||||
#define BigFree(address) z7_AlignedFree(address)
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern const ISzAlloc g_Alloc;
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
extern const ISzAlloc g_BigAlloc;
|
|
||||||
extern const ISzAlloc g_MidAlloc;
|
|
||||||
#else
|
|
||||||
#define g_BigAlloc g_AlignedAlloc
|
|
||||||
#define g_MidAlloc g_AlignedAlloc
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern const ISzAlloc g_AlignedAlloc;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/* Compiler.h : Compiler specific defines and pragmas
|
/* Compiler.h : Compiler specific defines and pragmas
|
||||||
2024-01-22 : Igor Pavlov : Public domain */
|
: Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#ifndef ZIP7_INC_COMPILER_H
|
#ifndef ZIP7_INC_COMPILER_H
|
||||||
#define ZIP7_INC_COMPILER_H
|
#define ZIP7_INC_COMPILER_H
|
||||||
@@ -54,6 +54,12 @@
|
|||||||
#pragma GCC diagnostic ignored "-Wexcess-padding"
|
#pragma GCC diagnostic ignored "-Wexcess-padding"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(Z7_APPLE_CLANG_VERSION) && __clang_major__ >= 21
|
||||||
|
// warning: function MyAlloc might be an allocator wrapper
|
||||||
|
// clang in xcode: clang 21.0.0
|
||||||
|
#pragma GCC diagnostic ignored "-Wallocator-wrappers"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if __clang_major__ >= 16
|
#if __clang_major__ >= 16
|
||||||
#pragma GCC diagnostic ignored "-Wunsafe-buffer-usage"
|
#pragma GCC diagnostic ignored "-Wunsafe-buffer-usage"
|
||||||
#endif
|
#endif
|
||||||
@@ -72,7 +78,7 @@
|
|||||||
|
|
||||||
#endif // __clang__
|
#endif // __clang__
|
||||||
|
|
||||||
#if defined(_WIN32) && defined(__clang__) && __clang_major__ >= 16
|
#if defined(__clang__) && __clang_major__ >= 16
|
||||||
// #pragma GCC diagnostic ignored "-Wcast-function-type-strict"
|
// #pragma GCC diagnostic ignored "-Wcast-function-type-strict"
|
||||||
#define Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION \
|
#define Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION \
|
||||||
_Pragma("GCC diagnostic ignored \"-Wcast-function-type-strict\"")
|
_Pragma("GCC diagnostic ignored \"-Wcast-function-type-strict\"")
|
||||||
@@ -183,6 +189,16 @@ typedef void (*Z7_void_Function)(void);
|
|||||||
#define Z7_ATTRIB_NO_VECTORIZE
|
#define Z7_ATTRIB_NO_VECTORIZE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(Z7_MSC_VER_ORIGINAL) && (Z7_MSC_VER_ORIGINAL >= 1920)
|
||||||
|
#define Z7_PRAGMA_OPTIMIZE_FOR_CODE_SIZE _Pragma("optimize ( \"s\", on )")
|
||||||
|
#define Z7_PRAGMA_OPTIMIZE_DEFAULT _Pragma("optimize ( \"\", on )")
|
||||||
|
#else
|
||||||
|
#define Z7_PRAGMA_OPTIMIZE_FOR_CODE_SIZE
|
||||||
|
#define Z7_PRAGMA_OPTIMIZE_DEFAULT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(MY_CPU_X86_OR_AMD64) && ( \
|
#if defined(MY_CPU_X86_OR_AMD64) && ( \
|
||||||
defined(__clang__) && (__clang_major__ >= 4) \
|
defined(__clang__) && (__clang_major__ >= 4) \
|
||||||
|| defined(__GNUC__) && (__GNUC__ >= 5))
|
|| defined(__GNUC__) && (__GNUC__ >= 5))
|
||||||
|
|||||||
@@ -859,7 +859,7 @@ BoolInt CPU_IsSupported_AES (void) { return APPLE_CRYPTO_SUPPORT_VAL; }
|
|||||||
|
|
||||||
#if defined(__GLIBC__) && (__GLIBC__ * 100 + __GLIBC_MINOR__ >= 216)
|
#if defined(__GLIBC__) && (__GLIBC__ * 100 + __GLIBC_MINOR__ >= 216)
|
||||||
#define Z7_GETAUXV_AVAILABLE
|
#define Z7_GETAUXV_AVAILABLE
|
||||||
#else
|
#elif !defined(__QNXNTO__)
|
||||||
// #pragma message("=== is not NEW GLIBC === ")
|
// #pragma message("=== is not NEW GLIBC === ")
|
||||||
#if defined __has_include
|
#if defined __has_include
|
||||||
#if __has_include (<sys/auxv.h>)
|
#if __has_include (<sys/auxv.h>)
|
||||||
@@ -877,7 +877,7 @@ BoolInt CPU_IsSupported_AES (void) { return APPLE_CRYPTO_SUPPORT_VAL; }
|
|||||||
|
|
||||||
#ifdef USE_HWCAP
|
#ifdef USE_HWCAP
|
||||||
|
|
||||||
#if defined(__FreeBSD__)
|
#if defined(__FreeBSD__) || defined(__OpenBSD__)
|
||||||
static unsigned long MY_getauxval(int aux)
|
static unsigned long MY_getauxval(int aux)
|
||||||
{
|
{
|
||||||
unsigned long val;
|
unsigned long val;
|
||||||
|
|||||||
@@ -31,7 +31,12 @@ MY_CPU_64BIT means that processor can work with 64-bit registers.
|
|||||||
#define MY_CPU_NAME "x32"
|
#define MY_CPU_NAME "x32"
|
||||||
#define MY_CPU_SIZEOF_POINTER 4
|
#define MY_CPU_SIZEOF_POINTER 4
|
||||||
#else
|
#else
|
||||||
#define MY_CPU_NAME "x64"
|
#if defined(__APX_EGPR__) || defined(__EGPR__)
|
||||||
|
#define MY_CPU_NAME "x64-apx"
|
||||||
|
#define MY_CPU_AMD64_APX
|
||||||
|
#else
|
||||||
|
#define MY_CPU_NAME "x64"
|
||||||
|
#endif
|
||||||
#define MY_CPU_SIZEOF_POINTER 8
|
#define MY_CPU_SIZEOF_POINTER 8
|
||||||
#endif
|
#endif
|
||||||
#define MY_CPU_64BIT
|
#define MY_CPU_64BIT
|
||||||
@@ -47,6 +52,12 @@ MY_CPU_64BIT means that processor can work with 64-bit registers.
|
|||||||
#define MY_CPU_SIZEOF_POINTER 4
|
#define MY_CPU_SIZEOF_POINTER 4
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(__SSE2__) \
|
||||||
|
|| defined(MY_CPU_AMD64) \
|
||||||
|
|| defined(_M_IX86_FP) && (_M_IX86_FP >= 2)
|
||||||
|
#define MY_CPU_SSE2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if defined(_M_ARM64) \
|
#if defined(_M_ARM64) \
|
||||||
|| defined(_M_ARM64EC) \
|
|| defined(_M_ARM64EC) \
|
||||||
@@ -243,11 +254,12 @@ MY_CPU_64BIT means that processor can work with 64-bit registers.
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// _LITTLE_ENDIAN macro can be defined for big-endian platform with some compilers
|
||||||
|
|
||||||
#if defined(MY_CPU_X86_OR_AMD64) \
|
#if defined(MY_CPU_X86_OR_AMD64) \
|
||||||
|| defined(MY_CPU_ARM_LE) \
|
|| defined(MY_CPU_ARM_LE) \
|
||||||
|| defined(MY_CPU_ARM64_LE) \
|
|| defined(MY_CPU_ARM64_LE) \
|
||||||
|| defined(MY_CPU_IA64_LE) \
|
|| defined(MY_CPU_IA64_LE) \
|
||||||
|| defined(_LITTLE_ENDIAN) \
|
|
||||||
|| defined(__LITTLE_ENDIAN__) \
|
|| defined(__LITTLE_ENDIAN__) \
|
||||||
|| defined(__ARMEL__) \
|
|| defined(__ARMEL__) \
|
||||||
|| defined(__THUMBEL__) \
|
|| defined(__THUMBEL__) \
|
||||||
@@ -571,10 +583,12 @@ problem-4 : performace:
|
|||||||
#define Z7_CONV_BE_TO_NATIVE_CONST32(v) (v)
|
#define Z7_CONV_BE_TO_NATIVE_CONST32(v) (v)
|
||||||
#define Z7_CONV_LE_TO_NATIVE_CONST32(v) Z7_BSWAP32_CONST(v)
|
#define Z7_CONV_LE_TO_NATIVE_CONST32(v) Z7_BSWAP32_CONST(v)
|
||||||
#define Z7_CONV_NATIVE_TO_BE_32(v) (v)
|
#define Z7_CONV_NATIVE_TO_BE_32(v) (v)
|
||||||
|
// #define Z7_GET_NATIVE16_FROM_2_BYTES(b0, b1) ((b1) | ((b0) << 8))
|
||||||
#elif defined(MY_CPU_LE)
|
#elif defined(MY_CPU_LE)
|
||||||
#define Z7_CONV_BE_TO_NATIVE_CONST32(v) Z7_BSWAP32_CONST(v)
|
#define Z7_CONV_BE_TO_NATIVE_CONST32(v) Z7_BSWAP32_CONST(v)
|
||||||
#define Z7_CONV_LE_TO_NATIVE_CONST32(v) (v)
|
#define Z7_CONV_LE_TO_NATIVE_CONST32(v) (v)
|
||||||
#define Z7_CONV_NATIVE_TO_BE_32(v) Z7_BSWAP32(v)
|
#define Z7_CONV_NATIVE_TO_BE_32(v) Z7_BSWAP32(v)
|
||||||
|
// #define Z7_GET_NATIVE16_FROM_2_BYTES(b0, b1) ((b0) | ((b1) << 8))
|
||||||
#else
|
#else
|
||||||
#error Stop_Compiling_Unknown_Endian_CONV
|
#error Stop_Compiling_Unknown_Endian_CONV
|
||||||
#endif
|
#endif
|
||||||
@@ -588,8 +602,20 @@ problem-4 : performace:
|
|||||||
#define SetBe32a(p, v) { *(UInt32 *)(void *)(p) = (v); }
|
#define SetBe32a(p, v) { *(UInt32 *)(void *)(p) = (v); }
|
||||||
#define SetBe16a(p, v) { *(UInt16 *)(void *)(p) = (v); }
|
#define SetBe16a(p, v) { *(UInt16 *)(void *)(p) = (v); }
|
||||||
|
|
||||||
|
// gcc and clang for powerpc can transform load byte access to load reverse word access.
|
||||||
|
// sp we can use byte access instead of word access. Z7_BSWAP64 cab be slow
|
||||||
|
#if 1 && defined(Z7_CPU_FAST_BSWAP_SUPPORTED) && defined(MY_CPU_64BIT)
|
||||||
|
#define GetUi64a(p) Z7_BSWAP64 (*(const UInt64 *)(const void *)(p))
|
||||||
|
#else
|
||||||
#define GetUi64a(p) GetUi64(p)
|
#define GetUi64a(p) GetUi64(p)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if 1 && defined(Z7_CPU_FAST_BSWAP_SUPPORTED)
|
||||||
|
#define GetUi32a(p) Z7_BSWAP32 (*(const UInt32 *)(const void *)(p))
|
||||||
|
#else
|
||||||
#define GetUi32a(p) GetUi32(p)
|
#define GetUi32a(p) GetUi32(p)
|
||||||
|
#endif
|
||||||
|
|
||||||
#define GetUi16a(p) GetUi16(p)
|
#define GetUi16a(p) GetUi16(p)
|
||||||
#define SetUi32a(p, v) SetUi32(p, v)
|
#define SetUi32a(p, v) SetUi32(p, v)
|
||||||
#define SetUi16a(p, v) SetUi16(p, v)
|
#define SetUi16a(p, v) SetUi16(p, v)
|
||||||
|
|||||||
+13
-13
@@ -1,5 +1,5 @@
|
|||||||
/* LzFind.c -- Match finder for LZ algorithms
|
/* LzFind.c -- Match finder for LZ algorithms
|
||||||
2024-03-01 : Igor Pavlov : Public domain */
|
: Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#include "Precomp.h"
|
#include "Precomp.h"
|
||||||
|
|
||||||
@@ -404,7 +404,7 @@ int MatchFinder_Create(CMatchFinder *p, UInt32 historySize,
|
|||||||
const unsigned nbMax =
|
const unsigned nbMax =
|
||||||
(p->numHashBytes == 2 ? 16 :
|
(p->numHashBytes == 2 ? 16 :
|
||||||
(p->numHashBytes == 3 ? 24 : 32));
|
(p->numHashBytes == 3 ? 24 : 32));
|
||||||
if (numBits > nbMax)
|
if (numBits >= nbMax)
|
||||||
numBits = nbMax;
|
numBits = nbMax;
|
||||||
if (numBits >= 32)
|
if (numBits >= 32)
|
||||||
hs = (UInt32)0 - 1;
|
hs = (UInt32)0 - 1;
|
||||||
@@ -416,14 +416,14 @@ int MatchFinder_Create(CMatchFinder *p, UInt32 historySize,
|
|||||||
hs |= (256 << kLzHash_CrcShift_2) - 1;
|
hs |= (256 << kLzHash_CrcShift_2) - 1;
|
||||||
{
|
{
|
||||||
const UInt32 hs2 = MatchFinder_GetHashMask2(p, historySize);
|
const UInt32 hs2 = MatchFinder_GetHashMask2(p, historySize);
|
||||||
if (hs > hs2)
|
if (hs >= hs2)
|
||||||
hs = hs2;
|
hs = hs2;
|
||||||
}
|
}
|
||||||
hsCur = hs;
|
hsCur = hs;
|
||||||
if (p->expectedDataSize < historySize)
|
if (p->expectedDataSize < historySize)
|
||||||
{
|
{
|
||||||
const UInt32 hs2 = MatchFinder_GetHashMask2(p, (UInt32)p->expectedDataSize);
|
const UInt32 hs2 = MatchFinder_GetHashMask2(p, (UInt32)p->expectedDataSize);
|
||||||
if (hsCur > hs2)
|
if (hsCur >= hs2)
|
||||||
hsCur = hs2;
|
hsCur = hs2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -434,7 +434,7 @@ int MatchFinder_Create(CMatchFinder *p, UInt32 historySize,
|
|||||||
if (p->expectedDataSize < historySize)
|
if (p->expectedDataSize < historySize)
|
||||||
{
|
{
|
||||||
hsCur = MatchFinder_GetHashMask(p, (UInt32)p->expectedDataSize);
|
hsCur = MatchFinder_GetHashMask(p, (UInt32)p->expectedDataSize);
|
||||||
if (hsCur > hs) // is it possible?
|
if (hsCur >= hs) // is it possible?
|
||||||
hsCur = hs;
|
hsCur = hs;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -598,7 +598,7 @@ void MatchFinder_Init(void *_p)
|
|||||||
|
|
||||||
#ifdef MY_CPU_X86_OR_AMD64
|
#ifdef MY_CPU_X86_OR_AMD64
|
||||||
#if defined(__clang__) && (__clang_major__ >= 4) \
|
#if defined(__clang__) && (__clang_major__ >= 4) \
|
||||||
|| defined(Z7_GCC_VERSION) && (Z7_GCC_VERSION >= 40701)
|
|| defined(Z7_GCC_VERSION) && (Z7_GCC_VERSION >= 40900)
|
||||||
// || defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1900)
|
// || defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1900)
|
||||||
|
|
||||||
#define USE_LZFIND_SATUR_SUB_128
|
#define USE_LZFIND_SATUR_SUB_128
|
||||||
@@ -890,7 +890,7 @@ static UInt32 * Hc_GetMatchesSpec(size_t lenLimit, UInt32 curMatch, UInt32 pos,
|
|||||||
return d;
|
return d;
|
||||||
{
|
{
|
||||||
const Byte *pb = cur - delta;
|
const Byte *pb = cur - delta;
|
||||||
curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)];
|
curMatch = son[_cyclicBufferPos - delta + (_cyclicBufferPos < delta ? _cyclicBufferSize : 0)];
|
||||||
if (pb[maxLen] == cur[maxLen] && *pb == *cur)
|
if (pb[maxLen] == cur[maxLen] && *pb == *cur)
|
||||||
{
|
{
|
||||||
UInt32 len = 0;
|
UInt32 len = 0;
|
||||||
@@ -925,7 +925,7 @@ static UInt32 * Hc_GetMatchesSpec(size_t lenLimit, UInt32 curMatch, UInt32 pos,
|
|||||||
break;
|
break;
|
||||||
{
|
{
|
||||||
ptrdiff_t diff;
|
ptrdiff_t diff;
|
||||||
curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)];
|
curMatch = son[_cyclicBufferPos - delta + (_cyclicBufferPos < delta ? _cyclicBufferSize : 0)];
|
||||||
diff = (ptrdiff_t)0 - (ptrdiff_t)delta;
|
diff = (ptrdiff_t)0 - (ptrdiff_t)delta;
|
||||||
if (cur[maxLen] == cur[(ptrdiff_t)maxLen + diff])
|
if (cur[maxLen] == cur[(ptrdiff_t)maxLen + diff])
|
||||||
{
|
{
|
||||||
@@ -972,7 +972,7 @@ UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byt
|
|||||||
// if (curMatch >= pos) { *ptr0 = *ptr1 = kEmptyHashValue; return NULL; }
|
// if (curMatch >= pos) { *ptr0 = *ptr1 = kEmptyHashValue; return NULL; }
|
||||||
|
|
||||||
cmCheck = (UInt32)(pos - _cyclicBufferSize);
|
cmCheck = (UInt32)(pos - _cyclicBufferSize);
|
||||||
if ((UInt32)pos <= _cyclicBufferSize)
|
if ((UInt32)pos < _cyclicBufferSize)
|
||||||
cmCheck = 0;
|
cmCheck = 0;
|
||||||
|
|
||||||
if (cmCheck < curMatch)
|
if (cmCheck < curMatch)
|
||||||
@@ -980,7 +980,7 @@ UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byt
|
|||||||
{
|
{
|
||||||
const UInt32 delta = pos - curMatch;
|
const UInt32 delta = pos - curMatch;
|
||||||
{
|
{
|
||||||
CLzRef *pair = son + ((size_t)(_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1);
|
CLzRef *pair = son + ((size_t)(_cyclicBufferPos - delta + (_cyclicBufferPos < delta ? _cyclicBufferSize : 0)) << 1);
|
||||||
const Byte *pb = cur - delta;
|
const Byte *pb = cur - delta;
|
||||||
unsigned len = (len0 < len1 ? len0 : len1);
|
unsigned len = (len0 < len1 ? len0 : len1);
|
||||||
const UInt32 pair0 = pair[0];
|
const UInt32 pair0 = pair[0];
|
||||||
@@ -1039,7 +1039,7 @@ static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const
|
|||||||
UInt32 cmCheck;
|
UInt32 cmCheck;
|
||||||
|
|
||||||
cmCheck = (UInt32)(pos - _cyclicBufferSize);
|
cmCheck = (UInt32)(pos - _cyclicBufferSize);
|
||||||
if ((UInt32)pos <= _cyclicBufferSize)
|
if ((UInt32)pos < _cyclicBufferSize)
|
||||||
cmCheck = 0;
|
cmCheck = 0;
|
||||||
|
|
||||||
if (// curMatch >= pos || // failure
|
if (// curMatch >= pos || // failure
|
||||||
@@ -1048,7 +1048,7 @@ static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const
|
|||||||
{
|
{
|
||||||
const UInt32 delta = pos - curMatch;
|
const UInt32 delta = pos - curMatch;
|
||||||
{
|
{
|
||||||
CLzRef *pair = son + ((size_t)(_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1);
|
CLzRef *pair = son + ((size_t)(_cyclicBufferPos - delta + (_cyclicBufferPos < delta ? _cyclicBufferSize : 0)) << 1);
|
||||||
const Byte *pb = cur - delta;
|
const Byte *pb = cur - delta;
|
||||||
unsigned len = (len0 < len1 ? len0 : len1);
|
unsigned len = (len0 < len1 ? len0 : len1);
|
||||||
if (pb[len] == cur[len])
|
if (pb[len] == cur[len])
|
||||||
@@ -1595,7 +1595,7 @@ static void Bt5_MatchFinder_Skip(void *_p, UInt32 num)
|
|||||||
UInt32 pos = p->pos; \
|
UInt32 pos = p->pos; \
|
||||||
UInt32 num2 = num; \
|
UInt32 num2 = num; \
|
||||||
/* (p->pos == p->posLimit) is not allowed here !!! */ \
|
/* (p->pos == p->posLimit) is not allowed here !!! */ \
|
||||||
{ const UInt32 rem = p->posLimit - pos; if (num2 > rem) num2 = rem; } \
|
{ const UInt32 rem = p->posLimit - pos; if (num2 >= rem) num2 = rem; } \
|
||||||
num -= num2; \
|
num -= num2; \
|
||||||
{ const UInt32 cycPos = p->cyclicBufferPos; \
|
{ const UInt32 cycPos = p->cyclicBufferPos; \
|
||||||
son = p->son + cycPos; \
|
son = p->son + cycPos; \
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/* LzFindMt.c -- multithreaded Match finder for LZ algorithms
|
/* LzFindMt.c -- multithreaded Match finder for LZ algorithms
|
||||||
2024-01-22 : Igor Pavlov : Public domain */
|
: Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#include "Precomp.h"
|
#include "Precomp.h"
|
||||||
|
|
||||||
@@ -82,6 +82,8 @@ extern UInt64 g_NumIters_Bytes;
|
|||||||
Z7_NO_INLINE
|
Z7_NO_INLINE
|
||||||
static void MtSync_Construct(CMtSync *p)
|
static void MtSync_Construct(CMtSync *p)
|
||||||
{
|
{
|
||||||
|
p->affinityGroup = -1;
|
||||||
|
p->affinityInGroup = 0;
|
||||||
p->affinity = 0;
|
p->affinity = 0;
|
||||||
p->wasCreated = False;
|
p->wasCreated = False;
|
||||||
p->csWasInitialized = False;
|
p->csWasInitialized = False;
|
||||||
@@ -259,6 +261,12 @@ static WRes MtSync_Create_WRes(CMtSync *p, THREAD_FUNC_TYPE startAddress, void *
|
|||||||
// return ERROR_TOO_MANY_POSTS; // for debug
|
// return ERROR_TOO_MANY_POSTS; // for debug
|
||||||
// return EINVAL; // for debug
|
// return EINVAL; // for debug
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
if (p->affinityGroup >= 0)
|
||||||
|
wres = Thread_Create_With_Group(&p->thread, startAddress, obj,
|
||||||
|
(unsigned)(UInt32)p->affinityGroup, (CAffinityMask)p->affinityInGroup);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
if (p->affinity != 0)
|
if (p->affinity != 0)
|
||||||
wres = Thread_Create_With_Affinity(&p->thread, startAddress, obj, (CAffinityMask)p->affinity);
|
wres = Thread_Create_With_Affinity(&p->thread, startAddress, obj, (CAffinityMask)p->affinity);
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/* LzFindMt.h -- multithreaded Match finder for LZ algorithms
|
/* LzFindMt.h -- multithreaded Match finder for LZ algorithms
|
||||||
2024-01-22 : Igor Pavlov : Public domain */
|
: Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#ifndef ZIP7_INC_LZ_FIND_MT_H
|
#ifndef ZIP7_INC_LZ_FIND_MT_H
|
||||||
#define ZIP7_INC_LZ_FIND_MT_H
|
#define ZIP7_INC_LZ_FIND_MT_H
|
||||||
@@ -12,8 +12,10 @@ EXTERN_C_BEGIN
|
|||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
UInt32 numProcessedBlocks;
|
UInt32 numProcessedBlocks;
|
||||||
CThread thread;
|
Int32 affinityGroup;
|
||||||
|
UInt64 affinityInGroup;
|
||||||
UInt64 affinity;
|
UInt64 affinity;
|
||||||
|
CThread thread;
|
||||||
|
|
||||||
BoolInt wasCreated;
|
BoolInt wasCreated;
|
||||||
BoolInt needStart;
|
BoolInt needStart;
|
||||||
|
|||||||
@@ -62,7 +62,9 @@ void LzmaEncProps_Init(CLzmaEncProps *p)
|
|||||||
p->lc = p->lp = p->pb = p->algo = p->fb = p->btMode = p->numHashBytes = p->numThreads = -1;
|
p->lc = p->lp = p->pb = p->algo = p->fb = p->btMode = p->numHashBytes = p->numThreads = -1;
|
||||||
p->numHashOutBits = 0;
|
p->numHashOutBits = 0;
|
||||||
p->writeEndMark = 0;
|
p->writeEndMark = 0;
|
||||||
|
p->affinityGroup = -1;
|
||||||
p->affinity = 0;
|
p->affinity = 0;
|
||||||
|
p->affinityInGroup = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LzmaEncProps_Normalize(CLzmaEncProps *p)
|
void LzmaEncProps_Normalize(CLzmaEncProps *p)
|
||||||
@@ -598,6 +600,10 @@ SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props2)
|
|||||||
p->multiThread = (props.numThreads > 1);
|
p->multiThread = (props.numThreads > 1);
|
||||||
p->matchFinderMt.btSync.affinity =
|
p->matchFinderMt.btSync.affinity =
|
||||||
p->matchFinderMt.hashSync.affinity = props.affinity;
|
p->matchFinderMt.hashSync.affinity = props.affinity;
|
||||||
|
p->matchFinderMt.btSync.affinityGroup =
|
||||||
|
p->matchFinderMt.hashSync.affinityGroup = props.affinityGroup;
|
||||||
|
p->matchFinderMt.btSync.affinityInGroup =
|
||||||
|
p->matchFinderMt.hashSync.affinityInGroup = props.affinityInGroup;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return SZ_OK;
|
return SZ_OK;
|
||||||
@@ -2345,10 +2351,9 @@ static void LzmaEnc_Construct(CLzmaEnc *p)
|
|||||||
|
|
||||||
CLzmaEncHandle LzmaEnc_Create(ISzAllocPtr alloc)
|
CLzmaEncHandle LzmaEnc_Create(ISzAllocPtr alloc)
|
||||||
{
|
{
|
||||||
void *p;
|
CLzmaEncHandle p = (CLzmaEncHandle)ISzAlloc_Alloc(alloc, sizeof(CLzmaEnc));
|
||||||
p = ISzAlloc_Alloc(alloc, sizeof(CLzmaEnc));
|
|
||||||
if (p)
|
if (p)
|
||||||
LzmaEnc_Construct((CLzmaEnc *)p);
|
LzmaEnc_Construct(p);
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/* LzmaEnc.h -- LZMA Encoder
|
/* LzmaEnc.h -- LZMA Encoder
|
||||||
2023-04-13 : Igor Pavlov : Public domain */
|
: Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#ifndef ZIP7_INC_LZMA_ENC_H
|
#ifndef ZIP7_INC_LZMA_ENC_H
|
||||||
#define ZIP7_INC_LZMA_ENC_H
|
#define ZIP7_INC_LZMA_ENC_H
|
||||||
@@ -29,11 +29,13 @@ typedef struct
|
|||||||
int numThreads; /* 1 or 2, default = 2 */
|
int numThreads; /* 1 or 2, default = 2 */
|
||||||
|
|
||||||
// int _pad;
|
// int _pad;
|
||||||
|
Int32 affinityGroup;
|
||||||
|
|
||||||
UInt64 reduceSize; /* estimated size of data that will be compressed. default = (UInt64)(Int64)-1.
|
UInt64 reduceSize; /* estimated size of data that will be compressed. default = (UInt64)(Int64)-1.
|
||||||
Encoder uses this value to reduce dictionary size */
|
Encoder uses this value to reduce dictionary size */
|
||||||
|
|
||||||
UInt64 affinity;
|
UInt64 affinity;
|
||||||
|
UInt64 affinityInGroup;
|
||||||
} CLzmaEncProps;
|
} CLzmaEncProps;
|
||||||
|
|
||||||
void LzmaEncProps_Init(CLzmaEncProps *p);
|
void LzmaEncProps_Init(CLzmaEncProps *p);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/* Precomp.h -- precompilation file
|
/* Precomp.h -- precompilation file
|
||||||
2024-01-25 : Igor Pavlov : Public domain */
|
: Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#ifndef ZIP7_INC_PRECOMP_H
|
#ifndef ZIP7_INC_PRECOMP_H
|
||||||
#define ZIP7_INC_PRECOMP_H
|
#define ZIP7_INC_PRECOMP_H
|
||||||
@@ -40,18 +40,18 @@
|
|||||||
#endif
|
#endif
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef Z7_LARGE_PAGES
|
||||||
|
#if !defined(Z7_NO_LARGE_PAGES) && !defined(UNDER_CE)
|
||||||
|
#define Z7_LARGE_PAGES 1
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
/*
|
/*
|
||||||
this "Precomp.h" file must be included before <windows.h>,
|
this "Precomp.h" file must be included before <windows.h>,
|
||||||
if we want to define _WIN32_WINNT before <windows.h>.
|
if we want to define _WIN32_WINNT before <windows.h>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef Z7_LARGE_PAGES
|
|
||||||
#ifndef Z7_NO_LARGE_PAGES
|
|
||||||
#define Z7_LARGE_PAGES 1
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef Z7_LONG_PATH
|
#ifndef Z7_LONG_PATH
|
||||||
#ifndef Z7_NO_LONG_PATH
|
#ifndef Z7_NO_LONG_PATH
|
||||||
#define Z7_LONG_PATH 1
|
#define Z7_LONG_PATH 1
|
||||||
|
|||||||
+250
-5
@@ -1,5 +1,5 @@
|
|||||||
/* Threads.c -- multithreading library
|
/* Threads.c -- multithreading library
|
||||||
2024-03-28 : Igor Pavlov : Public domain */
|
: Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#include "Precomp.h"
|
#include "Precomp.h"
|
||||||
|
|
||||||
@@ -59,6 +59,111 @@ WRes Thread_Wait_Close(CThread *p)
|
|||||||
return (res != 0 ? res : res2);
|
return (res != 0 ? res : res2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct MY_PROCESSOR_NUMBER {
|
||||||
|
WORD Group;
|
||||||
|
BYTE Number;
|
||||||
|
BYTE Reserved;
|
||||||
|
} MY_PROCESSOR_NUMBER, *MY_PPROCESSOR_NUMBER;
|
||||||
|
|
||||||
|
typedef struct MY_GROUP_AFFINITY {
|
||||||
|
#if defined(Z7_GCC_VERSION) && (Z7_GCC_VERSION < 100000)
|
||||||
|
// KAFFINITY is not defined in old mingw
|
||||||
|
ULONG_PTR
|
||||||
|
#else
|
||||||
|
KAFFINITY
|
||||||
|
#endif
|
||||||
|
Mask;
|
||||||
|
WORD Group;
|
||||||
|
WORD Reserved[3];
|
||||||
|
} MY_GROUP_AFFINITY, *MY_PGROUP_AFFINITY;
|
||||||
|
|
||||||
|
typedef BOOL (WINAPI *Func_SetThreadGroupAffinity)(
|
||||||
|
HANDLE hThread,
|
||||||
|
CONST MY_GROUP_AFFINITY *GroupAffinity,
|
||||||
|
MY_PGROUP_AFFINITY PreviousGroupAffinity);
|
||||||
|
|
||||||
|
typedef BOOL (WINAPI *Func_GetThreadGroupAffinity)(
|
||||||
|
HANDLE hThread,
|
||||||
|
MY_PGROUP_AFFINITY GroupAffinity);
|
||||||
|
|
||||||
|
typedef BOOL (WINAPI *Func_GetProcessGroupAffinity)(
|
||||||
|
HANDLE hProcess,
|
||||||
|
PUSHORT GroupCount,
|
||||||
|
PUSHORT GroupArray);
|
||||||
|
|
||||||
|
Z7_DIAGNOSTIC_IGNORE_CAST_FUNCTION
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
#include <stdio.h>
|
||||||
|
#define PRF(x) x
|
||||||
|
/*
|
||||||
|
--
|
||||||
|
before call of SetThreadGroupAffinity()
|
||||||
|
GetProcessGroupAffinity return one group.
|
||||||
|
after call of SetThreadGroupAffinity():
|
||||||
|
GetProcessGroupAffinity return more than group,
|
||||||
|
if SetThreadGroupAffinity() was to another group.
|
||||||
|
--
|
||||||
|
GetProcessAffinityMask MS DOCs:
|
||||||
|
{
|
||||||
|
If the calling process contains threads in multiple groups,
|
||||||
|
the function returns zero for both affinity masks.
|
||||||
|
}
|
||||||
|
but tests in win10 with 2 groups (less than 64 cores total):
|
||||||
|
GetProcessAffinityMask() still returns non-zero affinity masks
|
||||||
|
even after SetThreadGroupAffinity() calls.
|
||||||
|
*/
|
||||||
|
static void PrintProcess_Info()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
const
|
||||||
|
Func_GetProcessGroupAffinity fn_GetProcessGroupAffinity =
|
||||||
|
(Func_GetProcessGroupAffinity) Z7_CAST_FUNC_C GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),
|
||||||
|
"GetProcessGroupAffinity");
|
||||||
|
if (fn_GetProcessGroupAffinity)
|
||||||
|
{
|
||||||
|
unsigned i;
|
||||||
|
USHORT GroupCounts[64];
|
||||||
|
USHORT GroupCount = Z7_ARRAY_SIZE(GroupCounts);
|
||||||
|
BOOL boolRes = fn_GetProcessGroupAffinity(GetCurrentProcess(),
|
||||||
|
&GroupCount, GroupCounts);
|
||||||
|
printf("\n====== GetProcessGroupAffinity : "
|
||||||
|
"boolRes=%u GroupCounts = %u :",
|
||||||
|
boolRes, (unsigned)GroupCount);
|
||||||
|
for (i = 0; i < GroupCount; i++)
|
||||||
|
printf(" %u", GroupCounts[i]);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
DWORD_PTR processAffinityMask, systemAffinityMask;
|
||||||
|
if (GetProcessAffinityMask(GetCurrentProcess(), &processAffinityMask, &systemAffinityMask))
|
||||||
|
{
|
||||||
|
PRF(printf("\n====== GetProcessAffinityMask : "
|
||||||
|
": processAffinityMask=%x, systemAffinityMask=%x\n",
|
||||||
|
(UInt32)processAffinityMask, (UInt32)systemAffinityMask);)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
printf("\n==GetProcessAffinityMask FAIL");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#ifndef USE_THREADS_CreateThread
|
||||||
|
// #define PRF(x)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* if we send (stackSize=0) to CreateThread(), it will
|
||||||
|
use default value PE::SizeOfStackReserve from exe file.
|
||||||
|
PE::SizeOfStackReserve == 1 MiB in exe file with default linker options.
|
||||||
|
Windows aligns specified value to the next 64 KB range. */
|
||||||
|
static const unsigned k_StackSize_ReserveSize =
|
||||||
|
#ifdef UNDER_CE
|
||||||
|
1 << 17;
|
||||||
|
#else
|
||||||
|
1 << 20;
|
||||||
|
#endif
|
||||||
|
|
||||||
WRes Thread_Create(CThread *p, THREAD_FUNC_TYPE func, LPVOID param)
|
WRes Thread_Create(CThread *p, THREAD_FUNC_TYPE func, LPVOID param)
|
||||||
{
|
{
|
||||||
/* Windows Me/98/95: threadId parameter may not be NULL in _beginthreadex/CreateThread functions */
|
/* Windows Me/98/95: threadId parameter may not be NULL in _beginthreadex/CreateThread functions */
|
||||||
@@ -66,12 +171,51 @@ WRes Thread_Create(CThread *p, THREAD_FUNC_TYPE func, LPVOID param)
|
|||||||
#ifdef USE_THREADS_CreateThread
|
#ifdef USE_THREADS_CreateThread
|
||||||
|
|
||||||
DWORD threadId;
|
DWORD threadId;
|
||||||
*p = CreateThread(NULL, 0, func, param, 0, &threadId);
|
*p = CreateThread(NULL, k_StackSize_ReserveSize, func, param, STACK_SIZE_PARAM_IS_A_RESERVATION, &threadId);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
#define CALL_beginthreadex(func2, param2, flags, threadIdPtr) \
|
||||||
|
((HANDLE)(_beginthreadex(NULL, k_StackSize_ReserveSize, func2, param2, (flags) | STACK_SIZE_PARAM_IS_A_RESERVATION, threadIdPtr)))
|
||||||
|
|
||||||
unsigned threadId;
|
unsigned threadId;
|
||||||
*p = (HANDLE)(_beginthreadex(NULL, 0, func, param, 0, &threadId));
|
*p = CALL_beginthreadex(func, param, 0, &threadId);
|
||||||
|
|
||||||
|
#if 0 // 1 : for debug
|
||||||
|
{
|
||||||
|
DWORD_PTR prevMask;
|
||||||
|
DWORD_PTR affinity = 1 << 0;
|
||||||
|
prevMask = SetThreadAffinityMask(*p, (DWORD_PTR)affinity);
|
||||||
|
prevMask = prevMask;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if 0 // 1 : for debug
|
||||||
|
{
|
||||||
|
/* win10: new thread will be created in same group that is assigned to parent thread
|
||||||
|
but affinity mask will contain all allowed threads of that group,
|
||||||
|
even if affinity mask of parent group is not full
|
||||||
|
win11: what group it will be created, if we have set
|
||||||
|
affinity of parent thread with ThreadGroupAffinity?
|
||||||
|
*/
|
||||||
|
const
|
||||||
|
Func_GetThreadGroupAffinity fn =
|
||||||
|
(Func_GetThreadGroupAffinity) Z7_CAST_FUNC_C GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),
|
||||||
|
"GetThreadGroupAffinity");
|
||||||
|
if (fn)
|
||||||
|
{
|
||||||
|
// BOOL wres2;
|
||||||
|
MY_GROUP_AFFINITY groupAffinity;
|
||||||
|
memset(&groupAffinity, 0, sizeof(groupAffinity));
|
||||||
|
/* wres2 = */ fn(*p, &groupAffinity);
|
||||||
|
PRF(printf("\n==Thread_Create cur = %6u GetThreadGroupAffinity(): "
|
||||||
|
"wres2_BOOL = %u, group=%u mask=%x\n",
|
||||||
|
GetCurrentThreadId(),
|
||||||
|
wres2,
|
||||||
|
groupAffinity.Group,
|
||||||
|
(UInt32)groupAffinity.Mask);)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -93,7 +237,7 @@ WRes Thread_Create_With_Affinity(CThread *p, THREAD_FUNC_TYPE func, LPVOID param
|
|||||||
HANDLE h;
|
HANDLE h;
|
||||||
WRes wres;
|
WRes wres;
|
||||||
unsigned threadId;
|
unsigned threadId;
|
||||||
h = (HANDLE)(_beginthreadex(NULL, 0, func, param, CREATE_SUSPENDED, &threadId));
|
h = CALL_beginthreadex(func, param, CREATE_SUSPENDED, &threadId);
|
||||||
*p = h;
|
*p = h;
|
||||||
wres = HandleToWRes(h);
|
wres = HandleToWRes(h);
|
||||||
if (h)
|
if (h)
|
||||||
@@ -110,7 +254,84 @@ WRes Thread_Create_With_Affinity(CThread *p, THREAD_FUNC_TYPE func, LPVOID param
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
DWORD prevSuspendCount = ResumeThread(h);
|
const DWORD prevSuspendCount = ResumeThread(h);
|
||||||
|
/* ResumeThread() returns:
|
||||||
|
0 : was_not_suspended
|
||||||
|
1 : was_resumed
|
||||||
|
-1 : error
|
||||||
|
*/
|
||||||
|
if (prevSuspendCount == (DWORD)-1)
|
||||||
|
wres = GetError();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* maybe we must use errno here, but probably GetLastError() is also OK. */
|
||||||
|
return wres;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
WRes Thread_Create_With_Group(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, unsigned group, CAffinityMask affinityMask)
|
||||||
|
{
|
||||||
|
#ifdef USE_THREADS_CreateThread
|
||||||
|
|
||||||
|
UNUSED_VAR(group)
|
||||||
|
UNUSED_VAR(affinityMask)
|
||||||
|
return Thread_Create(p, func, param);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* Windows Me/98/95: threadId parameter may not be NULL in _beginthreadex/CreateThread functions */
|
||||||
|
HANDLE h;
|
||||||
|
WRes wres;
|
||||||
|
unsigned threadId;
|
||||||
|
h = CALL_beginthreadex(func, param, CREATE_SUSPENDED, &threadId);
|
||||||
|
*p = h;
|
||||||
|
wres = HandleToWRes(h);
|
||||||
|
if (h)
|
||||||
|
{
|
||||||
|
// PrintProcess_Info();
|
||||||
|
{
|
||||||
|
const
|
||||||
|
Func_SetThreadGroupAffinity fn =
|
||||||
|
(Func_SetThreadGroupAffinity) Z7_CAST_FUNC_C GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),
|
||||||
|
"SetThreadGroupAffinity");
|
||||||
|
if (fn)
|
||||||
|
{
|
||||||
|
// WRes wres2;
|
||||||
|
MY_GROUP_AFFINITY groupAffinity, prev_groupAffinity;
|
||||||
|
memset(&groupAffinity, 0, sizeof(groupAffinity));
|
||||||
|
// groupAffinity.Mask must use only bits that supported by current group
|
||||||
|
// (groupAffinity.Mask = 0) means all allowed bits
|
||||||
|
groupAffinity.Mask = affinityMask;
|
||||||
|
groupAffinity.Group = (WORD)group;
|
||||||
|
// wres2 =
|
||||||
|
fn(h, &groupAffinity, &prev_groupAffinity);
|
||||||
|
/*
|
||||||
|
if (groupAffinity.Group == prev_groupAffinity.Group)
|
||||||
|
wres2 = wres2;
|
||||||
|
else
|
||||||
|
wres2 = wres2;
|
||||||
|
if (wres2 == 0)
|
||||||
|
{
|
||||||
|
wres2 = GetError();
|
||||||
|
PRF(printf("\n==SetThreadGroupAffinity error: %u\n", wres2);)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PRF(printf("\n==Thread_Create_With_Group::SetThreadGroupAffinity()"
|
||||||
|
" threadId = %6u"
|
||||||
|
" group=%u mask=%x\n",
|
||||||
|
threadId,
|
||||||
|
prev_groupAffinity.Group,
|
||||||
|
(UInt32)prev_groupAffinity.Mask);)
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const DWORD prevSuspendCount = ResumeThread(h);
|
||||||
/* ResumeThread() returns:
|
/* ResumeThread() returns:
|
||||||
0 : was_not_suspended
|
0 : was_not_suspended
|
||||||
1 : was_resumed
|
1 : was_resumed
|
||||||
@@ -297,6 +518,13 @@ WRes Thread_Create(CThread *p, THREAD_FUNC_TYPE func, LPVOID param)
|
|||||||
return Thread_Create_With_CpuSet(p, func, param, NULL);
|
return Thread_Create_With_CpuSet(p, func, param, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
WRes Thread_Create_With_Group(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, unsigned group, CAffinityMask affinity)
|
||||||
|
{
|
||||||
|
UNUSED_VAR(group)
|
||||||
|
return Thread_Create_With_Affinity(p, func, param, affinity);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
WRes Thread_Create_With_Affinity(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, CAffinityMask affinity)
|
WRes Thread_Create_With_Affinity(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, CAffinityMask affinity)
|
||||||
{
|
{
|
||||||
@@ -577,5 +805,22 @@ WRes AutoResetEvent_OptCreate_And_Reset(CAutoResetEvent *p)
|
|||||||
return AutoResetEvent_CreateNotSignaled(p);
|
return AutoResetEvent_CreateNotSignaled(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ThreadNextGroup_Init(CThreadNextGroup *p, UInt32 numGroups, UInt32 startGroup)
|
||||||
|
{
|
||||||
|
// printf("\n====== ThreadNextGroup_Init numGroups = %x: startGroup=%x\n", numGroups, startGroup);
|
||||||
|
if (numGroups == 0)
|
||||||
|
numGroups = 1;
|
||||||
|
p->NumGroups = numGroups;
|
||||||
|
p->NextGroup = startGroup % numGroups;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
UInt32 ThreadNextGroup_GetNext(CThreadNextGroup *p)
|
||||||
|
{
|
||||||
|
const UInt32 next = p->NextGroup;
|
||||||
|
p->NextGroup = (next + 1) % p->NumGroups;
|
||||||
|
return next;
|
||||||
|
}
|
||||||
|
|
||||||
#undef PRF
|
#undef PRF
|
||||||
#undef Print
|
#undef Print
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/* Threads.h -- multithreading library
|
/* Threads.h -- multithreading library
|
||||||
2024-03-28 : Igor Pavlov : Public domain */
|
: Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#ifndef ZIP7_INC_THREADS_H
|
#ifndef ZIP7_INC_THREADS_H
|
||||||
#define ZIP7_INC_THREADS_H
|
#define ZIP7_INC_THREADS_H
|
||||||
@@ -140,12 +140,22 @@ WRes Thread_Create_With_Affinity(CThread *p, THREAD_FUNC_TYPE func, LPVOID param
|
|||||||
WRes Thread_Wait_Close(CThread *p);
|
WRes Thread_Wait_Close(CThread *p);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
WRes Thread_Create_With_Group(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, unsigned group, CAffinityMask affinityMask);
|
||||||
#define Thread_Create_With_CpuSet(p, func, param, cs) \
|
#define Thread_Create_With_CpuSet(p, func, param, cs) \
|
||||||
Thread_Create_With_Affinity(p, func, param, *cs)
|
Thread_Create_With_Affinity(p, func, param, *cs)
|
||||||
#else
|
#else
|
||||||
WRes Thread_Create_With_CpuSet(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, const CCpuSet *cpuSet);
|
WRes Thread_Create_With_CpuSet(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, const CCpuSet *cpuSet);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned NumGroups;
|
||||||
|
unsigned NextGroup;
|
||||||
|
} CThreadNextGroup;
|
||||||
|
|
||||||
|
void ThreadNextGroup_Init(CThreadNextGroup *p, unsigned numGroups, unsigned startGroup);
|
||||||
|
unsigned ThreadNextGroup_GetNext(CThreadNextGroup *p);
|
||||||
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,47 @@
|
|||||||
HISTORY of the LZMA SDK
|
HISTORY of the LZMA SDK
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
|
26.01 2026-04-27
|
||||||
|
-------------------------
|
||||||
|
- linux version of 7-Zip can use huge pages (2 MB pages). It can increase compression
|
||||||
|
speed for 10% for 7z/xz/LZMA/LZMA2 compression.
|
||||||
|
- new -spo[d|c|r] switch specifies the path generation mode for the output directory
|
||||||
|
for archive extraction. The output directory path is generated from the path specified
|
||||||
|
in the -o{dir_path} switch and the name of the archive being unpacked.
|
||||||
|
-spod : for Linux/Posix/macOS: -o{dir_path} specifies the direct path to the output directory.
|
||||||
|
The asterisk (*) character in {dir_path} will not be replaced by the archive name.
|
||||||
|
-spoc : 7-Zip will concatenate the path specified in -o{dir_path} with the archive name
|
||||||
|
to form the final path to the output directory.
|
||||||
|
-spor : 7-Zip will replace asterisk (*) character in the path specified in the -o{dir_path}
|
||||||
|
with the archive name. This is the default option.
|
||||||
|
- The 7zdec.exe program (a lightweight 7z archive decoder) has been modified for security purposes.
|
||||||
|
Now 7zdec.exe extracts files only to the current folder and its subfolders.
|
||||||
|
- some bugs were fixed.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
26.00 2026-02-12
|
||||||
|
-------------------------
|
||||||
|
- some bugs were fixed.
|
||||||
|
|
||||||
|
|
||||||
|
25.01 2025-08-03
|
||||||
|
-------------------------
|
||||||
|
- The code for handling symbolic links has been changed
|
||||||
|
to provide greater security when extracting files from archives.
|
||||||
|
Command line switch -snld20 can be used to bypass default security
|
||||||
|
checks when creating symbolic links.
|
||||||
|
|
||||||
|
|
||||||
|
25.00 2025-07-05
|
||||||
|
-------------------------
|
||||||
|
- 7-Zip for Windows can now use more than 64 CPU threads for compression
|
||||||
|
to zip/7z/xz archives and for the 7-Zip benchmark.
|
||||||
|
If there are more than one processor group in Windows (on systems with more than
|
||||||
|
64 cpu threads), 7-Zip distributes running CPU threads across different processor groups.
|
||||||
|
- fixed some bugs and vulnerabilities.
|
||||||
|
|
||||||
|
|
||||||
24.09 2024-11-29
|
24.09 2024-11-29
|
||||||
-------------------------
|
-------------------------
|
||||||
- The default dictionary size values for LZMA/LZMA2 compression methods were increased:
|
- The default dictionary size values for LZMA/LZMA2 compression methods were increased:
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
LZMA SDK 24.09
|
LZMA SDK 26.01
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
LZMA SDK provides the documentation, samples, header files,
|
LZMA SDK provides the documentation, samples, header files,
|
||||||
@@ -59,6 +59,34 @@ LZMA SDK Contents
|
|||||||
- console programs for lzma / 7z / xz compression and decompression
|
- console programs for lzma / 7z / xz compression and decompression
|
||||||
- SFX modules for installers.
|
- SFX modules for installers.
|
||||||
|
|
||||||
|
How to compile with makefile in Windows
|
||||||
|
---------------------------------------
|
||||||
|
|
||||||
|
Some macronames can be defined for compiling with makefile:
|
||||||
|
|
||||||
|
PLATFORM
|
||||||
|
with possible values: x64, x86, arm64, arm, ia64
|
||||||
|
|
||||||
|
OLD_COMPILER
|
||||||
|
for old VC compiler, like MSCV 6.0.
|
||||||
|
|
||||||
|
MY_DYNAMIC_LINK
|
||||||
|
for dynamic linking to the run-time library (msvcrt.dll).
|
||||||
|
The default makefile option is static linking to the run-time library.
|
||||||
|
|
||||||
|
To compile 7zr.exe file for x64 with Visual Studio 2022,
|
||||||
|
use the following command sequence:
|
||||||
|
|
||||||
|
cd SRC\CPP\7zip\Bundles\Alone7z\
|
||||||
|
%comspec% /k "C:\Program Files\VS2022\VC\Auxiliary\Build\vcvars64.bat"
|
||||||
|
nmake
|
||||||
|
|
||||||
|
You can use other "vcvars*.bat" files from the "VS2022\VC\Auxiliary\Build" directory
|
||||||
|
to compile for other platforms:
|
||||||
|
vcvars64.bat
|
||||||
|
vcvarsamd64_arm64.bat
|
||||||
|
vcvarsamd64_x86.bat
|
||||||
|
|
||||||
|
|
||||||
UNIX/Linux version
|
UNIX/Linux version
|
||||||
------------------
|
------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user