|
|
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
|