implement reallocarray on macOS
This commit is contained in:
parent
89a3585c7f
commit
7fae216ccf
3
.idea/misc.xml
generated
3
.idea/misc.xml
generated
@ -1,4 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CMakePythonSetting">
|
||||
<option name="pythonIntegrationState" value="YES" />
|
||||
</component>
|
||||
<component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" />
|
||||
</project>
|
@ -3,6 +3,8 @@
|
||||
|
||||
#if defined(__APPLE__) || defined(__MACH__)
|
||||
|
||||
#include <time.h>
|
||||
|
||||
typedef struct {
|
||||
double total_user_time;
|
||||
double total_kernel_time;
|
||||
@ -18,6 +20,7 @@ typedef struct {
|
||||
|
||||
ProcessData *new_ProcessData();
|
||||
int update_process(pid_t pid, ProcessData *proc);
|
||||
void *reallocarray(void *optr, size_t nmemb, size_t size);
|
||||
|
||||
#endif /* defined(__APPLE__) || defined(__MACH__) */
|
||||
#endif /* LIBFLINT_MACOS_H */
|
||||
|
37
src/macos.c
37
src/macos.c
@ -1,6 +1,7 @@
|
||||
#include <libproc.h>
|
||||
#include <time.h>
|
||||
#include <mach/mach_time.h>
|
||||
#include <sys/errno.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "lfmacos.h"
|
||||
@ -43,3 +44,39 @@ int update_process(pid_t pid, ProcessData *proc) {
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* reallocarray is reimplemented here for macOS because Apple doesn't expose
|
||||
* their implementation. This is taken straight from the OpenBSD source as
|
||||
* shown in the below copyright notice
|
||||
*/
|
||||
|
||||
/* $OpenBSD: reallocarray.c,v 1.2 2014/12/08 03:45:00 bcook Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2008 Otto Moerbeek <otto@drijf.net>
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* OPENBSD ORIGINAL: lib/libc/stdlib/reallocarray.c */
|
||||
|
||||
#define MUL_NO_OVERFLOW ((size_t)1 << (sizeof(size_t) * 4))
|
||||
|
||||
void *reallocarray(void *optr, size_t nmemb, size_t size)
|
||||
{
|
||||
if ((nmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) &&
|
||||
nmemb > 0 && SIZE_MAX / nmemb < size) {
|
||||
errno = ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
return realloc(optr, size * nmemb);
|
||||
}
|
||||
|
@ -5,6 +5,10 @@
|
||||
#include <bsd/stdlib.h>
|
||||
#endif
|
||||
|
||||
#if defined(__APPLE__) || defined(__MACH__)
|
||||
#include "lfmacos.h"
|
||||
#endif
|
||||
|
||||
#include "lfvector.h"
|
||||
|
||||
#define VEC_INIT_CAP 2
|
||||
@ -32,11 +36,7 @@ int vec_init_with_capacity(Vector *vec, void (*destroy)(void *data), size_t capa
|
||||
static int vec_grow(Vector *const vec) {
|
||||
vec->capacity *= 2;
|
||||
|
||||
#ifdef __OpenBSD__
|
||||
vec->elements = reallocarray(vec->elements, vec->capacity, sizeof(void *));
|
||||
#else
|
||||
vec->elements = reallocf(vec->elements, sizeof(void *) * vec->capacity);
|
||||
#endif
|
||||
|
||||
if (vec->elements == NULL) {
|
||||
return -1;
|
||||
|
Loading…
x
Reference in New Issue
Block a user