changed the doubly linked list to circular in idmap-imp.h
started writing some code to implement gc
This commit is contained in:
parent
bc87c486da
commit
1285d77c1e
@ -1,7 +1,7 @@
|
||||
# Hawk
|
||||
|
||||
- [Language](#language)
|
||||
- [Basic Modules](#basic-modules)
|
||||
- [Modules](#modules)
|
||||
- [Embedding Guide](#embedding-guide)
|
||||
|
||||
## Language <a name="language"></a>
|
||||
@ -289,7 +289,7 @@ and represents the value of 0.
|
||||
0b # 0b0 but not desirable.
|
||||
|
||||
|
||||
### Module
|
||||
### Modules <a name="modules"></a>
|
||||
|
||||
Hawk supports various modules.
|
||||
|
||||
@ -545,6 +545,44 @@ Socket functions are available.
|
||||
sys::close (s);
|
||||
}
|
||||
|
||||
|
||||
### ffi
|
||||
|
||||
|
||||
### mysql
|
||||
|
||||
BEGIN {
|
||||
mysql = mysql::open();
|
||||
|
||||
if (mysql::connect(mysql, "10.30.1.219", "pdns", "pdns", "pdns") <= -1)
|
||||
{
|
||||
print "connect error -", mysql::errmsg();
|
||||
}
|
||||
|
||||
if (mysql::query(mysql, "select * from records") <= -1)
|
||||
{
|
||||
print "query error -", mysql::errmsg();
|
||||
}
|
||||
|
||||
result = mysql::store_result(mysql);
|
||||
if (result <= -1)
|
||||
{
|
||||
print "store result error - ", mysql::errmsg();
|
||||
}
|
||||
|
||||
while (mysql::fetch_row(result, row) > 0)
|
||||
{
|
||||
ncols = length(row);
|
||||
for (i = 0; i < ncols; i++) print row[i];
|
||||
print "----";
|
||||
}
|
||||
|
||||
mysql::free_result(result);
|
||||
|
||||
mysql::close(mysql);
|
||||
}
|
||||
|
||||
|
||||
### Incompatibility with AWK
|
||||
|
||||
#### Parameter passing
|
||||
@ -577,14 +615,6 @@ There are subtle differences when you put an expression for a position variable.
|
||||
| $(++$(++i)) | OK | syntax error |
|
||||
|
||||
|
||||
## Basic Modules <a name="basic-modules"></a>
|
||||
|
||||
### sys
|
||||
|
||||
### ffi
|
||||
|
||||
### mysql
|
||||
|
||||
## Embedding Guide <a name="embedding-guide"></a>
|
||||
|
||||
To use hawk in your program, do the followings:
|
||||
|
@ -80,6 +80,7 @@ libhawk_la_SOURCES = \
|
||||
gem-nwif2.c \
|
||||
hawk-prv.h \
|
||||
hawk.c \
|
||||
idmap-imp.h \
|
||||
mb8.c \
|
||||
misc-prv.h \
|
||||
misc.c \
|
||||
@ -184,7 +185,6 @@ if ENABLE_STATIC_MODULE
|
||||
# STATIC MODULES BUILT INTO MAIN LIBRARY
|
||||
##################################################
|
||||
libhawk_la_SOURCES += \
|
||||
imap-imp.h \
|
||||
mod-math.c mod-math.h \
|
||||
mod-str.c mod-str.h \
|
||||
mod-sys.c mod-sys.h
|
||||
|
@ -100,7 +100,6 @@ host_triplet = @host@
|
||||
# STATIC MODULES BUILT INTO MAIN LIBRARY
|
||||
##################################################
|
||||
@ENABLE_STATIC_MODULE_TRUE@am__append_9 = \
|
||||
@ENABLE_STATIC_MODULE_TRUE@ imap-imp.h \
|
||||
@ENABLE_STATIC_MODULE_TRUE@ mod-math.c mod-math.h \
|
||||
@ENABLE_STATIC_MODULE_TRUE@ mod-str.c mod-str.h \
|
||||
@ENABLE_STATIC_MODULE_TRUE@ mod-sys.c mod-sys.h
|
||||
@ -207,9 +206,9 @@ am__libhawk_la_SOURCES_DIST = hawk.h hawk-arr.h hawk-chr.h hawk-cmn.h \
|
||||
hawk-tre.h hawk-unpack.h Hawk.hpp HawkStd.hpp arr.c chr.c \
|
||||
dir.c ecs-imp.h ecs.c err-prv.h err.c err-sys.c fmt-imp.h \
|
||||
fmt.c fnc-prv.h fnc.c htb.c gem.c gem-skad.c gem-nwif.c \
|
||||
gem-nwif2.c hawk-prv.h hawk.c mb8.c misc-prv.h misc.c \
|
||||
parse-prv.h parse.c rbt.c rec.c rio-prv.h rio.c run-prv.h \
|
||||
run.c tre-prv.h tre-ast.c tre-ast.h tre-compile.c \
|
||||
gem-nwif2.c hawk-prv.h hawk.c idmap-imp.h mb8.c misc-prv.h \
|
||||
misc.c parse-prv.h parse.c rbt.c rec.c rio-prv.h rio.c \
|
||||
run-prv.h run.c tre-prv.h tre-ast.c tre-ast.h tre-compile.c \
|
||||
tre-compile.h tre-match-bt.c tre-match-pa.c tre-match-ut.h \
|
||||
tre-mem.c tre-mem.h tre-parse.c tre-parse.h tre-stack.h \
|
||||
tre-stack.c tre.c tree-prv.h tree.c uch-prop.h uch-case.h \
|
||||
@ -217,8 +216,8 @@ am__libhawk_la_SOURCES_DIST = hawk.h hawk-arr.h hawk-chr.h hawk-cmn.h \
|
||||
utl-str.c utl-sys.c utl.c val-prv.h val.c hawk-cli.h \
|
||||
hawk-fio.h hawk-mtx.h hawk-pio.h hawk-sio.h hawk-tio.h \
|
||||
cli-imp.h cli.c fio.c mtx.c pio.c sio.c syscall.h tio.c \
|
||||
std-prv.h std.c Hawk.cpp HawkStd.cpp imap-imp.h mod-math.c \
|
||||
mod-math.h mod-str.c mod-str.h mod-sys.c mod-sys.h
|
||||
std-prv.h std.c Hawk.cpp HawkStd.cpp mod-math.c mod-math.h \
|
||||
mod-str.c mod-str.h mod-sys.c mod-sys.h
|
||||
am__objects_1 =
|
||||
am__objects_2 = $(am__objects_1)
|
||||
@ENABLE_CXX_TRUE@am__objects_3 = libhawk_la-Hawk.lo \
|
||||
@ -576,14 +575,14 @@ pkglib_LTLIBRARIES = libhawk.la $(am__append_15)
|
||||
libhawk_la_SOURCES = $(pkginclude_HEADERS) arr.c chr.c dir.c ecs-imp.h \
|
||||
ecs.c err-prv.h err.c err-sys.c fmt-imp.h fmt.c fnc-prv.h \
|
||||
fnc.c htb.c gem.c gem-skad.c gem-nwif.c gem-nwif2.c hawk-prv.h \
|
||||
hawk.c mb8.c misc-prv.h misc.c parse-prv.h parse.c rbt.c rec.c \
|
||||
rio-prv.h rio.c run-prv.h run.c tre-prv.h tre-ast.c tre-ast.h \
|
||||
tre-compile.c tre-compile.h tre-match-bt.c tre-match-pa.c \
|
||||
tre-match-ut.h tre-mem.c tre-mem.h tre-parse.c tre-parse.h \
|
||||
tre-stack.h tre-stack.c tre.c tree-prv.h tree.c uch-prop.h \
|
||||
uch-case.h utf16.c utf8.c utl-ass.c utl-skad.c utl-skad.h \
|
||||
utl-sort.c utl-str.c utl-sys.c utl.c val-prv.h val.c \
|
||||
hawk-cli.h hawk-fio.h hawk-mtx.h hawk-pio.h hawk-sio.h \
|
||||
hawk.c idmap-imp.h mb8.c misc-prv.h misc.c parse-prv.h parse.c \
|
||||
rbt.c rec.c rio-prv.h rio.c run-prv.h run.c tre-prv.h \
|
||||
tre-ast.c tre-ast.h tre-compile.c tre-compile.h tre-match-bt.c \
|
||||
tre-match-pa.c tre-match-ut.h tre-mem.c tre-mem.h tre-parse.c \
|
||||
tre-parse.h tre-stack.h tre-stack.c tre.c tree-prv.h tree.c \
|
||||
uch-prop.h uch-case.h utf16.c utf8.c utl-ass.c utl-skad.c \
|
||||
utl-skad.h utl-sort.c utl-str.c utl-sys.c utl.c val-prv.h \
|
||||
val.c hawk-cli.h hawk-fio.h hawk-mtx.h hawk-pio.h hawk-sio.h \
|
||||
hawk-tio.h cli-imp.h cli.c fio.c mtx.c pio.c sio.c syscall.h \
|
||||
tio.c std-prv.h std.c $(am__append_8) $(am__append_9)
|
||||
libhawk_la_CPPFLAGS = $(CPPFLAGS_ALL_COMMON) $(CPPFLAGS_PFMOD) \
|
||||
|
@ -492,8 +492,8 @@ struct hawk_mod_data_t
|
||||
#define HAWK_RTX_INIT_REF_VAL(refval, _id, _adr, _nrefs) \
|
||||
do { \
|
||||
(refval)->v_type = HAWK_VAL_REF; \
|
||||
(refval)->ref = (_nrefs); \
|
||||
(refval)->stat = 0; \
|
||||
(refval)->v_refs = (_nrefs); \
|
||||
(refval)->v_static = 0; \
|
||||
(refval)->nstr = 0; \
|
||||
(refval)->fcb = 0; \
|
||||
(refval)->id = (_id); \
|
||||
|
@ -127,26 +127,51 @@ struct hawk_rtx_alt_t
|
||||
HAWK_RTX_HDR;
|
||||
};
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
typedef struct hawk_gc_info_t hawk_gc_info_t;
|
||||
struct hawk_gc_info_t
|
||||
{
|
||||
hawk_gc_info_t* gc_prev;
|
||||
hawk_gc_info_t* gc_next;
|
||||
hawk_uintptr_t gc_refs;
|
||||
};
|
||||
|
||||
#if defined(HAWK_HAVE_INLINE)
|
||||
static HAWK_INLINE hawk_gc_info_t* hawk_val_to_gcinfo(hawk_val_t* v)
|
||||
{
|
||||
return ((hawk_gc_info_t*)v) - 1;
|
||||
}
|
||||
static HAWK_INLINE hawk_val_t* hawk_gcinfo_to_val(hawk_gc_info_t* gci)
|
||||
{
|
||||
return (hawk_val_t*)(gci + 1);
|
||||
}
|
||||
|
||||
#else
|
||||
# defined hawk_val_to_gcinfo(v) (((hawk_gc_info_t*)(v)) - 1)
|
||||
# defined hawk_gcinfo_to_val(gci) ((hawk_val_t*)(((hawk_gc_info_t*)(gci)) + 1))
|
||||
#endif
|
||||
|
||||
/**
|
||||
* The #HAWK_VAL_HDR defines the common header for a value.
|
||||
* Three common fields are:
|
||||
* - type - type of a value from #hawk_val_type_t
|
||||
* - ref - reference count
|
||||
* - stat - static value
|
||||
* - v_type - type of a value from #hawk_val_type_t
|
||||
* - v_refs - reference count
|
||||
* - v_static - static value indicator
|
||||
* - nstr - numeric string marker, 1 -> integer, 2 -> floating-point number
|
||||
*/
|
||||
/*
|
||||
#define HAWK_VAL_HDR \
|
||||
unsigned int type: 4; \
|
||||
unsigned int ref: 24; \
|
||||
unsigned int stat: 1; \
|
||||
unsigned int v_type: 4; \
|
||||
unsigned int v_refs: 24; \
|
||||
unsigned int v_static: 1; \
|
||||
unsigned int nstr: 2; \
|
||||
unsigned int fcb: 1
|
||||
*/
|
||||
#define HAWK_VAL_HDR \
|
||||
hawk_uintptr_t v_type: 4; \
|
||||
hawk_uintptr_t ref: ((HAWK_SIZEOF_UINTPTR_T * 8) - 8); \
|
||||
hawk_uintptr_t stat: 1; \
|
||||
hawk_uintptr_t v_refs: ((HAWK_SIZEOF_UINTPTR_T * 8) - 8); \
|
||||
hawk_uintptr_t v_static: 1; \
|
||||
hawk_uintptr_t nstr: 2; \
|
||||
hawk_uintptr_t fcb: 1
|
||||
|
||||
|
@ -604,7 +604,7 @@ int hawk_htb_delete (hawk_htb_t* htb, const void* kptr, hawk_oow_t klen)
|
||||
|
||||
while (pair != HAWK_NULL)
|
||||
{
|
||||
if (htb->style->comper (htb, KPTR(pair), KLEN(pair), kptr, klen) == 0)
|
||||
if (htb->style->comper(htb, KPTR(pair), KLEN(pair), kptr, klen) == 0)
|
||||
{
|
||||
if (prev == HAWK_NULL)
|
||||
htb->bucket[hc] = NEXT(pair);
|
||||
|
@ -26,46 +26,70 @@
|
||||
|
||||
/* THIS FILE IS SUPPOSED TO BE INCLUDED BY MODULE SOURCE THAT MAINTAINS MAPPING BETWEEN ID AND DATA */
|
||||
|
||||
typedef struct __IMAP_NODE_T __IMAP_NODE_T;
|
||||
struct __IMAP_NODE_T
|
||||
typedef struct __IDMAP_NODE_T __IDMAP_NODE_T;
|
||||
struct __IDMAP_NODE_T
|
||||
{
|
||||
__IMAP_NODE_T* prev;
|
||||
__IMAP_NODE_T* next;
|
||||
__IDMAP_NODE_T* prev;
|
||||
__IDMAP_NODE_T* next;
|
||||
int id;
|
||||
|
||||
__IMAP_NODE_T_DATA
|
||||
__IDMAP_NODE_T_DATA
|
||||
};
|
||||
|
||||
typedef struct __IMAP_LIST_T __IMAP_LIST_T;
|
||||
struct __IMAP_LIST_T
|
||||
typedef struct __IDMAP_LIST_T __IDMAP_LIST_T;
|
||||
struct __IDMAP_LIST_T
|
||||
{
|
||||
__IMAP_NODE_T* head;
|
||||
__IMAP_NODE_T* tail;
|
||||
__IMAP_NODE_T* free;
|
||||
#if defined(__IDMAP_AVOID_CIRCULAR_LIST)
|
||||
__IDMAP_NODE_T* head;
|
||||
__IDMAP_NODE_T* tail;
|
||||
__IDMAP_NODE_T* free;
|
||||
#else
|
||||
struct
|
||||
{
|
||||
__IDMAP_NODE_T* prev;
|
||||
__IDMAP_NODE_T* next;
|
||||
} used;
|
||||
struct
|
||||
{
|
||||
__IDMAP_NODE_T* prev;
|
||||
__IDMAP_NODE_T* next;
|
||||
} free;
|
||||
#endif
|
||||
|
||||
/* mapping table to map 'id' to 'node' */
|
||||
struct
|
||||
{
|
||||
__IMAP_NODE_T** tab;
|
||||
__IDMAP_NODE_T** tab;
|
||||
int capa;
|
||||
int high;
|
||||
} map;
|
||||
|
||||
__IMAP_LIST_T_DATA
|
||||
__IDMAP_LIST_T_DATA
|
||||
};
|
||||
|
||||
static __IMAP_NODE_T* __MAKE_IMAP_NODE (hawk_rtx_t* rtx, __IMAP_LIST_T* list)
|
||||
|
||||
static __IDMAP_NODE_T* __MAKE_IDMAP_NODE (hawk_rtx_t* rtx, __IDMAP_LIST_T* list)
|
||||
{
|
||||
/* create a new context node and append it to the list tail */
|
||||
__IMAP_NODE_T* node;
|
||||
__IDMAP_NODE_T* node;
|
||||
|
||||
node = HAWK_NULL;
|
||||
|
||||
#if defined(__IDMAP_AVOID_CIRCULAR_LIST)
|
||||
if (list->free)
|
||||
{
|
||||
node = list->free;
|
||||
list->free = node->next;
|
||||
}
|
||||
#else
|
||||
if (list->free.next != (__IDMAP_NODE_T*)&list->free)
|
||||
{
|
||||
/* remove a node from a free list */
|
||||
node = list->free.next;
|
||||
node->prev->next = node->next;
|
||||
node->next->prev = node->prev;
|
||||
}
|
||||
#endif
|
||||
else
|
||||
{
|
||||
node = hawk_rtx_callocmem(rtx, HAWK_SIZEOF(*node));
|
||||
@ -74,7 +98,7 @@ static __IMAP_NODE_T* __MAKE_IMAP_NODE (hawk_rtx_t* rtx, __IMAP_LIST_T* list)
|
||||
if (list->map.high <= list->map.capa)
|
||||
{
|
||||
hawk_oow_t newcapa, inc;
|
||||
__IMAP_NODE_T** tmp;
|
||||
__IDMAP_NODE_T** tmp;
|
||||
|
||||
inc = HAWK_TYPE_MAX(int) - list->map.capa;
|
||||
if (inc == 0) goto oops; /* too many nodes */
|
||||
@ -82,7 +106,7 @@ static __IMAP_NODE_T* __MAKE_IMAP_NODE (hawk_rtx_t* rtx, __IMAP_LIST_T* list)
|
||||
if (inc > 64) inc = 64;
|
||||
newcapa = (hawk_oow_t)list->map.capa + inc;
|
||||
|
||||
tmp = (__IMAP_NODE_T**)hawk_rtx_reallocmem(rtx, list->map.tab, HAWK_SIZEOF(*tmp) * newcapa);
|
||||
tmp = (__IDMAP_NODE_T**)hawk_rtx_reallocmem(rtx, list->map.tab, HAWK_SIZEOF(*tmp) * newcapa);
|
||||
if (!tmp) goto oops;
|
||||
|
||||
HAWK_MEMSET (&tmp[list->map.capa], 0, HAWK_SIZEOF(*tmp) * (newcapa - list->map.capa));
|
||||
@ -98,12 +122,20 @@ static __IMAP_NODE_T* __MAKE_IMAP_NODE (hawk_rtx_t* rtx, __IMAP_LIST_T* list)
|
||||
HAWK_ASSERT (list->map.tab[node->id] == HAWK_NULL);
|
||||
list->map.tab[node->id] = node;
|
||||
|
||||
#if defined(__IDMAP_AVOID_CIRCULAR_LIST)
|
||||
/* append it to the tail */
|
||||
node->next = HAWK_NULL;
|
||||
node->prev = list->tail;
|
||||
if (list->tail) list->tail->next = node;
|
||||
else list->head = node;
|
||||
list->tail = node;
|
||||
#else
|
||||
/* append it */
|
||||
node->next = (__IDMAP_NODE_T*)&list->used;
|
||||
node->prev = list->used.prev;
|
||||
node->prev->next = node;
|
||||
list->used.prev = node;
|
||||
#endif
|
||||
|
||||
return node;
|
||||
|
||||
@ -112,12 +144,17 @@ oops:
|
||||
return HAWK_NULL;
|
||||
}
|
||||
|
||||
static void __FREE_IMAP_NODE (hawk_rtx_t* rtx, __IMAP_LIST_T* list, __IMAP_NODE_T* node)
|
||||
static void __FREE_IDMAP_NODE (hawk_rtx_t* rtx, __IDMAP_LIST_T* list, __IDMAP_NODE_T* node)
|
||||
{
|
||||
#if defined(__IDMAP_AVOID_CIRCULAR_LIST)
|
||||
if (node->prev) node->prev->next = node->next;
|
||||
if (node->next) node->next->prev = node->prev;
|
||||
if (list->head == node) list->head = node->next;
|
||||
if (list->tail == node) list->tail = node->prev;
|
||||
#else
|
||||
node->prev->next = node->next;
|
||||
node->next->prev = node->prev;
|
||||
#endif
|
||||
|
||||
list->map.tab[node->id] = HAWK_NULL;
|
||||
|
||||
@ -131,15 +168,23 @@ static void __FREE_IMAP_NODE (hawk_rtx_t* rtx, __IMAP_LIST_T* list, __IMAP_NODE_
|
||||
else
|
||||
{
|
||||
/* otherwise, chain the node to the free list */
|
||||
#if defined(__IDMAP_AVOID_CIRCULAR_LIST)
|
||||
node->next = list->free;
|
||||
list->free = node;
|
||||
#else
|
||||
node->next = (__IDMAP_NODE_T*)&list->free;
|
||||
node->prev = list->free.prev;
|
||||
node->prev->next = node;
|
||||
list->free.prev = node;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* however, i destroy the whole free list when all the nodes are
|
||||
* chanined to the free list */
|
||||
#if defined(__IDMAP_AVOID_CIRCULAR_LIST)
|
||||
if (list->head == HAWK_NULL)
|
||||
{
|
||||
__IMAP_NODE_T* curnode;
|
||||
__IDMAP_NODE_T* curnode;
|
||||
|
||||
while (list->free)
|
||||
{
|
||||
@ -153,4 +198,75 @@ static void __FREE_IMAP_NODE (hawk_rtx_t* rtx, __IMAP_LIST_T* list, __IMAP_NODE_
|
||||
list->map.capa = 0;
|
||||
list->map.tab = HAWK_NULL;
|
||||
}
|
||||
#else
|
||||
if (list->used.next == (__IDMAP_NODE_T*)&list->used)
|
||||
{
|
||||
__IDMAP_NODE_T* node;
|
||||
|
||||
while (list->free.next != (__IDMAP_NODE_T*)&list->free)
|
||||
{
|
||||
node = list->free.next;
|
||||
node->prev->next = node->next;
|
||||
node->next->prev = node->prev;
|
||||
hawk_rtx_freemem (rtx, node);
|
||||
}
|
||||
|
||||
hawk_rtx_freemem (rtx, list->map.tab);
|
||||
list->map.high = 0;
|
||||
list->map.capa = 0;
|
||||
list->map.tab = HAWK_NULL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __INIT_IDMAP_LIST (hawk_rtx_t* rtx, __IDMAP_LIST_T* list)
|
||||
{
|
||||
#if defined(__IDMAP_AVOID_CIRCULAR_LIST)
|
||||
/* nothing */
|
||||
#else
|
||||
list->used.next = (__IDMAP_NODE_T*)&list->used;
|
||||
list->used.prev = (__IDMAP_NODE_T*)&list->used;
|
||||
list->free.next = (__IDMAP_NODE_T*)&list->free;
|
||||
list->free.prev = (__IDMAP_NODE_T*)&list->free;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __FINI_IDMAP_LIST (hawk_rtx_t* rtx, __IDMAP_LIST_T* list)
|
||||
{
|
||||
#if defined(__IDMAP_AVOID_CIRCULAR_LIST)
|
||||
__IDMAP_NODE_T* node, * next;
|
||||
node = data->list->head;
|
||||
while (node)
|
||||
{
|
||||
next = node->next;
|
||||
__FREE_IDMAP_NODE (rtx, list, node);
|
||||
node = next;
|
||||
}
|
||||
|
||||
node = data->list->free;
|
||||
while (node)
|
||||
{
|
||||
next = node->next;
|
||||
__FREE_IDMAP_NODE (rtx, list, node);
|
||||
node = next;
|
||||
}
|
||||
#else
|
||||
__IDMAP_NODE_T* node;
|
||||
|
||||
while (list->used.next != (__IDMAP_NODE_T*)&list->used)
|
||||
{
|
||||
node = list->used.next;
|
||||
node->prev->next = node->next;
|
||||
node->next->prev = node->prev;
|
||||
__FREE_IDMAP_NODE (rtx, list, node);
|
||||
}
|
||||
|
||||
while (list->free.next != (__IDMAP_NODE_T*)&list->free)
|
||||
{
|
||||
node = list->free.next;
|
||||
node->prev->next = node->next;
|
||||
node->next->prev = node->prev;
|
||||
__FREE_IDMAP_NODE (rtx, list, node);
|
||||
}
|
||||
#endif
|
||||
}
|
@ -166,13 +166,15 @@ struct sys_list_data_t
|
||||
};
|
||||
typedef struct sys_list_data_t sys_list_data_t;
|
||||
|
||||
#define __IMAP_NODE_T_DATA sys_node_data_t ctx;
|
||||
#define __IMAP_LIST_T_DATA sys_list_data_t ctx;
|
||||
#define __IMAP_LIST_T sys_list_t
|
||||
#define __IMAP_NODE_T sys_node_t
|
||||
#define __MAKE_IMAP_NODE __new_sys_node
|
||||
#define __FREE_IMAP_NODE __free_sys_node
|
||||
#include "imap-imp.h"
|
||||
#define __IDMAP_NODE_T_DATA sys_node_data_t ctx;
|
||||
#define __IDMAP_LIST_T_DATA sys_list_data_t ctx;
|
||||
#define __IDMAP_LIST_T sys_list_t
|
||||
#define __IDMAP_NODE_T sys_node_t
|
||||
#define __INIT_IDMAP_LIST __init_sys_list
|
||||
#define __FINI_IDMAP_LIST __fini_sys_list
|
||||
#define __MAKE_IDMAP_NODE __new_sys_node
|
||||
#define __FREE_IDMAP_NODE __free_sys_node
|
||||
#include "idmap-imp.h"
|
||||
|
||||
struct rtx_data_t
|
||||
{
|
||||
@ -713,7 +715,7 @@ static int fnc_write (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
|
||||
{
|
||||
hawk_bch_t* dptr;
|
||||
hawk_oow_t dlen;
|
||||
hawk_ooi_t startpos = 0, maxlen = HAWK_TYPE_MAX(hawk_ooi_t);
|
||||
hawk_int_t startpos = 0, maxlen = HAWK_TYPE_MAX(hawk_int_t);
|
||||
hawk_val_t* a1;
|
||||
|
||||
if (hawk_rtx_getnargs(rtx) >= 3 && (hawk_rtx_valtoint(rtx, hawk_rtx_getarg(rtx, 2), &startpos) <= -1 || startpos < 0)) startpos = 0;
|
||||
@ -4762,14 +4764,19 @@ static int query (hawk_mod_t* mod, hawk_t* awk, const hawk_ooch_t* name, hawk_mo
|
||||
static int init (hawk_mod_t* mod, hawk_rtx_t* rtx)
|
||||
{
|
||||
mod_ctx_t* mctx = (mod_ctx_t*)mod->ctx;
|
||||
rtx_data_t data;
|
||||
rtx_data_t data, * datap;
|
||||
hawk_rbt_pair_t* pair;
|
||||
|
||||
mctx->log.type = SYSLOG_LOCAL;
|
||||
mctx->log.syslog_opened = 0;
|
||||
mctx->log.sck = -1;
|
||||
|
||||
HAWK_MEMSET (&data, 0, HAWK_SIZEOF(data));
|
||||
if (hawk_rbt_insert(mctx->rtxtab, &rtx, HAWK_SIZEOF(rtx), &data, HAWK_SIZEOF(data)) == HAWK_NULL) return -1;
|
||||
pair = hawk_rbt_insert(mctx->rtxtab, &rtx, HAWK_SIZEOF(rtx), &data, HAWK_SIZEOF(data));
|
||||
if (HAWK_UNLIKELY(!pair)) return -1;
|
||||
|
||||
datap = (rtx_data_t*)HAWK_RBT_VPTR(pair);
|
||||
__init_sys_list (rtx, &datap->sys_list);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -4789,24 +4796,19 @@ static void fini (hawk_mod_t* mod, hawk_rtx_t* rtx)
|
||||
if (pair)
|
||||
{
|
||||
rtx_data_t* data;
|
||||
sys_node_t* sys_node, * sys_next;
|
||||
|
||||
|
||||
data = (rtx_data_t*)HAWK_RBT_VPTR(pair);
|
||||
|
||||
sys_node = data->sys_list.head;
|
||||
while (sys_node)
|
||||
{
|
||||
sys_next = sys_node->next;
|
||||
free_sys_node (rtx, &data->sys_list, sys_node);
|
||||
sys_node = sys_next;
|
||||
}
|
||||
|
||||
if (data->sys_list.ctx.readbuf)
|
||||
{
|
||||
hawk_rtx_freemem (rtx, data->sys_list.ctx.readbuf);
|
||||
data->sys_list.ctx.readbuf = HAWK_NULL;
|
||||
data->sys_list.ctx.readbuf_capa = 0;
|
||||
}
|
||||
|
||||
__fini_sys_list (rtx, &data->sys_list);
|
||||
|
||||
hawk_rbt_delete (mctx->rtxtab, &rtx, HAWK_SIZEOF(rtx));
|
||||
}
|
||||
|
||||
|
@ -68,7 +68,7 @@ struct hawk_val_rchunk_t
|
||||
|
||||
#define IS_STATICVAL(val) ((val) == HAWK_NULL || (val) == hawk_val_nil || (val) == hawk_val_zls || (val) == hawk_val_zlm)
|
||||
*/
|
||||
#define IS_STATICVAL(val) ((val)->stat)
|
||||
#define IS_STATICVAL(val) ((val)->v_static)
|
||||
|
||||
|
||||
/* hawk_val_t pointer encoding assumes the pointer is an even number.
|
||||
|
@ -36,6 +36,22 @@ hawk_val_t* hawk_val_nil = (hawk_val_t*)&awk_nil;
|
||||
hawk_val_t* hawk_val_zls = (hawk_val_t*)&awk_zls;
|
||||
hawk_val_t* hawk_val_zlm = (hawk_val_t*)&awk_zlm;
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
|
||||
/* TOOD: */
|
||||
static hawk_val_t* gc_calloc (hawk_rtx_t* rtx, hawk_oow_t size)
|
||||
{
|
||||
hawk_gc_info_t* gci;
|
||||
|
||||
gci = (hawk_gc_info_t*)hawk_rtx_callocmem(rtx, HAWK_SIZEOF(*gci) + size);
|
||||
if (HAWK_UNLIKELY(!gci)) return HAWK_NULL;
|
||||
|
||||
return hawk_gcinfo_to_val(gci);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
|
||||
hawk_val_t* hawk_get_awk_nil_val (void)
|
||||
{
|
||||
return (hawk_val_t*)&awk_nil;
|
||||
@ -95,8 +111,8 @@ hawk_val_t* hawk_rtx_makeintval (hawk_rtx_t* rtx, hawk_int_t v)
|
||||
rtx->vmgr.ifree = (hawk_val_int_t*)val->nde;
|
||||
|
||||
val->v_type = HAWK_VAL_INT;
|
||||
val->ref = 0;
|
||||
val->stat = 0;
|
||||
val->v_refs = 0;
|
||||
val->v_static = 0;
|
||||
val->nstr = 0;
|
||||
val->fcb = 0;
|
||||
val->i_val = v;
|
||||
@ -146,8 +162,8 @@ hawk_val_t* hawk_rtx_makefltval (hawk_rtx_t* rtx, hawk_flt_t v)
|
||||
rtx->vmgr.rfree = (hawk_val_flt_t*)val->nde;
|
||||
|
||||
val->v_type = HAWK_VAL_FLT;
|
||||
val->ref = 0;
|
||||
val->stat = 0;
|
||||
val->v_refs = 0;
|
||||
val->v_static = 0;
|
||||
val->nstr = 0;
|
||||
val->fcb = 0;
|
||||
val->val = v;
|
||||
@ -189,8 +205,8 @@ static HAWK_INLINE hawk_val_t* make_str_val (hawk_rtx_t* rtx, const hawk_ooch_t*
|
||||
init:
|
||||
#endif
|
||||
val->v_type = HAWK_VAL_STR;
|
||||
val->ref = 0;
|
||||
val->stat = 0;
|
||||
val->v_refs = 0;
|
||||
val->v_static = 0;
|
||||
val->nstr = 0;
|
||||
val->fcb = 0;
|
||||
val->val.len = len1 + len2;
|
||||
@ -337,8 +353,7 @@ hawk_val_t* hawk_rtx_makenstrvalwithuchars (hawk_rtx_t* rtx, const hawk_uch_t* p
|
||||
|
||||
x = hawk_uchars_to_num(HAWK_OOCHARS_TO_NUM_MAKE_OPTION(1, 0, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), 0), ptr, len, &l, &r);
|
||||
v = hawk_rtx_makestrvalwithuchars(rtx, ptr, len);
|
||||
|
||||
if (!v) return HAWK_NULL;
|
||||
if (HAWK_UNLIKELY(!v)) return HAWK_NULL;
|
||||
|
||||
if (x >= 0)
|
||||
{
|
||||
@ -360,8 +375,7 @@ hawk_val_t* hawk_rtx_makenstrvalwithbchars (hawk_rtx_t* rtx, const hawk_bch_t* p
|
||||
|
||||
x = hawk_bchars_to_num(HAWK_OOCHARS_TO_NUM_MAKE_OPTION(1, 0, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), 0), ptr, len, &l, &r);
|
||||
v = hawk_rtx_makestrvalwithbchars(rtx, ptr, len);
|
||||
|
||||
if (!v) return HAWK_NULL;
|
||||
if (HAWK_UNLIKELY(!v)) return HAWK_NULL;
|
||||
|
||||
if (x >= 0)
|
||||
{
|
||||
@ -410,8 +424,8 @@ hawk_val_t* hawk_rtx_makembsvalwithbchars (hawk_rtx_t* rtx, const hawk_bch_t* pt
|
||||
if (HAWK_UNLIKELY(!val)) return HAWK_NULL;
|
||||
|
||||
val->v_type = HAWK_VAL_MBS;
|
||||
val->ref = 0;
|
||||
val->stat = 0;
|
||||
val->v_refs = 0;
|
||||
val->v_static = 0;
|
||||
val->nstr = 0;
|
||||
val->fcb = 0;
|
||||
val->val.len = len;
|
||||
@ -496,8 +510,8 @@ hawk_val_t* hawk_rtx_makerexval (hawk_rtx_t* rtx, const hawk_oocs_t* str, hawk_t
|
||||
if (HAWK_UNLIKELY(!val)) return HAWK_NULL;
|
||||
|
||||
val->v_type = HAWK_VAL_REX;
|
||||
val->ref = 0;
|
||||
val->stat = 0;
|
||||
val->v_refs = 0;
|
||||
val->v_static = 0;
|
||||
val->nstr = 0;
|
||||
val->fcb = 0;
|
||||
val->str.len = str->len;
|
||||
@ -549,17 +563,19 @@ hawk_val_t* hawk_rtx_makemapval (hawk_rtx_t* rtx)
|
||||
},
|
||||
HAWK_MAP_COMPER_DEFAULT,
|
||||
same_mapval,
|
||||
#if defined(HAWK_MAP_IS_HTB)
|
||||
HAWK_MAP_SIZER_DEFAULT,
|
||||
HAWK_MAP_HASHER_DEFAULT
|
||||
#endif
|
||||
};
|
||||
hawk_val_map_t* val;
|
||||
|
||||
val = (hawk_val_map_t*)hawk_rtx_callocmem(rtx, HAWK_SIZEOF(hawk_val_map_t) + HAWK_SIZEOF(hawk_map_t) + HAWK_SIZEOF(rtx));
|
||||
if (!val) return HAWK_NULL;
|
||||
if (HAWK_UNLIKELY(!val)) return HAWK_NULL;
|
||||
|
||||
val->v_type = HAWK_VAL_MAP;
|
||||
val->ref = 0;
|
||||
val->stat = 0;
|
||||
val->v_refs = 0;
|
||||
val->v_static = 0;
|
||||
val->nstr = 0;
|
||||
val->fcb = 0;
|
||||
val->map = (hawk_map_t*)(val + 1);
|
||||
@ -734,8 +750,8 @@ hawk_val_t* hawk_rtx_makefunval (hawk_rtx_t* rtx, const hawk_fun_t* fun)
|
||||
if (HAWK_UNLIKELY(!val)) return HAWK_NULL;
|
||||
|
||||
val->v_type = HAWK_VAL_FUN;
|
||||
val->ref = 0;
|
||||
val->stat = 0;
|
||||
val->v_refs = 0;
|
||||
val->v_static = 0;
|
||||
val->nstr = 0;
|
||||
val->fcb = 0;
|
||||
val->fun = (hawk_fun_t*)fun;
|
||||
@ -888,9 +904,9 @@ void hawk_rtx_refupval (hawk_rtx_t* rtx, hawk_val_t* val)
|
||||
if (IS_STATICVAL(val)) return;
|
||||
|
||||
#if defined(DEBUG_VAL)
|
||||
hawk_logfmt (hawk_rtx_gethawk(rtx), HAWK_T("ref up [ptr=%p] [count=%d] - [%O]\n"), val, (int)val->ref, val);
|
||||
hawk_logfmt (hawk_rtx_gethawk(rtx), HAWK_T("ref up [ptr=%p] [count=%d] - [%O]\n"), val, (int)val->v_refs, val);
|
||||
#endif
|
||||
val->ref++;
|
||||
val->v_refs++;
|
||||
}
|
||||
}
|
||||
|
||||
@ -901,15 +917,14 @@ void hawk_rtx_refdownval (hawk_rtx_t* rtx, hawk_val_t* val)
|
||||
if (IS_STATICVAL(val)) return;
|
||||
|
||||
#if defined(DEBUG_VAL)
|
||||
hawk_logfmt (hawk_rtx_gethawk(rtx), HAWK_T("ref down [ptr=%p] [count=%d] - [%O]\n"), val, (int)val->ref, val);
|
||||
hawk_logfmt (hawk_rtx_gethawk(rtx), HAWK_T("ref down [ptr=%p] [count=%d] - [%O]\n"), val, (int)val->v_refs, val);
|
||||
#endif
|
||||
|
||||
/* the reference count of a value should be greater than zero for it to be decremented. check the source code for any bugs */
|
||||
HAWK_ASSERT (val->ref > 0);
|
||||
|
||||
HAWK_ASSERT (val->v_refs > 0);
|
||||
|
||||
val->ref--;
|
||||
if (val->ref <= 0)
|
||||
val->v_refs--;
|
||||
if (val->v_refs <= 0)
|
||||
{
|
||||
hawk_rtx_freeval(rtx, val, 1);
|
||||
}
|
||||
@ -923,9 +938,9 @@ void hawk_rtx_refdownval_nofree (hawk_rtx_t* rtx, hawk_val_t* val)
|
||||
if (IS_STATICVAL(val)) return;
|
||||
|
||||
/* the reference count of a value should be greater than zero for it to be decremented. check the source code for any bugs */
|
||||
HAWK_ASSERT (val->ref > 0);
|
||||
HAWK_ASSERT (val->v_refs > 0);
|
||||
|
||||
val->ref--;
|
||||
val->v_refs--;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -49,43 +49,53 @@ struct param_data_t
|
||||
typedef struct param_data_t param_data_t;
|
||||
typedef struct param_data_t res_data_t;
|
||||
|
||||
#define __IMAP_NODE_T_DATA MYSQL* mysql; int connect_ever_attempted;
|
||||
#define __IMAP_LIST_T_DATA int errnum; hawk_ooch_t errmsg[256];
|
||||
#define __IMAP_LIST_T sql_list_t
|
||||
#define __IMAP_NODE_T sql_node_t
|
||||
#define __MAKE_IMAP_NODE __new_sql_node
|
||||
#define __FREE_IMAP_NODE __free_sql_node
|
||||
#include "../lib/imap-imp.h"
|
||||
#define __IDMAP_NODE_T_DATA MYSQL* mysql; int connect_ever_attempted;
|
||||
#define __IDMAP_LIST_T_DATA int errnum; hawk_ooch_t errmsg[256];
|
||||
#define __IDMAP_LIST_T sql_list_t
|
||||
#define __IDMAP_NODE_T sql_node_t
|
||||
#define __INIT_IDMAP_LIST __init_sql_list
|
||||
#define __FINI_IDMAP_LIST __fini_sql_list
|
||||
#define __MAKE_IDMAP_NODE __new_sql_node
|
||||
#define __FREE_IDMAP_NODE __free_sql_node
|
||||
#include "../lib/idmap-imp.h"
|
||||
|
||||
#undef __IMAP_NODE_T_DATA
|
||||
#undef __IMAP_LIST_T_DATA
|
||||
#undef __IMAP_LIST_T
|
||||
#undef __IMAP_NODE_T
|
||||
#undef __MAKE_IMAP_NODE
|
||||
#undef __FREE_IMAP_NODE
|
||||
#undef __IDMAP_NODE_T_DATA
|
||||
#undef __IDMAP_LIST_T_DATA
|
||||
#undef __IDMAP_LIST_T
|
||||
#undef __IDMAP_NODE_T
|
||||
#undef __INIT_IDMAP_LIST
|
||||
#undef __FINI_IDMAP_LIST
|
||||
#undef __MAKE_IDMAP_NODE
|
||||
#undef __FREE_IDMAP_NODE
|
||||
|
||||
#define __IMAP_NODE_T_DATA MYSQL_RES* res; unsigned int num_fields;
|
||||
#define __IMAP_LIST_T_DATA /* int errnum; */
|
||||
#define __IMAP_LIST_T res_list_t
|
||||
#define __IMAP_NODE_T res_node_t
|
||||
#define __MAKE_IMAP_NODE __new_res_node
|
||||
#define __FREE_IMAP_NODE __free_res_node
|
||||
#include "../lib/imap-imp.h"
|
||||
#define __IDMAP_NODE_T_DATA MYSQL_RES* res; unsigned int num_fields;
|
||||
#define __IDMAP_LIST_T_DATA /* int errnum; */
|
||||
#define __IDMAP_LIST_T res_list_t
|
||||
#define __IDMAP_NODE_T res_node_t
|
||||
#define __INIT_IDMAP_LIST __init_res_list
|
||||
#define __FINI_IDMAP_LIST __fini_res_list
|
||||
#define __MAKE_IDMAP_NODE __new_res_node
|
||||
#define __FREE_IDMAP_NODE __free_res_node
|
||||
#include "../lib/idmap-imp.h"
|
||||
|
||||
#undef __IMAP_NODE_T_DATA
|
||||
#undef __IMAP_LIST_T_DATA
|
||||
#undef __IMAP_LIST_T
|
||||
#undef __IMAP_NODE_T
|
||||
#undef __MAKE_IMAP_NODE
|
||||
#undef __FREE_IMAP_NODE
|
||||
#undef __IDMAP_NODE_T_DATA
|
||||
#undef __IDMAP_LIST_T_DATA
|
||||
#undef __IDMAP_LIST_T
|
||||
#undef __IDMAP_NODE_T
|
||||
#undef __INIT_IDMAP_LIST
|
||||
#undef __FINI_IDMAP_LIST
|
||||
#undef __MAKE_IDMAP_NODE
|
||||
#undef __FREE_IDMAP_NODE
|
||||
|
||||
#define __IMAP_NODE_T_DATA MYSQL_STMT* stmt; MYSQL_BIND* param_binds; param_data_t* param_data; hawk_oow_t param_capa; MYSQL_BIND* res_binds; res_data_t* res_data; hawk_oow_t res_capa;
|
||||
#define __IMAP_LIST_T_DATA /* int errnum; */
|
||||
#define __IMAP_LIST_T stmt_list_t
|
||||
#define __IMAP_NODE_T stmt_node_t
|
||||
#define __MAKE_IMAP_NODE __new_stmt_node
|
||||
#define __FREE_IMAP_NODE __free_stmt_node
|
||||
#include "../lib/imap-imp.h"
|
||||
#define __IDMAP_NODE_T_DATA MYSQL_STMT* stmt; MYSQL_BIND* param_binds; param_data_t* param_data; hawk_oow_t param_capa; MYSQL_BIND* res_binds; res_data_t* res_data; hawk_oow_t res_capa;
|
||||
#define __IDMAP_LIST_T_DATA /* int errnum; */
|
||||
#define __IDMAP_LIST_T stmt_list_t
|
||||
#define __IDMAP_NODE_T stmt_node_t
|
||||
#define __INIT_IDMAP_LIST __init_stmt_list
|
||||
#define __FINI_IDMAP_LIST __fini_stmt_list
|
||||
#define __MAKE_IDMAP_NODE __new_stmt_node
|
||||
#define __FREE_IDMAP_NODE __free_stmt_node
|
||||
#include "../lib/idmap-imp.h"
|
||||
|
||||
struct rtx_data_t
|
||||
{
|
||||
@ -1832,12 +1842,19 @@ static int query (hawk_mod_t* mod, hawk_t* awk, const hawk_ooch_t* name, hawk_mo
|
||||
static int init (hawk_mod_t* mod, hawk_rtx_t* rtx)
|
||||
{
|
||||
hawk_rbt_t* rbt;
|
||||
rtx_data_t data;
|
||||
rtx_data_t data, * datap;
|
||||
hawk_rbt_pair_t* pair;
|
||||
|
||||
rbt = (hawk_rbt_t*)mod->ctx;
|
||||
|
||||
HAWK_MEMSET (&data, 0, HAWK_SIZEOF(data));
|
||||
if (hawk_rbt_insert(rbt, &rtx, HAWK_SIZEOF(rtx), &data, HAWK_SIZEOF(data)) == HAWK_NULL) return -1;
|
||||
pair = hawk_rbt_insert(rbt, &rtx, HAWK_SIZEOF(rtx), &data, HAWK_SIZEOF(data));
|
||||
if (HAWK_UNLIKELY(!pair)) return -1;
|
||||
|
||||
datap = (rtx_data_t*)HAWK_RBT_VPTR(pair);
|
||||
__init_sql_list (rtx, &datap->sql_list);
|
||||
__init_res_list (rtx, &datap->res_list);
|
||||
__init_stmt_list (rtx, &datap->stmt_list);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1854,26 +1871,12 @@ static void fini (hawk_mod_t* mod, hawk_rtx_t* rtx)
|
||||
if (pair)
|
||||
{
|
||||
rtx_data_t* data;
|
||||
sql_node_t* sql_node, * sql_next;
|
||||
res_node_t* res_node, * res_next;
|
||||
|
||||
data = (rtx_data_t*)HAWK_RBT_VPTR(pair);
|
||||
|
||||
res_node = data->res_list.head;
|
||||
while (res_node)
|
||||
{
|
||||
res_next = res_node->next;
|
||||
free_res_node (rtx, &data->res_list, res_node);
|
||||
res_node = res_next;
|
||||
}
|
||||
|
||||
sql_node = data->sql_list.head;
|
||||
while (sql_node)
|
||||
{
|
||||
sql_next = sql_node->next;
|
||||
free_sql_node (rtx, &data->sql_list, sql_node);
|
||||
sql_node = sql_next;
|
||||
}
|
||||
__fini_stmt_list (rtx, &data->stmt_list);
|
||||
__fini_res_list (rtx, &data->res_list);
|
||||
__fini_sql_list (rtx, &data->sql_list);
|
||||
|
||||
hawk_rbt_delete (rbt, &rtx, HAWK_SIZEOF(rtx));
|
||||
}
|
||||
@ -1901,7 +1904,7 @@ int hawk_mod_mysql (hawk_mod_t* mod, hawk_t* hawk)
|
||||
mod->fini = fini;
|
||||
|
||||
rbt = hawk_rbt_open(hawk_getgem(hawk), 0, 1, 1);
|
||||
if (rbt == HAWK_NULL) return -1;
|
||||
if (HAWK_UNLIKELY(!rbt)) return -1;
|
||||
|
||||
hawk_rbt_setstyle (rbt, hawk_get_rbt_style(HAWK_RBT_STYLE_INLINE_COPIERS));
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user