More OSX compatibility code.
Fix new warnings with Gcc 4.8.
This commit is contained in:
parent
8b52f7ccb8
commit
6fba8aa8ac
10 changed files with 119 additions and 31 deletions
|
@ -27,11 +27,13 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
|
/*
|
||||||
#if defined(sun) || defined(__sun)
|
#if defined(sun) || defined(__sun)
|
||||||
#include <sys/byteorder.h>
|
#include <sys/byteorder.h>
|
||||||
#else
|
#else
|
||||||
#include <byteswap.h>
|
#include <byteswap.h>
|
||||||
#endif
|
#endif
|
||||||
|
*/
|
||||||
#include <utils.h>
|
#include <utils.h>
|
||||||
#include <pcompress.h>
|
#include <pcompress.h>
|
||||||
#include <allocator.h>
|
#include <allocator.h>
|
||||||
|
|
|
@ -280,7 +280,7 @@ slab_cleanup(int quiet)
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
slab_calloc(void *p, uint64_t items, uint64_t size) {
|
slab_calloc(void *p, size_t items, size_t size) {
|
||||||
void *ptr;
|
void *ptr;
|
||||||
|
|
||||||
if (bypass) return(calloc(items, size));
|
if (bypass) return(calloc(items, size));
|
||||||
|
@ -376,7 +376,7 @@ slab_cache_add(uint64_t size)
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
slab_alloc(void *p, uint64_t size)
|
slab_alloc(void *p, size_t size)
|
||||||
{
|
{
|
||||||
uint64_t div;
|
uint64_t div;
|
||||||
struct slabentry *slab;
|
struct slabentry *slab;
|
||||||
|
@ -517,13 +517,13 @@ void
|
||||||
slab_cleanup(int quiet) {}
|
slab_cleanup(int quiet) {}
|
||||||
|
|
||||||
void
|
void
|
||||||
*slab_alloc(void *p, uint64_t size)
|
*slab_alloc(void *p, size_t size)
|
||||||
{
|
{
|
||||||
return (malloc(size));
|
return (malloc(size));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
*slab_calloc(void *p, uint64_t items, uint64_t size)
|
*slab_calloc(void *p, size_t items, size_t size)
|
||||||
{
|
{
|
||||||
return (calloc(items, size));
|
return (calloc(items, size));
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,8 +31,8 @@
|
||||||
|
|
||||||
void slab_init();
|
void slab_init();
|
||||||
void slab_cleanup(int quiet);
|
void slab_cleanup(int quiet);
|
||||||
void *slab_alloc(void *p, uint64_t size);
|
void *slab_alloc(void *p, size_t size);
|
||||||
void *slab_calloc(void *p, uint64_t items, uint64_t size);
|
void *slab_calloc(void *p, size_t items, size_t size);
|
||||||
void slab_free(void *p, void *address);
|
void slab_free(void *p, void *address);
|
||||||
void slab_release(void *p, void *address);
|
void slab_release(void *p, void *address);
|
||||||
int slab_cache_add(uint64_t size);
|
int slab_cache_add(uint64_t size);
|
||||||
|
|
|
@ -201,10 +201,11 @@ int
|
||||||
lzma_compress(void *src, uint64_t srclen, void *dst,
|
lzma_compress(void *src, uint64_t srclen, void *dst,
|
||||||
uint64_t *dstlen, int level, uchar_t chdr, int btype, void *data)
|
uint64_t *dstlen, int level, uchar_t chdr, int btype, void *data)
|
||||||
{
|
{
|
||||||
uint64_t props_len = LZMA_PROPS_SIZE;
|
SizeT props_len = LZMA_PROPS_SIZE;
|
||||||
SRes res;
|
SRes res;
|
||||||
Byte *_dst;
|
Byte *_dst;
|
||||||
CLzmaEncProps *props = (CLzmaEncProps *)data;
|
CLzmaEncProps *props = (CLzmaEncProps *)data;
|
||||||
|
SizeT dlen;
|
||||||
|
|
||||||
if (*dstlen < LZMA_PROPS_SIZE) {
|
if (*dstlen < LZMA_PROPS_SIZE) {
|
||||||
lzerr(SZ_ERROR_DESTLEN, 1);
|
lzerr(SZ_ERROR_DESTLEN, 1);
|
||||||
|
@ -217,8 +218,10 @@ lzma_compress(void *src, uint64_t srclen, void *dst,
|
||||||
|
|
||||||
_dst = (Byte *)dst;
|
_dst = (Byte *)dst;
|
||||||
*dstlen -= LZMA_PROPS_SIZE;
|
*dstlen -= LZMA_PROPS_SIZE;
|
||||||
res = LzmaEncode(_dst + LZMA_PROPS_SIZE, dstlen, (const uchar_t *)src, srclen,
|
dlen = *dstlen;
|
||||||
|
res = LzmaEncode(_dst + LZMA_PROPS_SIZE, &dlen, (const uchar_t *)src, srclen,
|
||||||
props, (uchar_t *)_dst, &props_len, 0, NULL, &g_Alloc, &g_Alloc);
|
props, (uchar_t *)_dst, &props_len, 0, NULL, &g_Alloc, &g_Alloc);
|
||||||
|
*dstlen = dlen;
|
||||||
|
|
||||||
if (res != 0) {
|
if (res != 0) {
|
||||||
lzerr(res, 1);
|
lzerr(res, 1);
|
||||||
|
@ -233,20 +236,24 @@ int
|
||||||
lzma_decompress(void *src, uint64_t srclen, void *dst,
|
lzma_decompress(void *src, uint64_t srclen, void *dst,
|
||||||
uint64_t *dstlen, int level, uchar_t chdr, int btype, void *data)
|
uint64_t *dstlen, int level, uchar_t chdr, int btype, void *data)
|
||||||
{
|
{
|
||||||
uint64_t _srclen;
|
SizeT _srclen;
|
||||||
const uchar_t *_src;
|
const uchar_t *_src;
|
||||||
SRes res;
|
SRes res;
|
||||||
ELzmaStatus status;
|
ELzmaStatus status;
|
||||||
|
SizeT dlen;
|
||||||
|
|
||||||
_srclen = srclen - LZMA_PROPS_SIZE;
|
_srclen = srclen - LZMA_PROPS_SIZE;
|
||||||
_src = (uchar_t *)src + LZMA_PROPS_SIZE;
|
_src = (uchar_t *)src + LZMA_PROPS_SIZE;
|
||||||
|
dlen = *dstlen;
|
||||||
|
|
||||||
if ((res = LzmaDecode((uchar_t *)dst, dstlen, _src, &_srclen,
|
if ((res = LzmaDecode((uchar_t *)dst, &dlen, _src, &_srclen,
|
||||||
(uchar_t *)src, LZMA_PROPS_SIZE, LZMA_FINISH_ANY,
|
(uchar_t *)src, LZMA_PROPS_SIZE, LZMA_FINISH_ANY,
|
||||||
&status, &g_Alloc)) != SZ_OK) {
|
&status, &g_Alloc)) != SZ_OK) {
|
||||||
|
*dstlen = dlen;
|
||||||
lzerr(res, 0);
|
lzerr(res, 0);
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
*dstlen = dlen;
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,11 +38,6 @@
|
||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#if defined(sun) || defined(__sun)
|
|
||||||
#include <sys/byteorder.h>
|
|
||||||
#else
|
|
||||||
#include <byteswap.h>
|
|
||||||
#endif
|
|
||||||
#include <libgen.h>
|
#include <libgen.h>
|
||||||
#include <utils.h>
|
#include <utils.h>
|
||||||
#include <pcompress.h>
|
#include <pcompress.h>
|
||||||
|
|
|
@ -174,7 +174,7 @@ ppmd_decompress(void *src, uint64_t srclen, void *dst,
|
||||||
CPpmd8 *_ppmd = (CPpmd8 *)data;
|
CPpmd8 *_ppmd = (CPpmd8 *)data;
|
||||||
Byte *_src = (Byte *)src;
|
Byte *_src = (Byte *)src;
|
||||||
Byte *_dst = (Byte *)dst;
|
Byte *_dst = (Byte *)dst;
|
||||||
uint64_t i;
|
SizeT i;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
_ppmd->buf = (Byte *)_src;
|
_ppmd->buf = (Byte *)_src;
|
||||||
|
|
|
@ -133,7 +133,7 @@ NOINLINE_ATTR cpuid_get_raw_data(struct cpu_raw_data_t* data)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
cpuid_basic_identify(processor_info_t *pc)
|
cpuid_basic_identify(processor_cap_t *pc)
|
||||||
{
|
{
|
||||||
struct cpu_raw_data_t raw;
|
struct cpu_raw_data_t raw;
|
||||||
cpuid_get_raw_data(&raw);
|
cpuid_get_raw_data(&raw);
|
||||||
|
|
|
@ -72,7 +72,7 @@ typedef struct {
|
||||||
int xop_avail;
|
int xop_avail;
|
||||||
int aes_avail;
|
int aes_avail;
|
||||||
proc_type_t proc_type;
|
proc_type_t proc_type;
|
||||||
} processor_info_t;
|
} processor_cap_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This contains only the most basic CPU data, required to do identification
|
* This contains only the most basic CPU data, required to do identification
|
||||||
|
@ -94,7 +94,7 @@ struct cpu_raw_data_t {
|
||||||
};
|
};
|
||||||
|
|
||||||
void cpuid_get_raw_data(struct cpu_raw_data_t* data);
|
void cpuid_get_raw_data(struct cpu_raw_data_t* data);
|
||||||
void cpuid_basic_identify(processor_info_t *pc);
|
void cpuid_basic_identify(processor_cap_t *pc);
|
||||||
|
|
||||||
#endif /* __x86_64__ */
|
#endif /* __x86_64__ */
|
||||||
|
|
||||||
|
|
|
@ -50,12 +50,17 @@
|
||||||
#include <sys/sysinfo.h>
|
#include <sys/sysinfo.h>
|
||||||
#else
|
#else
|
||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
|
#include <mach/mach.h>
|
||||||
|
#include <mach/mach_host.h>
|
||||||
|
#include <mach/mach_time.h>
|
||||||
|
|
||||||
|
static mach_timebase_info_data_t sTimebaseInfo;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _IN_UTILS_
|
#define _IN_UTILS_
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
processor_info_t proc_info;
|
processor_cap_t proc_info;
|
||||||
pthread_mutex_t f_mutex = PTHREAD_MUTEX_INITIALIZER;
|
pthread_mutex_t f_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
static int cur_log_level = 2;
|
static int cur_log_level = 2;
|
||||||
static log_dest_t ldest = {LOG_OUTPUT, LOG_INFO, NULL};
|
static log_dest_t ldest = {LOG_OUTPUT, LOG_INFO, NULL};
|
||||||
|
@ -66,6 +71,9 @@ void
|
||||||
init_pcompress() {
|
init_pcompress() {
|
||||||
cpuid_basic_identify(&proc_info);
|
cpuid_basic_identify(&proc_info);
|
||||||
XXH32_module_init();
|
XXH32_module_init();
|
||||||
|
#ifdef __APPLE__
|
||||||
|
(void) mach_timebase_info(&sTimebaseInfo);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -349,13 +357,38 @@ set_threadcounts(algo_props_t *props, int *nthreads, int nprocs, algo_threads_ty
|
||||||
uint64_t
|
uint64_t
|
||||||
get_total_ram()
|
get_total_ram()
|
||||||
{
|
{
|
||||||
|
#ifndef __APPLE__
|
||||||
uint64_t phys_pages, page_size;
|
uint64_t phys_pages, page_size;
|
||||||
|
|
||||||
page_size = sysconf(_SC_PAGESIZE);
|
page_size = sysconf(_SC_PAGESIZE);
|
||||||
phys_pages = sysconf(_SC_PHYS_PAGES);
|
phys_pages = sysconf(_SC_PHYS_PAGES);
|
||||||
return (phys_pages * page_size);
|
return (phys_pages * page_size);
|
||||||
|
#else
|
||||||
|
int mib[2];
|
||||||
|
int64_t size;
|
||||||
|
size_t len;
|
||||||
|
mib[0] = CTL_HW;
|
||||||
|
mib[1] = HW_MEMSIZE;
|
||||||
|
size = 0;
|
||||||
|
len = sizeof (size);
|
||||||
|
if (sysctl(mib, 2, &size, &len, NULL, 0) == 0)
|
||||||
|
return (uint64_t)size;
|
||||||
|
return (ONE_GB);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
int
|
||||||
|
clock_gettime(int clk_id, struct timespec *ts)
|
||||||
|
{
|
||||||
|
if (clk_id == CLOCK_MONOTONIC) {
|
||||||
|
uint64_t abstime = mach_absolute_time();
|
||||||
|
return (abstime * sTimebaseInfo.numer / sTimebaseInfo.denom);
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
double
|
double
|
||||||
get_wtime_millis(void)
|
get_wtime_millis(void)
|
||||||
{
|
{
|
||||||
|
@ -380,15 +413,37 @@ get_mb_s(uint64_t bytes, double strt, double en)
|
||||||
void
|
void
|
||||||
get_sys_limits(my_sysinfo *msys_info)
|
get_sys_limits(my_sysinfo *msys_info)
|
||||||
{
|
{
|
||||||
struct sysinfo sys_info;
|
|
||||||
unsigned long totram;
|
unsigned long totram;
|
||||||
int rv;
|
int rv;
|
||||||
char *val;
|
char *val;
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
mach_port_t host_port = mach_host_self();
|
||||||
|
unsigned int host_size = HOST_VM_INFO64_COUNT;
|
||||||
|
vm_size_t pagesize;
|
||||||
|
vm_statistics64_data_t vm_stat;
|
||||||
|
|
||||||
|
host_page_size(host_port, &pagesize);
|
||||||
|
rv = host_statistics64(host_port, HOST_VM_INFO64, (host_info64_t)&vm_stat, &host_size);
|
||||||
|
if (rv != KERN_SUCCESS) {
|
||||||
|
vm_stat.free_count = (100 * 1024 * 1024) / pagesize; // 100M arbitrary
|
||||||
|
}
|
||||||
|
uint64_t mem_used = (vm_stat.active_count + vm_stat.inactive_count + vm_stat.wire_count) * pagesize;
|
||||||
|
msys_info->freeram = vm_stat.free_count * pagesize;
|
||||||
|
msys_info->totalram = mem_used + msys_info->freeram;
|
||||||
|
msys_info->totalswap = 0;
|
||||||
|
msys_info->freeswap = 0;
|
||||||
|
msys_info->mem_unit = pagesize;
|
||||||
|
msys_info->sharedram = vm_stat.wire_count * pagesize;
|
||||||
|
|
||||||
|
#else
|
||||||
|
struct sysinfo sys_info;
|
||||||
rv = sysinfo(&sys_info);
|
rv = sysinfo(&sys_info);
|
||||||
|
|
||||||
if (rv == -1) {
|
if (rv == -1) {
|
||||||
|
memset(&sys_info, 0, sizeof (struct sysinfo));
|
||||||
sys_info.freeram = 100 * 1024 * 1024; // 100M arbitrary
|
sys_info.freeram = 100 * 1024 * 1024; // 100M arbitrary
|
||||||
|
sys_info.mem_unit = 1;
|
||||||
}
|
}
|
||||||
msys_info->totalram = sys_info.totalram * sys_info.mem_unit;
|
msys_info->totalram = sys_info.totalram * sys_info.mem_unit;
|
||||||
msys_info->freeram = sys_info.freeram * sys_info.mem_unit + sys_info.bufferram * sys_info.mem_unit;
|
msys_info->freeram = sys_info.freeram * sys_info.mem_unit + sys_info.bufferram * sys_info.mem_unit;
|
||||||
|
@ -396,13 +451,14 @@ get_sys_limits(my_sysinfo *msys_info)
|
||||||
msys_info->freeswap = sys_info.freeswap * sys_info.mem_unit;
|
msys_info->freeswap = sys_info.freeswap * sys_info.mem_unit;
|
||||||
msys_info->mem_unit = sys_info.mem_unit;
|
msys_info->mem_unit = sys_info.mem_unit;
|
||||||
msys_info->sharedram = sys_info.sharedram * sys_info.mem_unit;
|
msys_info->sharedram = sys_info.sharedram * sys_info.mem_unit;
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If free memory is less than half of total memory (excluding shared allocations),
|
* If free memory is less than half of total memory (excluding shared allocations),
|
||||||
* and at least 75% of swap is free then adjust free memory value to 75% of
|
* and at least 75% of swap is free then adjust free memory value to 75% of
|
||||||
* total memory excluding shared allocations.
|
* total memory excluding shared allocations.
|
||||||
*/
|
*/
|
||||||
totram = msys_info->totalram - sys_info.sharedram;
|
totram = msys_info->totalram - msys_info->sharedram;
|
||||||
if (msys_info->freeram <= (totram >> 1) &&
|
if (msys_info->freeram <= (totram >> 1) &&
|
||||||
msys_info->freeswap >= ((msys_info->totalswap >> 1) + (msys_info->totalswap >> 2))) {
|
msys_info->freeswap >= ((msys_info->totalswap >> 1) + (msys_info->totalswap >> 2))) {
|
||||||
msys_info->freeram = (totram >> 1) + (totram >> 2);
|
msys_info->freeram = (totram >> 1) + (totram >> 2);
|
||||||
|
|
|
@ -40,6 +40,13 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <cpuid.h>
|
#include <cpuid.h>
|
||||||
|
#if defined(sun) || defined(__sun)
|
||||||
|
#include <sys/byteorder.h>
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
#include <libkern/OSByteOrder.h>
|
||||||
|
#else
|
||||||
|
#include <byteswap.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -52,6 +59,7 @@ extern "C" {
|
||||||
|
|
||||||
#define ONE_PB (1125899906842624ULL)
|
#define ONE_PB (1125899906842624ULL)
|
||||||
#define ONE_TB (1099511627776ULL)
|
#define ONE_TB (1099511627776ULL)
|
||||||
|
#define ONE_GB (1024UL * 1024UL * 1024UL)
|
||||||
#define TWO_MB (2UL * 1024UL * 1024UL)
|
#define TWO_MB (2UL * 1024UL * 1024UL)
|
||||||
#define FOUR_MB FOURM
|
#define FOUR_MB FOURM
|
||||||
#define EIGHT_MB EIGHTM
|
#define EIGHT_MB EIGHTM
|
||||||
|
@ -89,9 +97,15 @@ typedef int32_t bsize_t;
|
||||||
# define ntohll(x) (x)
|
# define ntohll(x) (x)
|
||||||
# endif
|
# endif
|
||||||
# if !defined(sun) && !defined (__sun)
|
# if !defined(sun) && !defined (__sun)
|
||||||
|
# if defined(__APPLE__)
|
||||||
|
# define LE64(x) OSSwapInt64(x)
|
||||||
|
# define LE32(x) OSSwapInt32(x)
|
||||||
|
# define LE16(x) OSSwapInt16(x)
|
||||||
|
# else
|
||||||
# define LE64(x) __bswap_64(x)
|
# define LE64(x) __bswap_64(x)
|
||||||
# define LE32(x) __bswap_32(x)
|
# define LE32(x) __bswap_32(x)
|
||||||
# define LE16(x) __bswap_16(x)
|
# define LE16(x) __bswap_16(x)
|
||||||
|
# endif
|
||||||
# else
|
# else
|
||||||
# define LE64(x) BSWAP_64(x)
|
# define LE64(x) BSWAP_64(x)
|
||||||
# define LE32(x) BSWAP_32(x)
|
# define LE32(x) BSWAP_32(x)
|
||||||
|
@ -99,6 +113,14 @@ typedef int32_t bsize_t;
|
||||||
# endif
|
# endif
|
||||||
#else
|
#else
|
||||||
# if !defined(sun) && !defined (__sun)
|
# if !defined(sun) && !defined (__sun)
|
||||||
|
# if defined(__APPLE__)
|
||||||
|
# ifndef htonll
|
||||||
|
# define htonll(x) OSSwapInt64(x)
|
||||||
|
# endif
|
||||||
|
# ifndef ntohll
|
||||||
|
# define ntohll(x) OSSwapInt64(x)
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
# ifndef htonll
|
# ifndef htonll
|
||||||
# define htonll(x) __bswap_64(x)
|
# define htonll(x) __bswap_64(x)
|
||||||
# endif
|
# endif
|
||||||
|
@ -106,6 +128,7 @@ typedef int32_t bsize_t;
|
||||||
# define ntohll(x) __bswap_64(x)
|
# define ntohll(x) __bswap_64(x)
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
|
# endif
|
||||||
# define LE64(x) (x)
|
# define LE64(x) (x)
|
||||||
# define LE32(x) (x)
|
# define LE32(x) (x)
|
||||||
# define LE16(x) (x)
|
# define LE16(x) (x)
|
||||||
|
@ -164,6 +187,11 @@ typedef int32_t bsize_t;
|
||||||
#define I32_P(x) *((int32_t *)(x))
|
#define I32_P(x) *((int32_t *)(x))
|
||||||
#define I16_P(x) *((int16_t *)(x))
|
#define I16_P(x) *((int16_t *)(x))
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#define CLOCK_MONOTONIC 0
|
||||||
|
#define CLOCK_REALTIME 1
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Public checksum properties. CKSUM_MAX_BYTES must be updated if a
|
* Public checksum properties. CKSUM_MAX_BYTES must be updated if a
|
||||||
* newer larger checksum is added to the list.
|
* newer larger checksum is added to the list.
|
||||||
|
@ -295,7 +323,7 @@ typedef enum {
|
||||||
#define PC_TYPE(x) ((x) & PC_TYPE_MASK)
|
#define PC_TYPE(x) ((x) & PC_TYPE_MASK)
|
||||||
|
|
||||||
#ifndef _IN_UTILS_
|
#ifndef _IN_UTILS_
|
||||||
extern processor_info_t proc_info;
|
extern processor_cap_t proc_info;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern void err_exit(int show_errno, const char *format, ...);
|
extern void err_exit(int show_errno, const char *format, ...);
|
||||||
|
|
Loading…
Reference in a new issue