diff options
Diffstat (limited to 'lib/libspl/include/umem.h')
-rw-r--r-- | lib/libspl/include/umem.h | 231 |
1 files changed, 0 insertions, 231 deletions
diff --git a/lib/libspl/include/umem.h b/lib/libspl/include/umem.h deleted file mode 100644 index 3e44610e4e21..000000000000 --- a/lib/libspl/include/umem.h +++ /dev/null @@ -1,231 +0,0 @@ -// SPDX-License-Identifier: CDDL-1.0 -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or https://opensource.org/licenses/CDDL-1.0. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _LIBSPL_UMEM_H -#define _LIBSPL_UMEM_H - -/* - * XXX: We should use the real portable umem library if it is detected - * at configure time. However, if the library is not available, we can - * use a trivial malloc based implementation. This obviously impacts - * performance, but unless you are using a full userspace build of zpool for - * something other than ztest, you are likely not going to notice or care. - * - * https://labs.omniti.com/trac/portableumem - */ -#include <sys/debug.h> - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -#ifdef __cplusplus -extern "C" { -#endif - -typedef void vmem_t; - -/* - * Flags for umem_alloc/umem_free - */ -#define UMEM_DEFAULT 0x0000 /* normal -- may fail */ -#define UMEM_NOFAIL 0x0100 /* Never fails */ - -/* - * Flags for umem_cache_create() - */ -#define UMC_NODEBUG 0x00020000 - -#define UMEM_CACHE_NAMELEN 31 - -typedef int umem_nofail_callback_t(void); -typedef int umem_constructor_t(void *, void *, int); -typedef void umem_destructor_t(void *, void *); -typedef void umem_reclaim_t(void *); - -typedef struct umem_cache { - char cache_name[UMEM_CACHE_NAMELEN + 1]; - size_t cache_bufsize; - size_t cache_align; - umem_constructor_t *cache_constructor; - umem_destructor_t *cache_destructor; - umem_reclaim_t *cache_reclaim; - void *cache_private; - void *cache_arena; - int cache_cflags; -} umem_cache_t; - -/* Prototypes for functions to provide defaults for umem envvars */ -const char *_umem_debug_init(void); -const char *_umem_options_init(void); -const char *_umem_logging_init(void); - -__attribute__((malloc, alloc_size(1))) -static inline void * -umem_alloc(size_t size, int flags) -{ - void *ptr = NULL; - - do { - ptr = malloc(size); - } while (ptr == NULL && (flags & UMEM_NOFAIL)); - - return (ptr); -} - -__attribute__((malloc, alloc_size(1))) -static inline void * -umem_alloc_aligned(size_t size, size_t align, int flags) -{ - void *ptr = NULL; - int rc; - - do { - rc = posix_memalign(&ptr, align, size); - } while (rc == ENOMEM && (flags & UMEM_NOFAIL)); - - if (rc == EINVAL) { - fprintf(stderr, "%s: invalid memory alignment (%zd)\n", - __func__, align); - if (flags & UMEM_NOFAIL) - abort(); - return (NULL); - } - - return (ptr); -} - -__attribute__((malloc, alloc_size(1))) -static inline void * -umem_zalloc(size_t size, int flags) -{ - void *ptr = NULL; - - ptr = umem_alloc(size, flags); - if (ptr) - memset(ptr, 0, size); - - return (ptr); -} - -static inline void -umem_free(const void *ptr, size_t size __maybe_unused) -{ - free((void *)ptr); -} - -/* - * umem_free_aligned was added for supporting portability - * with non-POSIX platforms that require a different free - * to be used with aligned allocations. - */ -static inline void -umem_free_aligned(void *ptr, size_t size __maybe_unused) -{ -#ifndef _WIN32 - free((void *)ptr); -#else - _aligned_free(ptr); -#endif -} - -static inline void -umem_nofail_callback(umem_nofail_callback_t *cb __maybe_unused) -{} - -static inline umem_cache_t * -umem_cache_create( - const char *name, size_t bufsize, size_t align, - umem_constructor_t *constructor, - umem_destructor_t *destructor, - umem_reclaim_t *reclaim, - void *priv, void *vmp, int cflags) -{ - umem_cache_t *cp; - - cp = (umem_cache_t *)umem_alloc(sizeof (umem_cache_t), UMEM_DEFAULT); - if (cp) { - strlcpy(cp->cache_name, name, UMEM_CACHE_NAMELEN); - cp->cache_bufsize = bufsize; - cp->cache_align = align; - cp->cache_constructor = constructor; - cp->cache_destructor = destructor; - cp->cache_reclaim = reclaim; - cp->cache_private = priv; - cp->cache_arena = vmp; - cp->cache_cflags = cflags; - } - - return (cp); -} - -static inline void -umem_cache_destroy(umem_cache_t *cp) -{ - umem_free(cp, sizeof (umem_cache_t)); -} - -__attribute__((malloc)) -static inline void * -umem_cache_alloc(umem_cache_t *cp, int flags) -{ - void *ptr = NULL; - - if (cp->cache_align != 0) - ptr = umem_alloc_aligned( - cp->cache_bufsize, cp->cache_align, flags); - else - ptr = umem_alloc(cp->cache_bufsize, flags); - - if (ptr && cp->cache_constructor) - cp->cache_constructor(ptr, cp->cache_private, UMEM_DEFAULT); - - return (ptr); -} - -static inline void -umem_cache_free(umem_cache_t *cp, void *ptr) -{ - if (cp->cache_destructor) - cp->cache_destructor(ptr, cp->cache_private); - - if (cp->cache_align != 0) - umem_free_aligned(ptr, cp->cache_bufsize); - else - umem_free(ptr, cp->cache_bufsize); -} - -static inline void -umem_cache_reap_now(umem_cache_t *cp __maybe_unused) -{ -} - -#ifdef __cplusplus -} -#endif - -#endif |