Blame include/dalist/dalist.h

e09104
#ifndef DALIST_H
e09104
#define DALIST_H
e09104
e09104
#include "dalist_api.h"
e09104
e09104
#ifdef __cplusplus
e09104
extern "C" {
e09104
#endif
e09104
e09104
/* dalist node types */
e09104
enum dalist_node_types {
e09104
	DALIST_NODE,
e09104
	DALIST_NODE_EX,
e09104
};
e09104
e09104
e09104
/* dalist caller-provided memory allocation methods */
e09104
enum dalist_memfn {
e09104
	DALIST_MEMFN_CUSTOM,
e09104
	DALIST_MEMFN_MMAP,
e09104
	DALIST_MEMFN_MALLOC,
e09104
	DALIST_MEMFN_NT_ALLOCATE_VIRTUAL_MEMORY,
e09104
};
e09104
e09104
e09104
/* dalist debug environments */
e09104
enum dalist_dbgenv {
e09104
	DALIST_DEBUG_ENV_POSIX,
e09104
	DALIST_DEBUG_ENV_NT,
e09104
};
e09104
e09104
e09104
/* dalist return values */
e09104
#define DALIST_OK			(0x0)
e09104
#define DALIST_EINTERNAL		(0xD0000000)	/* internal error */
e09104
#define DALIST_EMEMFN			(0xD0000001)	/* memory allocation error */
e09104
#define DALIST_EMEMBLOCK		(0xD0000002)	/* invalid memory block */
e09104
#define DALIST_ELIST			(0xD0000003)	/* invalid list */
e09104
#define DALIST_ENODE			(0xD0000004)	/* invalid node */
e09104
#define DALIST_EPARAMMIX		(0xD0000005)	/* invalid parameter mix */
e09104
#define DALIST_EKEYEXISTS		(0xD0000006)	/* key already exists */
e09104
#define DALIST_ELISTNOTEMPTY		(0xD0000007)	/* null insertion point with non-empty list */
e09104
e09104
/* dalist debug return values */
e09104
#define DALIST_EDEBUGSTRUCT		(0xD0001000)	/* invalid debug structure */
e09104
#define DALIST_EDEBUGENV		(0xD0001001)	/* invalid debug environment */
e09104
#define DALIST_EDEBUGSPRINTF		(0xD0001002)	/* invalid debug pointer to sprintf */
e09104
#define DALIST_EDEBUGWRITE		(0xD0001003)	/* invalid debug pointer to write (posix) */
e09104
#define DALIST_EDEBUGWRITEFILE		(0xD0001004)	/* invalid debug pointer to zw_write_file (nt) */
e09104
e09104
e09104
/* dalist node flag bits */
e09104
#define DALIST_NODE_TYPE_NONE		(0x00u)
e09104
#define DALIST_NODE_TYPE_EXISTING	(0x01u)
e09104
#define DALIST_NODE_TYPE_NEW		(0x02u)
e09104
#define DALIST_NODE_TYPE_DELETED	(0x04u)
e09104
#define DALIST_NODE_MEM_BLOCK_BASE	(0x80u)
e09104
e09104
e09104
struct dalist_node {
e09104
	struct dalist_node *	prev;
e09104
	struct dalist_node *	next;
e09104
	uintptr_t		any;
e09104
};
e09104
e09104
e09104
struct dalist {
e09104
	struct dalist_node *	head;
e09104
	struct dalist_node *	tail;
e09104
};
e09104
e09104
e09104
struct dalist_node_ex {
e09104
	struct dalist_node_ex *	prev;
e09104
	struct dalist_node_ex *	next;
e09104
	uintptr_t		key;
e09104
	uintptr_t		flags;
e09104
	uintptr_t		dblock;
e09104
};
e09104
e09104
e09104
struct dalist_debug;
e09104
e09104
struct dalist_ex {
e09104
	void *			head;		/************************************/
e09104
	void *			tail;		/* head, tail, free:                */
e09104
	void *			free;		/* dalist_node when dblock_size is  */
e09104
	uintptr_t *		bookmarks;	/* zero, dalist_node_ex otherwise.  */
e09104
	size_t			dblock_size;	/*                                  */
e09104
	size_t			lblock_size;	/* lblock_size:                     */
e09104
	void *			memfn_ptr;	/* used when memfn_method is mmap   */
e09104
	enum dalist_memfn	memfn_method;	/* or nt_allocate_virtual_memory    */
e09104
	int			memfn_status;	/* as the system call's alloc_size  */
e09104
	int			mmap_prot;	/* argument.                        */
e09104
	int			mmap_flags;	/*                                  */
e09104
	int			mmap_fildes;	/*                                  */
e09104
	intptr_t		mmap_offset;	/************************************/
e09104
	struct dalist_debug *	debug;
e09104
e09104
	struct dalist_info {
e09104
		uintptr_t	list_nodes;
e09104
		uintptr_t	free_nodes;
e09104
		uintptr_t	bookmark_from;
e09104
		uintptr_t	bookmark_to;
e09104
		uintptr_t	bookmark_key_min;
e09104
		uintptr_t	bookmark_key_max;
e09104
		uintptr_t	nodes_below_first_bookmark;
e09104
		uintptr_t	nodes_above_last_bookmark;
e09104
	} info;
e09104
};
e09104
e09104
e09104
/* signatures for caller-provided debug output functions */
e09104
typedef int	__cdecl	  dalist_sprintf(char * buffer, const char * format, ...);
e09104
typedef ssize_t	__cdecl	  dalist_write(int fildes, const void *buf, size_t nbyte);
e09104
typedef int32_t __stdcall dalist_write_file(
e09104
	void *		hfile,
e09104
	void *		hevent,
e09104
	void *		apc_routine,
e09104
	void * 		apc_context,
e09104
	void * 		io_status_block,
e09104
	void * 		buffer,
e09104
	uint32_t	bytes_sent,
e09104
	int64_t *	byte_offset,
e09104
	uint32_t *	key);
e09104
e09104
e09104
/* debug */
e09104
struct dalist_debug {
e09104
	enum dalist_dbgenv	dbgenv;
e09104
	dalist_sprintf *	sprintf;	/* required (all) */
e09104
	dalist_write *		write;		/* required (posix only) */
e09104
	dalist_write_file *	zw_write_file;	/* required (nt only) */
e09104
};
e09104
e09104
e09104
/* signatures for caller-provided memory allocation functions */
e09104
typedef void * __cdecl dalist_memfn_mmap(
e09104
	void *		addr,
e09104
	size_t		alloc_size,
e09104
	int		prot,
e09104
	int		flags,
e09104
	int		fildes,
e09104
	intptr_t	offset);
e09104
e09104
e09104
typedef void * __cdecl dalist_memfn_malloc(
e09104
	size_t		alloc_size);
e09104
e09104
e09104
typedef int32_t __stdcall dalist_memfn_nt_allocvm(
e09104
	void *		hprocess,
e09104
	void **		base_address,
e09104
	uint32_t	zero_bits,
e09104
	size_t *	alloc_size,
e09104
	uint32_t	alloc_type,
e09104
	uint32_t	protect);
e09104
e09104
e09104
/**
e09104
 *  dalist_memfn_custom:
e09104
 *  must return either DALIST_OK or DALIST_EMEMFN;
e09104
 *  may update the list's memfn_status member
e09104
**/
e09104
typedef int __cdecl dalist_memfn_custom(
e09104
	struct dalist_ex *	dlist,
e09104
	void **			addr,
e09104
	size_t *		alloc_size);
e09104
e09104
dalist_api
e09104
int dalist_init(struct dalist *	dlist);
e09104
e09104
dalist_api
e09104
int dalist_init_ex(
e09104
	struct dalist_ex *	dlist,
e09104
	size_t			dblock_size,
e09104
	size_t			lblock_size,
e09104
	void *			memfn_ptr,
e09104
	enum dalist_memfn	memfn_method);
e09104
e09104
dalist_api
e09104
int dalist_insert_before(
e09104
	struct dalist *		dlist,
e09104
	struct dalist_node *	lnode,
e09104
	struct dalist_node *	nnode);
e09104
e09104
dalist_api
e09104
int dalist_insert_after(
e09104
	struct dalist *		dlist,
e09104
	struct dalist_node *	lnode,
e09104
	struct dalist_node *	nnode);
e09104
e09104
dalist_api
e09104
int dalist_get_free_node(
e09104
	struct dalist_ex *	dlist,
e09104
	void **			fnode);
e09104
e09104
dalist_api
e09104
int dalist_deposit_free_node(
e09104
	struct dalist_ex *	dlist,
e09104
	void *			fnode);
e09104
e09104
dalist_api
e09104
int dalist_deposit_memory_block(
e09104
	struct dalist_ex *	dlist,
e09104
	void *			addr,
e09104
	size_t			alloc_size);
e09104
e09104
dalist_api
e09104
int dalist_unlink_node(
e09104
	struct dalist *		dlist,
e09104
	struct dalist_node *	node);
e09104
e09104
dalist_api
e09104
int dalist_unlink_node_ex(
e09104
	struct dalist_ex *	dlist,
e09104
	struct dalist_node_ex *	node);
e09104
e09104
dalist_api
e09104
int dalist_discard_node(
e09104
	struct dalist_ex *	dlist,
e09104
	struct dalist_node_ex *	node);
e09104
e09104
dalist_api
e09104
int dalist_get_node_by_key(
e09104
	struct dalist_ex *	dlist,
e09104
	struct dalist_node_ex **node,
e09104
	uintptr_t		key,
e09104
	uintptr_t		get_flags,
e09104
	uintptr_t *		node_flags);
e09104
e09104
dalist_api
e09104
int dalist_insert_node_by_key(
e09104
	struct dalist_ex *	dlist,
e09104
	struct dalist_node_ex *	node);
e09104
e09104
/* debug routines */
e09104
dalist_api
e09104
int dalist_debug_setup(
e09104
	struct dalist_ex *	dlist,
e09104
	struct dalist_debug *	dlist_debug,
e09104
	enum dalist_dbgenv	dbgenv,
e09104
	dalist_sprintf *	pfn_sprintf,
e09104
	dalist_write *		pfn_write,
e09104
	dalist_write_file *	pfn_write_file);
e09104
e09104
dalist_api
e09104
int dalist_debug_print(
e09104
	struct dalist_ex *	dlist,
e09104
	intptr_t		fildes_or_hfile);
e09104
e09104
e09104
#ifdef __cplusplus
e09104
}
e09104
#endif
e09104
#endif