Compare commits

...
3 Commits
Author SHA1 Message Date
hyung-hwan 9e2248266c touched up signal handling code
continuous-integration/drone/push Build is failing
2026-01-12 14:19:52 +09:00
hyung-hwan 4f2c148b3b touched up the signal handling code a bit 2026-01-12 02:50:28 +09:00
hyung-hwan 957bcf2b4e fixed a bug in hawk_rtx_killecb()/hawk_killecb()/hawk_sed_killecb()
initial support for signal handling. some race condition issues yet to be resolved
2026-01-12 00:27:27 +09:00
26 changed files with 729 additions and 252 deletions
+40 -11
View File
@@ -46,7 +46,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <locale.h> #include <locale.h>
/* #define ENABLE_CALLBACK TODO: enable this back */ /* #define ENABLE_STATEMENT_CALLBACK TODO: enable this back */
#define ABORT(label) goto label #define ABORT(label) goto label
#if defined(_WIN32) #if defined(_WIN32)
@@ -125,6 +125,7 @@ static void stop_run (int signo)
#if !defined(_WIN32) && !defined(__OS2__) && !defined(__DOS__) #if !defined(_WIN32) && !defined(__OS2__) && !defined(__DOS__)
int e = errno; int e = errno;
#endif #endif
/* signal handler not registered */
/*hawk_haltall(hawk_rtx_gethawk(app_rtx));*/ /*hawk_haltall(hawk_rtx_gethawk(app_rtx));*/
hawk_rtx_halt(app_rtx); hawk_rtx_halt(app_rtx);
#if !defined(_WIN32) && !defined(__OS2__) && !defined(__DOS__) #if !defined(_WIN32) && !defined(__OS2__) && !defined(__DOS__)
@@ -132,6 +133,11 @@ static void stop_run (int signo)
#endif #endif
} }
static void relay_signal (int signo)
{
hawk_rtx_raisesig(app_rtx, signo);
}
static void set_intr_pipe (void) static void set_intr_pipe (void)
{ {
#if !defined(_WIN32) && !defined(__OS2__) && !defined(__DOS__) && defined(SIGPIPE) #if !defined(_WIN32) && !defined(__OS2__) && !defined(__DOS__) && defined(SIGPIPE)
@@ -319,13 +325,36 @@ static void dprint_return (hawk_rtx_t* rtx, hawk_val_t* ret)
hawk_logfmt(hawk, HAWK_LOG_STDERR, HAWK_T("[END OF NAMED VARIABLES]\n")); hawk_logfmt(hawk, HAWK_LOG_STDERR, HAWK_T("[END OF NAMED VARIABLES]\n"));
} }
#if defined(ENABLE_CALLBACK) #if defined(ENABLE_STATEMENT_CALLBACK)
static void on_statement (hawk_rtx_t* rtx, hawk_nde_t* nde) static void on_statement (hawk_rtx_t* rtx, hawk_nde_t* nde)
{ {
hawk_logfmt (hawk_rtx_gethawk(rtx), HAWK_LOG_STDERR, HAWK_T("running %d at line %zu\n"), (int)nde->type, (hawk_oow_t)nde->loc.line); hawk_logfmt (hawk_rtx_gethawk(rtx), HAWK_LOG_STDERR, HAWK_T("running %d at line %zu\n"), (int)nde->type, (hawk_oow_t)nde->loc.line);
} }
#endif #endif
static void on_sigset (hawk_rtx_t* rtx, int sig, hawk_fun_t* fun)
{
if (fun)
{
hawk_main_set_signal_handler(sig, relay_signal, 0);
}
else
{
int back_to_stop_run = 0;
hawk_main_unset_signal_handler(sig);
#if defined(SIGTERM)
if (sig == SIGTERM) back_to_stop_run = 1;
#endif
#if defined(SIGHUP)
if (sig == SIGHUP) back_to_stop_run = 1;
#endif
#if defined(SIGINT)
if (sig == SIGINT) back_to_stop_run = 1;
#endif
if (back_to_stop_run) hawk_main_set_signal_handler(sig, stop_run, 0);
}
}
struct opttab_t struct opttab_t
{ {
const hawk_bch_t* name; const hawk_bch_t* name;
@@ -781,15 +810,18 @@ int main_hawk(int argc, hawk_bch_t* argv[], const hawk_bch_t* real_argv0)
struct arg_t arg; struct arg_t arg;
int ret = -1; int ret = -1;
#if defined(ENABLE_CALLBACK)
static hawk_rtx_ecb_t rtx_ecb = static hawk_rtx_ecb_t rtx_ecb =
{ {
HAWK_FV(.close, HAWK_NULL), HAWK_SFN(close) HAWK_NULL,
HAWK_FV(.stmt, on_statement), #if defined(ENABLE_STATEMENT_CALLBACK)
HAWK_FV(.gblset, HAWK_NULL) HAWK_SFN(stmt) on_statement,
HAWK_FV(.ctx, HAWK_NULL) #else
HAWK_SFN(stmt) HAWK_NULL,
#endif
HAWK_SFN(gblset) HAWK_NULL,
HAWK_SFN(sigset) on_sigset,
HAWK_SFN(ctx) HAWK_NULL
}; };
#endif
/* TODO: change it to support multiple source files */ /* TODO: change it to support multiple source files */
hawk_parsestd_t psout; hawk_parsestd_t psout;
@@ -928,9 +960,7 @@ int main_hawk(int argc, hawk_bch_t* argv[], const hawk_bch_t* real_argv0)
} }
app_rtx = rtx; app_rtx = rtx;
#if defined(ENABLE_CALLBACK)
hawk_rtx_pushecb(rtx, &rtx_ecb); hawk_rtx_pushecb(rtx, &rtx_ecb);
#endif
set_intr_run(); set_intr_run();
@@ -982,4 +1012,3 @@ oops:
return ret; return ret;
} }
+1 -1
View File
@@ -175,7 +175,7 @@ int hawk_main_unset_signal_handler (int sig)
if (sigaction(sig, &sa, HAWK_NULL) == -1) return -1; if (sigaction(sig, &sa, HAWK_NULL) == -1) return -1;
#else #else
signal (sig, (hawk_main_sig_handler_t)g_sig_state[sig].old_handler); signal(sig, (hawk_main_sig_handler_t)g_sig_state[sig].old_handler);
#endif #endif
g_sig_state[sig].handler = 0; g_sig_state[sig].handler = 0;
+1 -1
View File
@@ -1886,7 +1886,7 @@ int Hawk::open ()
#endif #endif
// push the call back after everything else is ok. // push the call back after everything else is ok.
hawk_pushecb (this->hawk, &xtn->ecb); hawk_pushecb(this->hawk, &xtn->ecb);
return 0; return 0;
} }
+1 -1
View File
@@ -385,7 +385,7 @@ int SedStd::StringStream::open (Data& io)
// only if it's not already pushed // only if it's not already pushed
this->out.sed_ecb.close = this->on_sed_close; this->out.sed_ecb.close = this->on_sed_close;
this->out.sed_ecb.ctx = this; this->out.sed_ecb.ctx = this;
hawk_sed_pushecb ((hawk_sed_t*)io, &this->out.sed_ecb); hawk_sed_pushecb((hawk_sed_t*)io, &this->out.sed_ecb);
} }
io.setHandle (this); io.setHandle (this);
+10 -10
View File
@@ -108,17 +108,17 @@ static int hawk_cut_init (hawk_cut_t* cut, hawk_mmgr_t* mmgr, hawk_cmgr_t* cmgr)
{ {
HAWK_MEMSET (cut, 0, HAWK_SIZEOF(*cut)); HAWK_MEMSET (cut, 0, HAWK_SIZEOF(*cut));
cut->_instsize = HAWK_SIZEOF(*cut); cut->instsize_ = HAWK_SIZEOF(*cut);
cut->_gem.mmgr = mmgr; cut->gem_.mmgr = mmgr;
cut->_gem.cmgr = cmgr; cut->gem_.cmgr = cmgr;
/* initialize error handling fields */ /* initialize error handling fields */
cut->_gem.errnum = HAWK_ENOERR; cut->gem_.errnum = HAWK_ENOERR;
cut->_gem.errmsg[0] = '\0'; cut->gem_.errmsg[0] = '\0';
cut->_gem.errloc.line = 0; cut->gem_.errloc.line = 0;
cut->_gem.errloc.colm = 0; cut->gem_.errloc.colm = 0;
cut->_gem.errloc.file = HAWK_NULL; cut->gem_.errloc.file = HAWK_NULL;
cut->_gem.errstr = hawk_dfl_errstr; cut->gem_.errstr = hawk_dfl_errstr;
/* on init, the last points to the first */ /* on init, the last points to the first */
@@ -143,7 +143,7 @@ static void hawk_cut_fini (hawk_cut_t* cut)
hawk_errstr_t hawk_cut_geterrstr (hawk_cut_t* cut) hawk_errstr_t hawk_cut_geterrstr (hawk_cut_t* cut)
{ {
return cut->_gem.errstr; return cut->gem_.errstr;
} }
void hawk_cut_seterrbfmt (hawk_cut_t* cut, const hawk_loc_t* errloc, hawk_errnum_t errnum, const hawk_bch_t* fmt, ...) void hawk_cut_seterrbfmt (hawk_cut_t* cut, const hawk_loc_t* errloc, hawk_errnum_t errnum, const hawk_bch_t* fmt, ...)
+4 -4
View File
@@ -227,7 +227,7 @@ const hawk_ooch_t* hawk_dfl_errstr (hawk_errnum_t errnum)
hawk_errstr_t hawk_geterrstr (hawk_t* hawk) hawk_errstr_t hawk_geterrstr (hawk_t* hawk)
{ {
return hawk->_gem.errstr; return hawk->gem_.errstr;
} }
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
@@ -298,9 +298,9 @@ void hawk_rtx_seterruvfmt (hawk_rtx_t* rtx, const hawk_loc_t* errloc, hawk_errnu
void hawk_rtx_errortohawk (hawk_rtx_t* rtx, hawk_t* hawk) void hawk_rtx_errortohawk (hawk_rtx_t* rtx, hawk_t* hawk)
{ {
/* copy error information in 'rtx' to the 'hawk' object */ /* copy error information in 'rtx' to the 'hawk' object */
hawk->_gem.errnum = rtx->_gem.errnum; hawk->gem_.errnum = rtx->gem_.errnum;
hawk->_gem.errloc = rtx->_gem.errloc; hawk->gem_.errloc = rtx->gem_.errloc;
hawk_copy_oocstr(hawk->_gem.errmsg, HAWK_COUNTOF(hawk->_gem.errmsg), rtx->_gem.errmsg); hawk_copy_oocstr(hawk->gem_.errmsg, HAWK_COUNTOF(hawk->gem_.errmsg), rtx->gem_.errmsg);
} }
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
+57 -4
View File
@@ -1310,6 +1310,19 @@ typedef enum hawk_log_mask_t hawk_log_mask_t;
#define HAWK_HAVE_BUILTIN_CLZLL #define HAWK_HAVE_BUILTIN_CLZLL
#endif #endif
#if __has_builtin(__atomic_exchange_n)
#define HAWK_HAVE_ATOMIC_EXCHANGE_N
#endif
#if __has_builtin(__atomic_fetch_or)
#define HAWK_HAVE_ATOMIC_FETCH_OR
#endif
#if __has_builtin(__atomic_load_n)
#define HAWK_HAVE_ATOMIC_LOAD_N
#endif
#if __has_builtin(__atomic_store_n)
#define HAWK_HAVE_ATOMIC_STORE_N
#endif
#if __has_builtin(__builtin_uadd_overflow) #if __has_builtin(__builtin_uadd_overflow)
#define HAWK_HAVE_BUILTIN_UADD_OVERFLOW #define HAWK_HAVE_BUILTIN_UADD_OVERFLOW
#endif #endif
@@ -1352,14 +1365,15 @@ typedef enum hawk_log_mask_t hawk_log_mask_t;
#define HAWK_HAVE_BUILTIN_EXPECT #define HAWK_HAVE_BUILTIN_EXPECT
#endif #endif
#if __has_builtin(__sync_fetch_and_or)
#define HAWK_HAVE_SYNC_FETCH_AND_OR
#endif
#if __has_builtin(__sync_lock_test_and_set) #if __has_builtin(__sync_lock_test_and_set)
#define HAWK_HAVE_SYNC_LOCK_TEST_AND_SET #define HAWK_HAVE_SYNC_LOCK_TEST_AND_SET
#endif #endif
#if __has_builtin(__sync_lock_release) #if __has_builtin(__sync_lock_release)
#define HAWK_HAVE_SYNC_LOCK_RELEASE #define HAWK_HAVE_SYNC_LOCK_RELEASE
#endif #endif
#if __has_builtin(__sync_synchronize) #if __has_builtin(__sync_synchronize)
#define HAWK_HAVE_SYNC_SYNCHRONIZE #define HAWK_HAVE_SYNC_SYNCHRONIZE
#endif #endif
@@ -1370,7 +1384,6 @@ typedef enum hawk_log_mask_t hawk_log_mask_t;
#define HAWK_HAVE_SYNC_VAL_COMPARE_AND_SWAP #define HAWK_HAVE_SYNC_VAL_COMPARE_AND_SWAP
#endif #endif
#if __has_builtin(__builtin_bswap16) #if __has_builtin(__builtin_bswap16)
#define HAWK_HAVE_BUILTIN_BSWAP16 #define HAWK_HAVE_BUILTIN_BSWAP16
#endif #endif
@@ -1386,9 +1399,9 @@ typedef enum hawk_log_mask_t hawk_log_mask_t;
#elif defined(__GNUC__) && defined(__GNUC_MINOR__) #elif defined(__GNUC__) && defined(__GNUC_MINOR__)
#if (__GNUC__ >= 4) #if (__GNUC__ >= 4)
#define HAWK_HAVE_SYNC_FETCH_AND_OR
#define HAWK_HAVE_SYNC_LOCK_TEST_AND_SET #define HAWK_HAVE_SYNC_LOCK_TEST_AND_SET
#define HAWK_HAVE_SYNC_LOCK_RELEASE #define HAWK_HAVE_SYNC_LOCK_RELEASE
#define HAWK_HAVE_SYNC_SYNCHRONIZE #define HAWK_HAVE_SYNC_SYNCHRONIZE
#define HAWK_HAVE_SYNC_BOOL_COMPARE_AND_SWAP #define HAWK_HAVE_SYNC_BOOL_COMPARE_AND_SWAP
#define HAWK_HAVE_SYNC_VAL_COMPARE_AND_SWAP #define HAWK_HAVE_SYNC_VAL_COMPARE_AND_SWAP
@@ -1420,6 +1433,10 @@ typedef enum hawk_log_mask_t hawk_log_mask_t;
#define HAWK_HAVE_BUILTIN_SMULLL_OVERFLOW #define HAWK_HAVE_BUILTIN_SMULLL_OVERFLOW
#endif #endif
#if (__GNUC__ >= 5) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)
#define HAWK_HAVE_ATOMIC_FETCH_OR
#endif
#if (__GNUC__ >= 5) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) #if (__GNUC__ >= 5) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
/* 4.8.0 or later */ /* 4.8.0 or later */
#define HAWK_HAVE_BUILTIN_BSWAP16 #define HAWK_HAVE_BUILTIN_BSWAP16
@@ -1440,6 +1457,42 @@ typedef enum hawk_log_mask_t hawk_log_mask_t;
# define HAWK_UNLIKELY(x) (x) # define HAWK_UNLIKELY(x) (x)
#endif #endif
#if defined(HAWK_HAVE_ATOMIC_EXCHANGE_N)
# define HAWK_ATOMIC_EXCHANGE(ptr,val,mo) __atomic_exchange_n((ptr),(val),(mo))
#elif defined(HAWK_HAVE_SYNC_LOCK_TEST_AND_SET)
# define HAWK_ATOMIC_EXCHANGE(ptr,val,mo) __sync_lock_test_and_set((ptr),(val))
#endif
#if defined(HAWK_HAVE_ATOMIC_FETCH_OR)
# define HAWK_ATOMIC_FETCH_OR(ptr,val,mo) __atomic_fetch_or((ptr),(val),(mo))
#elif defined(HAWK_HAVE_SYNC_FETCH_AND_OR)
# define HAWK_ATOMIC_FETCH_OR(ptr,val,mo) __sync_fetch_and_or((ptr),(val))
#endif
#if defined(HAWK_HAVE_ATOMIC_LOAD_N)
# define HAWK_ATOMIC_LOAD(ptr,mo) __atomic_load_n((ptr),(mo))
#elif defined(HAWK_HAVE_SYNC_FETCH_AND_OR)
# define HAWK_ATOMIC_LOAD(ptr,mo) __sync_fetch_and_or((ptr),0)
#endif
#if defined(HAWK_HAVE_ATOMIC_STORE_N)
# define HAWK_ATOMIC_STORE(ptr,val,mo) __atomic_store_n((ptr),(val),(mo))
#elif defined(HAWK_HAVE_SYNC_LOCK_TEST_AND_SET) && defined(HAWK_HAVE_SYNC_SYNCHRONIZE)
# define HAWK_ATOMIC_STORE(ptr,val,mo) do { __sync_lock_test_and_set((ptr),(val)); __sync_synchronize(); } while(0)
#endif
#if defined(__ATOMIC_RELAXED)
# define HAWK_ATOMIC_RELAXED __ATOMIC_RELAXED
#else
# define HAWK_ATOMIC_RELAXED 0
#endif
#if defined(__ATOMIC_ACQ_REL)
# define HAWK_ATOMIC_ACQ_REL __ATOMIC_ACQ_REL
#else
# define HAWK_ATOMIC_ACQ_REL 4
#endif
#if defined(__GNUC__) #if defined(__GNUC__)
# define HAWK_PACKED __attribute__((__packed__)) # define HAWK_PACKED __attribute__((__packed__))
#else #else
+12 -12
View File
@@ -42,8 +42,8 @@
typedef struct hawk_cut_t hawk_cut_t; typedef struct hawk_cut_t hawk_cut_t;
#define HAWK_CUT_HDR \ #define HAWK_CUT_HDR \
hawk_oow_t _instsize; \ hawk_oow_t instsize_; \
hawk_gem_t _gem hawk_gem_t gem_
typedef struct hawk_cut_alt_t hawk_cut_alt_t; typedef struct hawk_cut_alt_t hawk_cut_alt_t;
struct hawk_cut_alt_t struct hawk_cut_alt_t
@@ -220,27 +220,27 @@ HAWK_EXPORT void hawk_cut_close (
* The hawk_cut_getxtn() function returns the pointer to the extension area * The hawk_cut_getxtn() function returns the pointer to the extension area
* placed behind the actual cut object. * placed behind the actual cut object.
*/ */
static HAWK_INLINE void* hawk_cut_getxtn (hawk_cut_t* cut) { return (void*)((hawk_uint8_t*)cut + ((hawk_cut_alt_t*)cut)->_instsize); } static HAWK_INLINE void* hawk_cut_getxtn (hawk_cut_t* cut) { return (void*)((hawk_uint8_t*)cut + ((hawk_cut_alt_t*)cut)->instsize_); }
/** /**
* The hawk_cut_getgem() function gets the pointer to the gem structure of the * The hawk_cut_getgem() function gets the pointer to the gem structure of the
* cut object. * cut object.
*/ */
static HAWK_INLINE hawk_gem_t* hawk_cut_getgem (hawk_cut_t* cut) { return &((hawk_cut_alt_t*)cut)->_gem; } static HAWK_INLINE hawk_gem_t* hawk_cut_getgem (hawk_cut_t* cut) { return &((hawk_cut_alt_t*)cut)->gem_; }
/** /**
* The hawk_cut_getmmgr() function gets the memory manager ucut in * The hawk_cut_getmmgr() function gets the memory manager ucut in
* hawk_cut_open(). * hawk_cut_open().
*/ */
static HAWK_INLINE hawk_mmgr_t* hawk_cut_getmmgr (hawk_cut_t* cut) { return ((hawk_cut_alt_t*)cut)->_gem.mmgr; } static HAWK_INLINE hawk_mmgr_t* hawk_cut_getmmgr (hawk_cut_t* cut) { return ((hawk_cut_alt_t*)cut)->gem_.mmgr; }
static HAWK_INLINE hawk_cmgr_t* hawk_cut_getcmgr (hawk_cut_t* cut) { return ((hawk_cut_alt_t*)cut)->_gem.cmgr; } static HAWK_INLINE hawk_cmgr_t* hawk_cut_getcmgr (hawk_cut_t* cut) { return ((hawk_cut_alt_t*)cut)->gem_.cmgr; }
static HAWK_INLINE void hawk_cut_setcmgr (hawk_cut_t* cut, hawk_cmgr_t* cmgr) { ((hawk_cut_alt_t*)cut)->_gem.cmgr = cmgr; } static HAWK_INLINE void hawk_cut_setcmgr (hawk_cut_t* cut, hawk_cmgr_t* cmgr) { ((hawk_cut_alt_t*)cut)->gem_.cmgr = cmgr; }
#else #else
#define hawk_cut_getxtn(cut) ((void*)((hawk_uint8_t*)cut + ((hawk_cut_alt_t*)cut)->_instsize)) #define hawk_cut_getxtn(cut) ((void*)((hawk_uint8_t*)cut + ((hawk_cut_alt_t*)cut)->instsize_))
#define hawk_cut_getgem(cut) (&((hawk_cut_alt_t*)(cut))->_gem) #define hawk_cut_getgem(cut) (&((hawk_cut_alt_t*)(cut))->gem_)
#define hawk_cut_getmmgr(cut) (((hawk_cut_alt_t*)(cut))->_gem.mmgr) #define hawk_cut_getmmgr(cut) (((hawk_cut_alt_t*)(cut))->gem_.mmgr)
#define hawk_cut_getcmgr(cut) (((hawk_cut_alt_t*)(cut))->_gem.cmgr) #define hawk_cut_getcmgr(cut) (((hawk_cut_alt_t*)(cut))->gem_.cmgr)
#define hawk_cut_setcmgr(cut,_cmgr) (((hawk_cut_alt_t*)(cut))->_gem.cmgr = (_cmgr)) #define hawk_cut_setcmgr(cut,_cmgr) (((hawk_cut_alt_t*)(cut))->gem_.cmgr = (_cmgr))
#endif /* HAWK_HAVE_INLINE */ #endif /* HAWK_HAVE_INLINE */
/** /**
+12 -12
View File
@@ -34,8 +34,8 @@
typedef struct hawk_json_t hawk_json_t; typedef struct hawk_json_t hawk_json_t;
#define HAWK_JSON_HDR \ #define HAWK_JSON_HDR \
hawk_oow_t _instsize; \ hawk_oow_t instsize_; \
hawk_gem_t _gem hawk_gem_t gem_
typedef struct hawk_json_alt_t hawk_json_alt_t; typedef struct hawk_json_alt_t hawk_json_alt_t;
struct hawk_json_alt_t struct hawk_json_alt_t
@@ -169,27 +169,27 @@ HAWK_EXPORT int hawk_json_getoption (
* The hawk_json_getxtn() function returns the pointer to the extension area * The hawk_json_getxtn() function returns the pointer to the extension area
* placed behind the actual json object. * placed behind the actual json object.
*/ */
static HAWK_INLINE void* hawk_json_getxtn (hawk_json_t* json) { return (void*)((hawk_uint8_t*)json + ((hawk_json_alt_t*)json)->_instsize); } static HAWK_INLINE void* hawk_json_getxtn (hawk_json_t* json) { return (void*)((hawk_uint8_t*)json + ((hawk_json_alt_t*)json)->instsize_); }
/** /**
* The hawk_json_getgem() function gets the pointer to the gem structure of the * The hawk_json_getgem() function gets the pointer to the gem structure of the
* json object. * json object.
*/ */
static HAWK_INLINE hawk_gem_t* hawk_json_getgem (hawk_json_t* json) { return &((hawk_json_alt_t*)json)->_gem; } static HAWK_INLINE hawk_gem_t* hawk_json_getgem (hawk_json_t* json) { return &((hawk_json_alt_t*)json)->gem_; }
/** /**
* The hawk_json_getmmgr() function gets the memory manager ujson in * The hawk_json_getmmgr() function gets the memory manager ujson in
* hawk_json_open(). * hawk_json_open().
*/ */
static HAWK_INLINE hawk_mmgr_t* hawk_json_getmmgr (hawk_json_t* json) { return ((hawk_json_alt_t*)json)->_gem.mmgr; } static HAWK_INLINE hawk_mmgr_t* hawk_json_getmmgr (hawk_json_t* json) { return ((hawk_json_alt_t*)json)->gem_.mmgr; }
static HAWK_INLINE hawk_cmgr_t* hawk_json_getcmgr (hawk_json_t* json) { return ((hawk_json_alt_t*)json)->_gem.cmgr; } static HAWK_INLINE hawk_cmgr_t* hawk_json_getcmgr (hawk_json_t* json) { return ((hawk_json_alt_t*)json)->gem_.cmgr; }
static HAWK_INLINE void hawk_json_setcmgr (hawk_json_t* json, hawk_cmgr_t* cmgr) { ((hawk_json_alt_t*)json)->_gem.cmgr = cmgr; } static HAWK_INLINE void hawk_json_setcmgr (hawk_json_t* json, hawk_cmgr_t* cmgr) { ((hawk_json_alt_t*)json)->gem_.cmgr = cmgr; }
#else #else
#define hawk_json_getxtn(json) ((void*)((hawk_uint8_t*)json + ((hawk_json_alt_t*)json)->_instsize)) #define hawk_json_getxtn(json) ((void*)((hawk_uint8_t*)json + ((hawk_json_alt_t*)json)->instsize_))
#define hawk_json_getgem(json) (&((hawk_json_alt_t*)(json))->_gem) #define hawk_json_getgem(json) (&((hawk_json_alt_t*)(json))->gem_)
#define hawk_json_getmmgr(json) (((hawk_json_alt_t*)(json))->_gem.mmgr) #define hawk_json_getmmgr(json) (((hawk_json_alt_t*)(json))->gem_.mmgr)
#define hawk_json_getcmgr(json) (((hawk_json_alt_t*)(json))->_gem.cmgr) #define hawk_json_getcmgr(json) (((hawk_json_alt_t*)(json))->gem_.cmgr)
#define hawk_json_setcmgr(json,_cmgr) (((hawk_json_alt_t*)(json))->_gem.cmgr = (_cmgr)) #define hawk_json_setcmgr(json,_cmgr) (((hawk_json_alt_t*)(json))->gem_.cmgr = (_cmgr))
#endif /* HAWK_HAVE_INLINE */ #endif /* HAWK_HAVE_INLINE */
/** /**
+28 -1
View File
@@ -30,6 +30,7 @@
#include <hawk-ecs.h> #include <hawk-ecs.h>
#include <hawk-fmt.h> #include <hawk-fmt.h>
#include <hawk-htb.h> #include <hawk-htb.h>
#include <hawk-mtx.h>
#include <hawk-rbt.h> #include <hawk-rbt.h>
#include <hawk-utl.h> #include <hawk-utl.h>
@@ -65,6 +66,13 @@ typedef struct hawk_tree_t hawk_tree_t;
*/ */
#define HAWK_ENABLE_FUN_AS_VALUE #define HAWK_ENABLE_FUN_AS_VALUE
#if defined(HAWK_ATOMIC_EXCHANGE) && \
defined(HAWK_ATOMIC_FETCH_OR) && \
defined(HAWK_ATOMIC_LOAD) && \
defined(HAWK_ATOMIC_STORE)
#define HAWK_ENABLE_ATOMIC_SIG
#endif
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
/* gc configuration */ /* gc configuration */
@@ -569,6 +577,26 @@ struct hawk_rtx_t
hawk_oow_t capa; hawk_oow_t capa;
} forin; /* keys for for (x in y) ... */ } forin; /* keys for for (x in y) ... */
#define HAWK_SIG_WORD_BITS (HAWK_SIZEOF_UINTPTR_T * 8)
#define HAWK_SIG_WORD_COUNT ((HAWK_NSIG + HAWK_SIG_WORD_BITS - 1) / HAWK_SIG_WORD_BITS)
hawk_fun_t* sig_handler[HAWK_NSIG];
int sig_handling;
#if defined(HAWK_ENABLE_ATOMIC_SIG)
hawk_uintptr_t sig_pending[HAWK_SIG_WORD_COUNT];
hawk_uintptr_t sig_pending_any;
#else
hawk_mtx_t sig_mtx;
int sig_mtx_inited;
int sig_pending_any;
struct
{
int count;
int tab[HAWK_NSIG];
int pos[HAWK_NSIG];
} sig_raise[2];
#endif
hawk_ooch_t errmsg_backup[HAWK_ERRMSG_CAPA]; hawk_ooch_t errmsg_backup[HAWK_ERRMSG_CAPA];
hawk_rtx_ecb_t* ecb; hawk_rtx_ecb_t* ecb;
}; };
@@ -645,7 +673,6 @@ static HAWK_INLINE void HAWK_RTX_STACK_POP (hawk_rtx_t* rtx)
#endif #endif
#if defined(__cplusplus) #if defined(__cplusplus)
extern "C" { extern "C" {
#endif #endif
+16 -19
View File
@@ -62,8 +62,8 @@
typedef struct hawk_sed_t hawk_sed_t; typedef struct hawk_sed_t hawk_sed_t;
#define HAWK_SED_HDR \ #define HAWK_SED_HDR \
hawk_oow_t _instsize; \ hawk_oow_t instsize_; \
hawk_gem_t _gem hawk_gem_t gem_
typedef struct hawk_sed_alt_t hawk_sed_alt_t; typedef struct hawk_sed_alt_t hawk_sed_alt_t;
struct hawk_sed_alt_t struct hawk_sed_alt_t
@@ -318,14 +318,11 @@ typedef void (*hawk_sed_ecb_close_t) (
typedef struct hawk_sed_ecb_t hawk_sed_ecb_t; typedef struct hawk_sed_ecb_t hawk_sed_ecb_t;
struct hawk_sed_ecb_t struct hawk_sed_ecb_t
{ {
/** hawk_sed_ecb_close_t close; /* called by hawk_sed_close() */
* called by hawk_sed_close().
*/
hawk_sed_ecb_close_t close;
void* ctx;
/* internal use only. don't touch this field */ void* ctx; /* user context */
hawk_sed_ecb_t* next;
hawk_sed_ecb_t* next_; /* internal use only. don't touch this field */
}; };
enum hawk_sed_tracer_op_t enum hawk_sed_tracer_op_t
@@ -477,27 +474,27 @@ HAWK_EXPORT void hawk_sed_close (
* The hawk_sed_getxtn() function returns the pointer to the extension area * The hawk_sed_getxtn() function returns the pointer to the extension area
* placed behind the actual sed object. * placed behind the actual sed object.
*/ */
static HAWK_INLINE void* hawk_sed_getxtn (hawk_sed_t* sed) { return (void*)((hawk_uint8_t*)sed + ((hawk_sed_alt_t*)sed)->_instsize); } static HAWK_INLINE void* hawk_sed_getxtn (hawk_sed_t* sed) { return (void*)((hawk_uint8_t*)sed + ((hawk_sed_alt_t*)sed)->instsize_); }
/** /**
* The hawk_sed_getgem() function gets the pointer to the gem structure of the * The hawk_sed_getgem() function gets the pointer to the gem structure of the
* sed object. * sed object.
*/ */
static HAWK_INLINE hawk_gem_t* hawk_sed_getgem (hawk_sed_t* sed) { return &((hawk_sed_alt_t*)sed)->_gem; } static HAWK_INLINE hawk_gem_t* hawk_sed_getgem (hawk_sed_t* sed) { return &((hawk_sed_alt_t*)sed)->gem_; }
/** /**
* The hawk_sed_getmmgr() function gets the memory manager used in * The hawk_sed_getmmgr() function gets the memory manager used in
* hawk_sed_open(). * hawk_sed_open().
*/ */
static HAWK_INLINE hawk_mmgr_t* hawk_sed_getmmgr (hawk_sed_t* sed) { return ((hawk_sed_alt_t*)sed)->_gem.mmgr; } static HAWK_INLINE hawk_mmgr_t* hawk_sed_getmmgr (hawk_sed_t* sed) { return ((hawk_sed_alt_t*)sed)->gem_.mmgr; }
static HAWK_INLINE hawk_cmgr_t* hawk_sed_getcmgr (hawk_sed_t* sed) { return ((hawk_sed_alt_t*)sed)->_gem.cmgr; } static HAWK_INLINE hawk_cmgr_t* hawk_sed_getcmgr (hawk_sed_t* sed) { return ((hawk_sed_alt_t*)sed)->gem_.cmgr; }
static HAWK_INLINE void hawk_sed_setcmgr (hawk_sed_t* sed, hawk_cmgr_t* cmgr) { ((hawk_sed_alt_t*)sed)->_gem.cmgr = cmgr; } static HAWK_INLINE void hawk_sed_setcmgr (hawk_sed_t* sed, hawk_cmgr_t* cmgr) { ((hawk_sed_alt_t*)sed)->gem_.cmgr = cmgr; }
#else #else
#define hawk_sed_getxtn(sed) ((void*)((hawk_uint8_t*)sed + ((hawk_sed_alt_t*)sed)->_instsize)) #define hawk_sed_getxtn(sed) ((void*)((hawk_uint8_t*)sed + ((hawk_sed_alt_t*)sed)->instsize_))
#define hawk_sed_getgem(sed) (&((hawk_sed_alt_t*)(sed))->_gem) #define hawk_sed_getgem(sed) (&((hawk_sed_alt_t*)(sed))->gem_)
#define hawk_sed_getmmgr(sed) (((hawk_sed_alt_t*)(sed))->_gem.mmgr) #define hawk_sed_getmmgr(sed) (((hawk_sed_alt_t*)(sed))->gem_.mmgr)
#define hawk_sed_getcmgr(sed) (((hawk_sed_alt_t*)(sed))->_gem.cmgr) #define hawk_sed_getcmgr(sed) (((hawk_sed_alt_t*)(sed))->gem_.cmgr)
#define hawk_sed_setcmgr(sed,_cmgr) (((hawk_sed_alt_t*)(sed))->_gem.cmgr = (_cmgr)) #define hawk_sed_setcmgr(sed,_cmgr) (((hawk_sed_alt_t*)(sed))->gem_.cmgr = (_cmgr))
#endif /* HAWK_HAVE_INLINE */ #endif /* HAWK_HAVE_INLINE */
+19 -18
View File
@@ -159,17 +159,17 @@ int hawk_init (hawk_t* hawk, hawk_mmgr_t* mmgr, hawk_cmgr_t* cmgr, const hawk_pr
HAWK_MEMSET(hawk, 0, HAWK_SIZEOF(*hawk)); HAWK_MEMSET(hawk, 0, HAWK_SIZEOF(*hawk));
/* remember the memory manager */ /* remember the memory manager */
hawk->_instsize = HAWK_SIZEOF(*hawk); hawk->instsize_ = HAWK_SIZEOF(*hawk);
hawk->_gem.mmgr = mmgr; hawk->gem_.mmgr = mmgr;
hawk->_gem.cmgr = cmgr; hawk->gem_.cmgr = cmgr;
/* initialize error handling fields */ /* initialize error handling fields */
hawk->_gem.errnum = HAWK_ENOERR; hawk->gem_.errnum = HAWK_ENOERR;
hawk->_gem.errmsg[0] = '\0'; hawk->gem_.errmsg[0] = '\0';
hawk->_gem.errloc.line = 0; hawk->gem_.errloc.line = 0;
hawk->_gem.errloc.colm = 0; hawk->gem_.errloc.colm = 0;
hawk->_gem.errloc.file = HAWK_NULL; hawk->gem_.errloc.file = HAWK_NULL;
hawk->_gem.errstr = hawk_dfl_errstr; hawk->gem_.errstr = hawk_dfl_errstr;
hawk->haltall = 0; hawk->haltall = 0;
hawk->ecb = (hawk_ecb_t*)hawk; /* use this as a sentinel node instead of HAWK_NULL */ hawk->ecb = (hawk_ecb_t*)hawk; /* use this as a sentinel node instead of HAWK_NULL */
@@ -309,7 +309,7 @@ void hawk_fini (hawk_t* hawk)
for (ecb = hawk->ecb; ecb != (hawk_ecb_t*)hawk; ecb = ecb_next) for (ecb = hawk->ecb; ecb != (hawk_ecb_t*)hawk; ecb = ecb_next)
{ {
ecb_next = ecb->next; ecb_next = ecb->next_;
if (ecb->close) ecb->close(hawk, ecb->ctx); if (ecb->close) ecb->close(hawk, ecb->ctx);
} }
@@ -392,7 +392,7 @@ void hawk_clear (hawk_t* hawk)
for (ecb = hawk->ecb; ecb != (hawk_ecb_t*)hawk; ecb = ecb_next) for (ecb = hawk->ecb; ecb != (hawk_ecb_t*)hawk; ecb = ecb_next)
{ {
ecb_next = ecb->next; ecb_next = ecb->next_;
if (ecb->clear) ecb->clear(hawk, ecb->ctx); if (ecb->clear) ecb->clear(hawk, ecb->ctx);
} }
/* hawk_clear() this doesn't pop event callbacks */ /* hawk_clear() this doesn't pop event callbacks */
@@ -613,14 +613,15 @@ void hawk_haltall (hawk_t* hawk)
void hawk_killecb (hawk_t* hawk, hawk_ecb_t* ecb) void hawk_killecb (hawk_t* hawk, hawk_ecb_t* ecb)
{ {
/* TODO: make it faster with doubly-linked list? */
hawk_ecb_t* prev, * cur; hawk_ecb_t* prev, * cur;
for (cur = hawk->ecb, prev = HAWK_NULL; cur != (hawk_ecb_t*)hawk; cur = cur->next) for (cur = hawk->ecb, prev = HAWK_NULL; cur != (hawk_ecb_t*)hawk; prev = cur, cur = cur->next_)
{ {
if (cur == ecb) if (cur == ecb)
{ {
if (prev) prev->next = cur->next; if (prev) prev->next_ = cur->next_;
else hawk->ecb = cur->next; else hawk->ecb = cur->next_;
cur->next = HAWK_NULL; cur->next_ = HAWK_NULL;
break; break;
} }
} }
@@ -630,14 +631,14 @@ hawk_ecb_t* hawk_popecb (hawk_t* hawk)
{ {
hawk_ecb_t* top = hawk->ecb; hawk_ecb_t* top = hawk->ecb;
if (top == (hawk_ecb_t*)hawk) return HAWK_NULL; if (top == (hawk_ecb_t*)hawk) return HAWK_NULL;
hawk->ecb = top->next; hawk->ecb = top->next_;
top->next = HAWK_NULL; top->next_ = HAWK_NULL;
return top; return top;
} }
void hawk_pushecb (hawk_t* hawk, hawk_ecb_t* ecb) void hawk_pushecb (hawk_t* hawk, hawk_ecb_t* ecb)
{ {
ecb->next = hawk->ecb; ecb->next_ = hawk->ecb;
hawk->ecb = ecb; hawk->ecb = ecb;
} }
+61 -31
View File
@@ -75,8 +75,8 @@
* \sa hawk_rtx_t hawk_open hawk_close * \sa hawk_rtx_t hawk_open hawk_close
*/ */
#define HAWK_HDR \ #define HAWK_HDR \
hawk_oow_t _instsize; \ hawk_oow_t instsize_; \
hawk_gem_t _gem hawk_gem_t gem_
typedef struct hawk_alt_t hawk_alt_t; typedef struct hawk_alt_t hawk_alt_t;
struct hawk_alt_t struct hawk_alt_t
@@ -113,8 +113,8 @@ struct hawk_alt_t
typedef struct hawk_rtx_t hawk_rtx_t; typedef struct hawk_rtx_t hawk_rtx_t;
#define HAWK_RTX_HDR \ #define HAWK_RTX_HDR \
hawk_oow_t _instsize; \ hawk_oow_t instsize_; \
hawk_gem_t _gem; \ hawk_gem_t gem_; \
int id; \ int id; \
hawk_t* hawk hawk_t* hawk
@@ -133,7 +133,7 @@ struct hawk_gch_t
{ {
hawk_gch_t* gc_prev; hawk_gch_t* gc_prev;
hawk_gch_t* gc_next; hawk_gch_t* gc_next;
hawk_uintptr_t gc_refs; hawk_uintptr_t gc_refs;
}; };
#if defined(HAWK_HAVE_INLINE) #if defined(HAWK_HAVE_INLINE)
@@ -1171,11 +1171,11 @@ struct hawk_ecb_t
*/ */
hawk_ecb_clear_t clear; hawk_ecb_clear_t clear;
/* user context */
void* ctx; void* ctx;
/* internal use only. don't touch this field */ /* internal use only. don't touch this field */
hawk_ecb_t* next; hawk_ecb_t* next_;
}; };
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
@@ -1213,6 +1213,18 @@ typedef void (*hawk_rtx_ecb_gblset_t) (
void* ctx void* ctx
); );
/**
* The hawk_rtx_ecb_sigset_t type defines the callback function
* executed when the sys::signal() function attempts to set or unset
* the signal handler for the given signal number. If the \a fun
* is #HAWK_NULL, it unsets the signal handler.
*/
typedef void (*hawk_rtx_ecb_sigset_t) (
hawk_rtx_t* rtx,
int sig,
hawk_fun_t* fun
);
/** /**
* The hawk_rtx_ecb_t type defines an event callback set for a * The hawk_rtx_ecb_t type defines an event callback set for a
* runtime context. You can register a callback function set with * runtime context. You can register a callback function set with
@@ -1238,10 +1250,20 @@ struct hawk_rtx_ecb_t
*/ */
hawk_rtx_ecb_gblset_t gblset; hawk_rtx_ecb_gblset_t gblset;
/**
* called when a signal handler is set/unset with sys::signal().
* you should implement this callback to support OS signal handling.
* because the core hawk library provides the virtual interface
* to signal handling but doesn't deal with the OS signals.
* however, it's still modeled after the unix-style signal handling.
*/
hawk_rtx_ecb_sigset_t sigset;
/* user context */
void* ctx; void* ctx;
/* internal use only. don't touch this field */ /* internal use only. don't touch this field */
hawk_rtx_ecb_t* next; hawk_rtx_ecb_t* next_;
}; };
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
@@ -1710,17 +1732,17 @@ HAWK_EXPORT void hawk_close (
); );
#if defined(HAWK_HAVE_INLINE) #if defined(HAWK_HAVE_INLINE)
static HAWK_INLINE void* hawk_getxtn (hawk_t* hawk) { return (void*)((hawk_uint8_t*)hawk + ((hawk_alt_t*)hawk)->_instsize); } static HAWK_INLINE void* hawk_getxtn (hawk_t* hawk) { return (void*)((hawk_uint8_t*)hawk + ((hawk_alt_t*)hawk)->instsize_); }
static HAWK_INLINE hawk_gem_t* hawk_getgem (hawk_t* hawk) { return &((hawk_alt_t*)hawk)->_gem; } static HAWK_INLINE hawk_gem_t* hawk_getgem (hawk_t* hawk) { return &((hawk_alt_t*)hawk)->gem_; }
static HAWK_INLINE hawk_mmgr_t* hawk_getmmgr (hawk_t* hawk) { return ((hawk_alt_t*)hawk)->_gem.mmgr; } static HAWK_INLINE hawk_mmgr_t* hawk_getmmgr (hawk_t* hawk) { return ((hawk_alt_t*)hawk)->gem_.mmgr; }
static HAWK_INLINE hawk_cmgr_t* hawk_getcmgr (hawk_t* hawk) { return ((hawk_alt_t*)hawk)->_gem.cmgr; } static HAWK_INLINE hawk_cmgr_t* hawk_getcmgr (hawk_t* hawk) { return ((hawk_alt_t*)hawk)->gem_.cmgr; }
static HAWK_INLINE void hawk_setcmgr (hawk_t* hawk, hawk_cmgr_t* cmgr) { ((hawk_alt_t*)hawk)->_gem.cmgr = cmgr; } static HAWK_INLINE void hawk_setcmgr (hawk_t* hawk, hawk_cmgr_t* cmgr) { ((hawk_alt_t*)hawk)->gem_.cmgr = cmgr; }
#else #else
#define hawk_getxtn(hawk) ((void*)((hawk_uint8_t*)hawk + ((hawk_alt_t*)hawk)->_instsize)) #define hawk_getxtn(hawk) ((void*)((hawk_uint8_t*)hawk + ((hawk_alt_t*)hawk)->instsize_))
#define hawk_getgem(hawk) (&((hawk_alt_t*)(hawk))->_gem) #define hawk_getgem(hawk) (&((hawk_alt_t*)(hawk))->_gem)
#define hawk_getmmgr(hawk) (((hawk_alt_t*)(hawk))->_gem.mmgr) #define hawk_getmmgr(hawk) (((hawk_alt_t*)(hawk))->gem_.mmgr)
#define hawk_getcmgr(hawk) (((hawk_alt_t*)(hawk))->_gem.cmgr) #define hawk_getcmgr(hawk) (((hawk_alt_t*)(hawk))->gem_.cmgr)
#define hawk_setcmgr(hawk,_cmgr) (((hawk_alt_t*)(hawk))->_gem.cmgr = (_cmgr)) #define hawk_setcmgr(hawk,_cmgr) (((hawk_alt_t*)(hawk))->gem_.cmgr = (_cmgr))
#endif /* HAWK_HAVE_INLINE */ #endif /* HAWK_HAVE_INLINE */
/** /**
@@ -1791,14 +1813,14 @@ HAWK_EXPORT hawk_errstr_t hawk_geterrstr (
*/ */
#if defined(HAWK_HAVE_INLINE) #if defined(HAWK_HAVE_INLINE)
static HAWK_INLINE hawk_errnum_t hawk_geterrnum (hawk_t* hawk) { return ((hawk_alt_t*)hawk)->_gem.errnum; } static HAWK_INLINE hawk_errnum_t hawk_geterrnum (hawk_t* hawk) { return ((hawk_alt_t*)hawk)->gem_.errnum; }
static HAWK_INLINE const hawk_loc_t* hawk_geterrloc (hawk_t* hawk) { return hawk_gem_geterrloc(hawk_getgem(hawk)); } static HAWK_INLINE const hawk_loc_t* hawk_geterrloc (hawk_t* hawk) { return hawk_gem_geterrloc(hawk_getgem(hawk)); }
static HAWK_INLINE const hawk_bch_t* hawk_geterrbmsg (hawk_t* hawk) { return hawk_gem_geterrbmsg(hawk_getgem(hawk)); } static HAWK_INLINE const hawk_bch_t* hawk_geterrbmsg (hawk_t* hawk) { return hawk_gem_geterrbmsg(hawk_getgem(hawk)); }
static HAWK_INLINE const hawk_uch_t* hawk_geterrumsg (hawk_t* hawk) { return hawk_gem_geterrumsg(hawk_getgem(hawk)); } static HAWK_INLINE const hawk_uch_t* hawk_geterrumsg (hawk_t* hawk) { return hawk_gem_geterrumsg(hawk_getgem(hawk)); }
static HAWK_INLINE void hawk_geterrbinf (hawk_t* hawk, hawk_errbinf_t* errinf) { return hawk_gem_geterrbinf(hawk_getgem(hawk), errinf); } static HAWK_INLINE void hawk_geterrbinf (hawk_t* hawk, hawk_errbinf_t* errinf) { return hawk_gem_geterrbinf(hawk_getgem(hawk), errinf); }
static HAWK_INLINE void hawk_geterruinf (hawk_t* hawk, hawk_erruinf_t* errinf) { return hawk_gem_geterruinf(hawk_getgem(hawk), errinf); } static HAWK_INLINE void hawk_geterruinf (hawk_t* hawk, hawk_erruinf_t* errinf) { return hawk_gem_geterruinf(hawk_getgem(hawk), errinf); }
#else #else
#define hawk_geterrnum(hawk) (((hawk_alt_t*)(hawk))->_gem.errnum) #define hawk_geterrnum(hawk) (((hawk_alt_t*)(hawk))->gem_.errnum)
#define hawk_geterrloc(hawk) (hawk_gem_geterrloc(hawk_getgem(hawk))) #define hawk_geterrloc(hawk) (hawk_gem_geterrloc(hawk_getgem(hawk)))
#define hawk_geterrbmsg(hawk) (hawk_gem_geterrbmsg(hawk_getgem(hawk))) #define hawk_geterrbmsg(hawk) (hawk_gem_geterrbmsg(hawk_getgem(hawk)))
#define hawk_geterrumsg(hawk) (hawk_gem_geterrumsg(hawk_getgem(hawk))) #define hawk_geterrumsg(hawk) (hawk_gem_geterrumsg(hawk_getgem(hawk)))
@@ -2493,18 +2515,18 @@ HAWK_EXPORT void hawk_rtx_close (
#if defined(HAWK_HAVE_INLINE) #if defined(HAWK_HAVE_INLINE)
static HAWK_INLINE hawk_t* hawk_rtx_gethawk (hawk_rtx_t* rtx) { return ((hawk_rtx_alt_t*)rtx)->hawk; } static HAWK_INLINE hawk_t* hawk_rtx_gethawk (hawk_rtx_t* rtx) { return ((hawk_rtx_alt_t*)rtx)->hawk; }
static HAWK_INLINE void* hawk_rtx_getxtn (hawk_rtx_t* rtx) { return (void*)((hawk_uint8_t*)rtx + ((hawk_rtx_alt_t*)rtx)->_instsize); } static HAWK_INLINE void* hawk_rtx_getxtn (hawk_rtx_t* rtx) { return (void*)((hawk_uint8_t*)rtx + ((hawk_rtx_alt_t*)rtx)->instsize_); }
static HAWK_INLINE hawk_gem_t* hawk_rtx_getgem (hawk_rtx_t* rtx) { return &((hawk_rtx_alt_t*)rtx)->_gem; } static HAWK_INLINE hawk_gem_t* hawk_rtx_getgem (hawk_rtx_t* rtx) { return &((hawk_rtx_alt_t*)rtx)->gem_; }
static HAWK_INLINE hawk_mmgr_t* hawk_rtx_getmmgr (hawk_rtx_t* rtx) { return ((hawk_rtx_alt_t*)rtx)->_gem.mmgr; } static HAWK_INLINE hawk_mmgr_t* hawk_rtx_getmmgr (hawk_rtx_t* rtx) { return ((hawk_rtx_alt_t*)rtx)->gem_.mmgr; }
static HAWK_INLINE hawk_cmgr_t* hawk_rtx_getcmgr (hawk_rtx_t* rtx) { return ((hawk_rtx_alt_t*)rtx)->_gem.cmgr; } static HAWK_INLINE hawk_cmgr_t* hawk_rtx_getcmgr (hawk_rtx_t* rtx) { return ((hawk_rtx_alt_t*)rtx)->gem_.cmgr; }
static HAWK_INLINE void hawk_rtx_setcmgr (hawk_rtx_t* rtx, hawk_cmgr_t* cmgr) { ((hawk_rtx_alt_t*)rtx)->_gem.cmgr = cmgr; } static HAWK_INLINE void hawk_rtx_setcmgr (hawk_rtx_t* rtx, hawk_cmgr_t* cmgr) { ((hawk_rtx_alt_t*)rtx)->gem_.cmgr = cmgr; }
#else #else
#define hawk_rtx_gethawk(rtx) (((hawk_rtx_alt_t*)(rtx))->hawk) #define hawk_rtx_gethawk(rtx) (((hawk_rtx_alt_t*)(rtx))->hawk)
#define hawk_rtx_getxtn(rtx) ((void*)((hawk_uint8_t*)rtx + ((hawk_rtx_alt_t*)rtx)->_instsize)) #define hawk_rtx_getxtn(rtx) ((void*)((hawk_uint8_t*)rtx + ((hawk_rtx_alt_t*)rtx)->instsize_))
#define hawk_rtx_getgem(rtx) (&((hawk_rtx_alt_t*)(rtx))->_gem) #define hawk_rtx_getgem(rtx) (&((hawk_rtx_alt_t*)(rtx))->_gem)
#define hawk_rtx_getmmgr(rtx) (((hawk_rtx_alt_t*)(rtx))->_gem.mmgr) #define hawk_rtx_getmmgr(rtx) (((hawk_rtx_alt_t*)(rtx))->gem_.mmgr)
#define hawk_rtx_getcmgr(rtx) (((hawk_rtx_alt_t*)(rtx))->_gem.cmgr) #define hawk_rtx_getcmgr(rtx) (((hawk_rtx_alt_t*)(rtx))->gem_.cmgr)
#define hawk_rtx_setcmgr(rtx,_cmgr) (((hawk_rtx_alt_t*)(rtx))->_gem.cmgr = (_cmgr)) #define hawk_rtx_setcmgr(rtx,_cmgr) (((hawk_rtx_alt_t*)(rtx))->gem_.cmgr = (_cmgr))
#endif /* HAWK_HAVE_INLINE */ #endif /* HAWK_HAVE_INLINE */
/** /**
@@ -2716,6 +2738,14 @@ HAWK_EXPORT void hawk_rtx_halt (
hawk_rtx_t* rtx /**< runtime context */ hawk_rtx_t* rtx /**< runtime context */
); );
/**
* The hawk_rtx_raisesig() function raises a signal to an active runtime context.
*/
HAWK_EXPORT int hawk_rtx_raisesig (
hawk_rtx_t* rtx,
int sig
);
/** /**
* The hawk_rtx_getrio() function copies runtime I/O handlers * The hawk_rtx_getrio() function copies runtime I/O handlers
* to the memory buffer pointed to by \a rio. * to the memory buffer pointed to by \a rio.
@@ -2921,14 +2951,14 @@ HAWK_EXPORT hawk_htb_t* hawk_rtx_getnvmap (
*/ */
#if defined(HAWK_HAVE_INLINE) #if defined(HAWK_HAVE_INLINE)
static HAWK_INLINE hawk_errnum_t hawk_rtx_geterrnum (hawk_rtx_t* rtx) { return ((hawk_rtx_alt_t*)rtx)->_gem.errnum; } static HAWK_INLINE hawk_errnum_t hawk_rtx_geterrnum (hawk_rtx_t* rtx) { return ((hawk_rtx_alt_t*)rtx)->gem_.errnum; }
static HAWK_INLINE const hawk_loc_t* hawk_rtx_geterrloc (hawk_rtx_t* rtx) { return hawk_gem_geterrloc(hawk_rtx_getgem(rtx)); } static HAWK_INLINE const hawk_loc_t* hawk_rtx_geterrloc (hawk_rtx_t* rtx) { return hawk_gem_geterrloc(hawk_rtx_getgem(rtx)); }
static HAWK_INLINE const hawk_bch_t* hawk_rtx_geterrbmsg (hawk_rtx_t* rtx) { return hawk_gem_geterrbmsg(hawk_rtx_getgem(rtx)); } static HAWK_INLINE const hawk_bch_t* hawk_rtx_geterrbmsg (hawk_rtx_t* rtx) { return hawk_gem_geterrbmsg(hawk_rtx_getgem(rtx)); }
static HAWK_INLINE const hawk_uch_t* hawk_rtx_geterrumsg (hawk_rtx_t* rtx) { return hawk_gem_geterrumsg(hawk_rtx_getgem(rtx)); } static HAWK_INLINE const hawk_uch_t* hawk_rtx_geterrumsg (hawk_rtx_t* rtx) { return hawk_gem_geterrumsg(hawk_rtx_getgem(rtx)); }
static HAWK_INLINE void hawk_rtx_geterrinf (hawk_rtx_t* rtx, hawk_errinf_t* errinf) { return hawk_gem_geterrinf(hawk_rtx_getgem(rtx), errinf); } static HAWK_INLINE void hawk_rtx_geterrinf (hawk_rtx_t* rtx, hawk_errinf_t* errinf) { return hawk_gem_geterrinf(hawk_rtx_getgem(rtx), errinf); }
static HAWK_INLINE void hawk_rtx_geterror (hawk_rtx_t* rtx, hawk_errnum_t* errnum, const hawk_ooch_t** errmsg, hawk_loc_t* errloc) { return hawk_gem_geterror(hawk_rtx_getgem(rtx), errnum, errmsg, errloc); } static HAWK_INLINE void hawk_rtx_geterror (hawk_rtx_t* rtx, hawk_errnum_t* errnum, const hawk_ooch_t** errmsg, hawk_loc_t* errloc) { return hawk_gem_geterror(hawk_rtx_getgem(rtx), errnum, errmsg, errloc); }
#else #else
#define hawk_rtx_geterrnum(rtx) (((hawk_rtx_alt_t*)(rtx))->_gem.errnum) #define hawk_rtx_geterrnum(rtx) (((hawk_rtx_alt_t*)(rtx))->gem_.errnum)
#define hawk_rtx_geterrloc(rtx) (hawk_gem_geterrloc(hawk_rtx_getgem(rtx))) #define hawk_rtx_geterrloc(rtx) (hawk_gem_geterrloc(hawk_rtx_getgem(rtx)))
#define hawk_rtx_geterrbmsg(rtx) (hawk_gem_geterrbmsg(hawk_rtx_getgem(rtx))) #define hawk_rtx_geterrbmsg(rtx) (hawk_gem_geterrbmsg(hawk_rtx_getgem(rtx)))
#define hawk_rtx_geterrumsg(rtx) (hawk_gem_geterrumsg(hawk_rtx_getgem(rtx))) #define hawk_rtx_geterrumsg(rtx) (hawk_gem_geterrumsg(hawk_rtx_getgem(rtx)))
+13 -13
View File
@@ -204,7 +204,7 @@ static int handle_string_value_char (hawk_json_t* json, hawk_ooci_t c)
hawk_bch_t bcsbuf[HAWK_MBLEN_MAX]; hawk_bch_t bcsbuf[HAWK_MBLEN_MAX];
hawk_oow_t n; hawk_oow_t n;
n = json->_gem.cmgr->uctobc(json->state_stack->u.sv.acc, bcsbuf, HAWK_COUNTOF(bcsbuf)); n = json->gem_.cmgr->uctobc(json->state_stack->u.sv.acc, bcsbuf, HAWK_COUNTOF(bcsbuf));
if (n == 0 || n > HAWK_COUNTOF(bcsbuf)) if (n == 0 || n > HAWK_COUNTOF(bcsbuf))
{ {
/* illegal character or buffer to small */ /* illegal character or buffer to small */
@@ -714,7 +714,7 @@ static int feed_json_data_b (hawk_json_t* json, const hawk_bch_t* data, hawk_oow
hawk_oow_t n; hawk_oow_t n;
bcslen = end - ptr; bcslen = end - ptr;
n = json->_gem.cmgr->bctouc(ptr, bcslen, &uc); n = json->gem_.cmgr->bctouc(ptr, bcslen, &uc);
if (n == 0) if (n == 0)
{ {
/* invalid sequence */ /* invalid sequence */
@@ -770,7 +770,7 @@ static int feed_json_data_u (hawk_json_t* json, const hawk_uch_t* data, hawk_oow
hawk_oow_t mlen = 0; hawk_oow_t mlen = 0;
hawk_oow_t n, i; hawk_oow_t n, i;
n = json->_gem.cmgr->uctobc(*ptr++, bcsbuf, HAWK_COUNTOF(bcsbuf)); n = json->gem_.cmgr->uctobc(*ptr++, bcsbuf, HAWK_COUNTOF(bcsbuf));
if (n == 0) goto oops; // illegal character if (n == 0) goto oops; // illegal character
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
@@ -809,17 +809,17 @@ hawk_json_t* hawk_json_open (hawk_mmgr_t* mmgr, hawk_oow_t xtnsize, hawk_cmgr_t*
} }
HAWK_MEMSET(json, 0, HAWK_SIZEOF(*json) + xtnsize); HAWK_MEMSET(json, 0, HAWK_SIZEOF(*json) + xtnsize);
json->_instsize = HAWK_SIZEOF(*json); json->instsize_ = HAWK_SIZEOF(*json);
json->_gem.mmgr = mmgr; json->gem_.mmgr = mmgr;
json->_gem.cmgr = cmgr; json->gem_.cmgr = cmgr;
/* initialize error handling fields */ /* initialize error handling fields */
json->_gem.errnum = HAWK_ENOERR; json->gem_.errnum = HAWK_ENOERR;
json->_gem.errmsg[0] = '\0'; json->gem_.errmsg[0] = '\0';
json->_gem.errloc.line = 0; json->gem_.errloc.line = 0;
json->_gem.errloc.colm = 0; json->gem_.errloc.colm = 0;
json->_gem.errloc.file = HAWK_NULL; json->gem_.errloc.file = HAWK_NULL;
json->_gem.errstr = hawk_dfl_errstr; json->gem_.errstr = hawk_dfl_errstr;
json->prim = *prim; json->prim = *prim;
json->state_top.state = HAWK_JSON_STATE_START; json->state_top.state = HAWK_JSON_STATE_START;
@@ -866,7 +866,7 @@ int hawk_json_getoption (hawk_json_t* json, hawk_json_option_t id, void* value)
hawk_errstr_t hawk_json_geterrstr (hawk_json_t* json) hawk_errstr_t hawk_json_geterrstr (hawk_json_t* json)
{ {
return json->_gem.errstr; return json->gem_.errstr;
} }
void hawk_json_seterrbfmt (hawk_json_t* json, const hawk_loc_t* errloc, hawk_errnum_t errnum, const hawk_bch_t* fmt, ...) void hawk_json_seterrbfmt (hawk_json_t* json, const hawk_loc_t* errloc, hawk_errnum_t errnum, const hawk_bch_t* fmt, ...)
-1
View File
@@ -26,7 +26,6 @@
#include "hawk-prv.h" #include "hawk-prv.h"
#include <hawk-mtx.h> #include <hawk-mtx.h>
struct mod_data_t struct mod_data_t
{ {
hawk_mtx_t mq_mtx; hawk_mtx_t mq_mtx;
+110 -10
View File
@@ -129,6 +129,8 @@ enum syslog_type_t
SYSLOG_REMOTE, SYSLOG_REMOTE,
}; };
typedef struct rtx_data_t rtx_data_t;
struct mod_ctx_t struct mod_ctx_t
{ {
hawk_rbt_t* rtxtab; hawk_rbt_t* rtxtab;
@@ -137,6 +139,18 @@ typedef struct mod_ctx_t mod_ctx_t;
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
#if defined(HAWK_NSIG)
# define SYS_NSIG HAWK_NSIG
#elif defined(NSIG)
# define SYS_NSIG NSIG
#elif defined(SIGRTMAX)
# define SYS_NSIG (SIGRTMAX + 1)
#else
# define SYS_NSIG 64
#endif
typedef void (*hawk_sig_handler_t)(int);
enum sys_node_data_type_t enum sys_node_data_type_t
{ {
SYS_NODE_DATA_TYPE_FILE = (1 << 0), SYS_NODE_DATA_TYPE_FILE = (1 << 0),
@@ -212,6 +226,7 @@ typedef struct sys_list_data_t sys_list_data_t;
struct rtx_data_t struct rtx_data_t
{ {
sys_list_t sys_list; sys_list_t sys_list;
mod_ctx_t* mctx;
struct struct
{ {
@@ -221,7 +236,6 @@ struct rtx_data_t
hawk_oow_t len; hawk_oow_t len;
} pack; } pack;
/* syslog data */ /* syslog data */
struct struct
{ {
@@ -235,8 +249,6 @@ struct rtx_data_t
hawk_becs_t* dmsgbuf; hawk_becs_t* dmsgbuf;
} log; } log;
}; };
typedef struct rtx_data_t rtx_data_t;
enum mux_ctl_cmd_t enum mux_ctl_cmd_t
{ {
#if defined(USE_EPOLL) #if defined(USE_EPOLL)
@@ -2048,8 +2060,85 @@ static int fnc_kill (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
} }
retv = hawk_rtx_makeintval(rtx, rx); retv = hawk_rtx_makeintval(rtx, rx);
if (retv == HAWK_NULL) return -1; if (HAWK_UNLIKELY(!retv)) return -1;
hawk_rtx_setretval(rtx, retv);
return 0;
}
static int fnc_signal (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
{
hawk_int_t sig;
hawk_val_t* retv;
hawk_val_t* a1;
hawk_int_t rx = -1;
sys_list_t* sys_list = rtx_to_sys_list(rtx, fi);
hawk_fun_t* fun = HAWK_NULL;
if (hawk_rtx_valtoint(rtx, hawk_rtx_getarg(rtx, 0), &sig) <= -1)
{
rx = copy_error_to_sys_list(rtx, sys_list);
goto done;
}
if (sig < 0)
{
rx = set_error_on_sys_list(rtx, sys_list, HAWK_EINVAL, HAWK_T("invalid signal"));
goto done;
}
a1 = hawk_rtx_getarg(rtx, 1);
if (HAWK_RTX_GETVALTYPE(rtx, a1) == HAWK_VAL_NIL)
{
fun = HAWK_NULL;
}
else
{
fun = hawk_rtx_valtofun(rtx, a1);
if (!fun)
{
rx = copy_error_to_sys_list(rtx, sys_list);
goto done;
}
}
if (hawk_rtx_setsighandler(rtx, sig, fun) <= -1)
{
rx = copy_error_to_sys_list(rtx, sys_list);
goto done;
}
rx = 0;
done:
retv = hawk_rtx_makeintval(rtx, rx);
if (HAWK_UNLIKELY(!retv)) return -1;
hawk_rtx_setretval(rtx, retv);
return 0;
}
static int fnc_raise (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
{
hawk_int_t sig;
hawk_val_t* retv;
hawk_int_t rx = -1;
sys_list_t* sys_list = rtx_to_sys_list(rtx, fi);
if (hawk_rtx_valtoint(rtx, hawk_rtx_getarg(rtx, 0), &sig) <= -1)
{
rx = copy_error_to_sys_list(rtx, sys_list);
goto done;
}
if (hawk_rtx_raisesig(rtx, sig) <= -1)
{
rx = copy_error_to_sys_list(rtx, sys_list);
goto done;
}
rx = 0;
done:
retv = hawk_rtx_makeintval(rtx, rx);
if (HAWK_UNLIKELY(!retv)) return -1;
hawk_rtx_setretval(rtx, retv); hawk_rtx_setretval(rtx, retv);
return 0; return 0;
} }
@@ -2901,7 +2990,6 @@ static int fnc_getifcfg (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
if (hawk_rtx_valtostr(rtx, hawk_rtx_getarg(rtx, 0), &out) >= 0) if (hawk_rtx_valtostr(rtx, hawk_rtx_getarg(rtx, 0), &out) >= 0)
{ {
hawk_int_t type; hawk_int_t type;
hawk_int_t index, mtu;
hawk_ooch_t ethw[32]; hawk_ooch_t ethw[32];
hawk_val_map_data_t md[6]; hawk_val_map_data_t md[6];
hawk_oow_t md_count; hawk_oow_t md_count;
@@ -3941,7 +4029,7 @@ static int fnc_getmuxevt (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
{ {
sys_node_data_mux_t* mux_data = &sys_node->ctx.u.mux; sys_node_data_mux_t* mux_data = &sys_node->ctx.u.mux;
sys_node_t* file_node; sys_node_t* file_node;
hawk_int_t index, id, evts; hawk_int_t index;
int x; int x;
if (hawk_rtx_valtoint(rtx, hawk_rtx_getarg(rtx, 1), &index) <= -1) if (hawk_rtx_valtoint(rtx, hawk_rtx_getarg(rtx, 1), &index) <= -1)
@@ -4368,7 +4456,11 @@ static int fnc_accept (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
hawk_skad_t skad; hawk_skad_t skad;
socklen_t addrlen; socklen_t addrlen;
sys_node_t* new_node; sys_node_t* new_node;
#if defined(HAVE_ACCEPT4)
int fd;
#else
int fd, fd_flags; int fd, fd_flags;
#endif
hawk_int_t flags = 0; hawk_int_t flags = 0;
if (hawk_rtx_getnargs(rtx) >= 2 && (hawk_rtx_valtoint(rtx, hawk_rtx_getarg(rtx, 1), &flags) <= -1 || flags < 0)) flags = 0; if (hawk_rtx_getnargs(rtx) >= 2 && (hawk_rtx_valtoint(rtx, hawk_rtx_getarg(rtx, 1), &flags) <= -1 || flags < 0)) flags = 0;
@@ -5971,6 +6063,7 @@ static hawk_mod_fnc_tab_t fnctab[] =
{ HAWK_T("openmux"), { { 0, 0, HAWK_NULL }, fnc_openmux, 0 } }, { HAWK_T("openmux"), { { 0, 0, HAWK_NULL }, fnc_openmux, 0 } },
{ HAWK_T("pack"), { { 2, A_MAX, HAWK_T("rv")}, fnc_pack, 0 } }, { HAWK_T("pack"), { { 2, A_MAX, HAWK_T("rv")}, fnc_pack, 0 } },
{ HAWK_T("pipe"), { { 2, 3, HAWK_T("rrv") }, fnc_pipe, 0 } }, { HAWK_T("pipe"), { { 2, 3, HAWK_T("rrv") }, fnc_pipe, 0 } },
{ HAWK_T("raise"), { { 1, 1, HAWK_NULL }, fnc_raise, 0 } },
{ HAWK_T("read"), { { 2, 4, HAWK_T("vrvv") }, fnc_read, 0 } }, { HAWK_T("read"), { { 2, 4, HAWK_T("vrvv") }, fnc_read, 0 } },
{ HAWK_T("readdir"), { { 2, 2, HAWK_T("vr") }, fnc_readdir, 0 } }, { HAWK_T("readdir"), { { 2, 2, HAWK_T("vr") }, fnc_readdir, 0 } },
{ HAWK_T("recvfrom"), { { 2, 4, HAWK_T("vrvr") }, fnc_recvfrom, 0 } }, { HAWK_T("recvfrom"), { { 2, 4, HAWK_T("vrvr") }, fnc_recvfrom, 0 } },
@@ -5981,6 +6074,7 @@ static hawk_mod_fnc_tab_t fnctab[] =
{ HAWK_T("setsockopt"), { { 4, 4, HAWK_NULL }, fnc_setsockopt, 0 } }, { HAWK_T("setsockopt"), { { 4, 4, HAWK_NULL }, fnc_setsockopt, 0 } },
{ HAWK_T("settime"), { { 1, 1, HAWK_NULL }, fnc_settime, 0 } }, { HAWK_T("settime"), { { 1, 1, HAWK_NULL }, fnc_settime, 0 } },
{ HAWK_T("shutdown"), { { 2, 2, HAWK_NULL }, fnc_shutdown, 0 } }, { HAWK_T("shutdown"), { { 2, 2, HAWK_NULL }, fnc_shutdown, 0 } },
{ HAWK_T("signal"), { { 2, 2, HAWK_NULL }, fnc_signal, 0 } },
{ HAWK_T("sleep"), { { 1, 1, HAWK_NULL }, fnc_sleep, 0 } }, { HAWK_T("sleep"), { { 1, 1, HAWK_NULL }, fnc_sleep, 0 } },
{ HAWK_T("sockaddrdom"), { { 1, 1, HAWK_NULL }, fnc_sockaddrdom, 0 } }, { HAWK_T("sockaddrdom"), { { 1, 1, HAWK_NULL }, fnc_sockaddrdom, 0 } },
{ HAWK_T("socket"), { { 3, 3, HAWK_NULL }, fnc_socket, 0 } }, { HAWK_T("socket"), { { 3, 3, HAWK_NULL }, fnc_socket, 0 } },
@@ -6351,6 +6445,7 @@ static int init (hawk_mod_t* mod, hawk_rtx_t* rtx)
rdp = (rtx_data_t*)HAWK_RBT_VPTR(pair); rdp = (rtx_data_t*)HAWK_RBT_VPTR(pair);
__init_sys_list(rtx, &rdp->sys_list); __init_sys_list(rtx, &rdp->sys_list);
rdp->mctx = mctx;
rdp->pack.ptr = rdp->pack.__static_buf; rdp->pack.ptr = rdp->pack.__static_buf;
rdp->pack.capa = HAWK_COUNTOF(rdp->pack.__static_buf); rdp->pack.capa = HAWK_COUNTOF(rdp->pack.__static_buf);
@@ -6441,6 +6536,7 @@ static void unload (hawk_mod_t* mod, hawk_t* hawk)
mod_ctx_t* mctx = (mod_ctx_t*)mod->ctx; mod_ctx_t* mctx = (mod_ctx_t*)mod->ctx;
HAWK_ASSERT(HAWK_RBT_SIZE(mctx->rtxtab) == 0); HAWK_ASSERT(HAWK_RBT_SIZE(mctx->rtxtab) == 0);
HAWK_ASSERT(mctx->sig_rtx_head == HAWK_NULL);
hawk_rbt_close(mctx->rtxtab); hawk_rbt_close(mctx->rtxtab);
hawk_freemem(hawk, mctx); hawk_freemem(hawk, mctx);
@@ -6449,6 +6545,7 @@ static void unload (hawk_mod_t* mod, hawk_t* hawk)
int hawk_mod_sys (hawk_mod_t* mod, hawk_t* hawk) int hawk_mod_sys (hawk_mod_t* mod, hawk_t* hawk)
{ {
hawk_rbt_t* rbt; hawk_rbt_t* rbt;
mod_ctx_t* mctx;
mod->query = query; mod->query = query;
mod->unload = unload; mod->unload = unload;
@@ -6456,17 +6553,20 @@ int hawk_mod_sys (hawk_mod_t* mod, hawk_t* hawk)
mod->init = init; mod->init = init;
mod->fini = fini; mod->fini = fini;
mod->ctx = hawk_callocmem(hawk, HAWK_SIZEOF(mod_ctx_t)); mctx = (mod_ctx_t*)hawk_callocmem(hawk, HAWK_SIZEOF(mod_ctx_t));
if (HAWK_UNLIKELY(!mod->ctx)) return -1; if (HAWK_UNLIKELY(!mctx)) return -1;
rbt = hawk_rbt_open(hawk_getgem(hawk), 0, 1, 1); rbt = hawk_rbt_open(hawk_getgem(hawk), 0, 1, 1);
if (HAWK_UNLIKELY(!rbt)) if (HAWK_UNLIKELY(!rbt))
{ {
hawk_freemem(hawk, mod->ctx); hawk_freemem(hawk, mctx);
return -1; return -1;
} }
hawk_rbt_setstyle(rbt, hawk_get_rbt_style(HAWK_RBT_STYLE_INLINE_COPIERS)); hawk_rbt_setstyle(rbt, hawk_get_rbt_style(HAWK_RBT_STYLE_INLINE_COPIERS));
((mod_ctx_t*)mod->ctx)->rtxtab = rbt; mctx->rtxtab = rbt;
/* attach the context to the module */
mod->ctx = mctx;
return 0; return 0;
} }
+1 -1
View File
@@ -447,7 +447,7 @@ static global_t gtab[] =
#define MATCH_TERMINATOR(hawk) \ #define MATCH_TERMINATOR(hawk) \
(MATCH_TERMINATOR_NORMAL(hawk) || MATCH_TERMINATOR_RBRACE(hawk)) (MATCH_TERMINATOR_NORMAL(hawk) || MATCH_TERMINATOR_RBRACE(hawk))
#define ADJERR_LOC(hawk,l) do { if (l) (hawk)->_gem.errloc = *(l); } while (0) #define ADJERR_LOC(hawk,l) do { if (l) (hawk)->gem_.errloc = *(l); } while (0)
#if defined(HAWK_OOCH_IS_BCH) #if defined(HAWK_OOCH_IS_BCH)
static HAWK_INLINE hawk_oow_t uc_to_utf8 (hawk_uch_t uc, hawk_bch_t* buf, hawk_oow_t bsz) static HAWK_INLINE hawk_oow_t uc_to_utf8 (hawk_uch_t uc, hawk_bch_t* buf, hawk_oow_t bsz)
+6
View File
@@ -149,6 +149,12 @@ hawk_val_t* hawk_rtx_evalcall (
void* eharg void* eharg
); );
int hawk_rtx_setsighandler (
hawk_rtx_t* rtx,
int sig,
hawk_fun_t* fun
);
#if defined(__cplusplus) #if defined(__cplusplus)
} }
#endif #endif
+256 -20
View File
@@ -24,11 +24,10 @@
#include "hawk-prv.h" #include "hawk-prv.h"
#define PRINT_IOERR -99 #define PRINT_IOERR (-99)
#define CMP_ERROR (-99)
#define CMP_ERROR -99 #define DEF_BUF_CAPA (256)
#define DEF_BUF_CAPA 256 #define HAWK_RTX_STACK_INCREMENT (512)
#define HAWK_RTX_STACK_INCREMENT 512
enum exit_level_t enum exit_level_t
{ {
@@ -69,7 +68,7 @@ struct pafv_t
(idx) <= HAWK_TYPE_MAX(hawk_oow_t)) (idx) <= HAWK_TYPE_MAX(hawk_oow_t))
#define CLRERR(rtx) hawk_rtx_seterrnum(rtx, HAWK_NULL, HAWK_ENOERR) #define CLRERR(rtx) hawk_rtx_seterrnum(rtx, HAWK_NULL, HAWK_ENOERR)
#define ADJERR_LOC(rtx,l) do { (rtx)->_gem.errloc = *(l); } while (0) #define ADJERR_LOC(rtx,l) do { (rtx)->gem_.errloc = *(l); } while (0)
static hawk_oow_t push_arg_from_vals (hawk_rtx_t* rtx, hawk_nde_fncall_t* call, void* data); static hawk_oow_t push_arg_from_vals (hawk_rtx_t* rtx, hawk_nde_fncall_t* call, void* data);
static hawk_oow_t push_arg_from_nde (hawk_rtx_t* rtx, hawk_nde_fncall_t* call, void* data); static hawk_oow_t push_arg_from_nde (hawk_rtx_t* rtx, hawk_nde_fncall_t* call, void* data);
@@ -634,7 +633,7 @@ static int set_global (hawk_rtx_t* rtx, int idx, hawk_nde_var_t* var, hawk_val_t
for (ecb = rtx->ecb; ecb != (hawk_rtx_ecb_t*)rtx; ecb = ecb_next) for (ecb = rtx->ecb; ecb != (hawk_rtx_ecb_t*)rtx; ecb = ecb_next)
{ {
ecb_next = ecb->next; ecb_next = ecb->next_;
if (ecb->gblset) ecb->gblset(rtx, idx, val, ecb->ctx); if (ecb->gblset) ecb->gblset(rtx, idx, val, ecb->ctx);
} }
@@ -870,7 +869,7 @@ hawk_rtx_t* hawk_rtx_open (hawk_t* hawk, hawk_oow_t xtnsize, hawk_rio_cbs_t* rio
/* initialize the rtx object */ /* initialize the rtx object */
HAWK_MEMSET(rtx, 0, HAWK_SIZEOF(hawk_rtx_t) + xtnsize); HAWK_MEMSET(rtx, 0, HAWK_SIZEOF(hawk_rtx_t) + xtnsize);
rtx->_instsize = HAWK_SIZEOF(hawk_rtx_t); rtx->instsize_ = HAWK_SIZEOF(hawk_rtx_t);
if (HAWK_UNLIKELY(init_rtx(rtx, hawk, rio) <= -1)) if (HAWK_UNLIKELY(init_rtx(rtx, hawk, rio) <= -1))
{ {
/* because the error information is in the gem part, /* because the error information is in the gem part,
@@ -883,6 +882,25 @@ hawk_rtx_t* hawk_rtx_open (hawk_t* hawk, hawk_oow_t xtnsize, hawk_rio_cbs_t* rio
rtx->ecb = (hawk_rtx_ecb_t*)rtx; /* use this as a special sentinel node */ rtx->ecb = (hawk_rtx_ecb_t*)rtx; /* use this as a special sentinel node */
/* initialize signal handling fields */
rtx->sig_handling = 0; /* indicate call_signal_handlers() is not in progress */
rtx->sig_pending_any = 0;
#if defined(HAWK_ENABLE_ATOMIC_SIG)
for (i = 0; i < HAWK_SIG_WORD_COUNT; i++) rtx->sig_pending[i] = 0;
#else
if (HAWK_UNLIKELY(hawk_mtx_init(&rtx->sig_mtx, hawk_rtx_getgem(rtx)) <= -1))
{
hawk_rtx_errortohawk(rtx, hawk);
fini_rtx(rtx, 0);
hawk_freemem(hawk, rtx);
return HAWK_NULL;
}
rtx->sig_mtx_inited = 1;
rtx->sig_raise[0].count = 0;
for (i = 0; i < HAWK_COUNTOF(rtx->sig_raise[0].pos); i++) rtx->sig_raise[0].pos[i] = -1;
#endif
/* global variables */
if (HAWK_UNLIKELY(init_globals(rtx) <= -1)) if (HAWK_UNLIKELY(init_globals(rtx) <= -1))
{ {
hawk_rtx_errortohawk(rtx, hawk); hawk_rtx_errortohawk(rtx, hawk);
@@ -944,7 +962,7 @@ void hawk_rtx_close (hawk_rtx_t* rtx)
for (ecb = rtx->ecb; ecb != (hawk_rtx_ecb_t*)rtx; ecb = ecb_next) for (ecb = rtx->ecb; ecb != (hawk_rtx_ecb_t*)rtx; ecb = ecb_next)
{ {
ecb_next = ecb->next; ecb_next = ecb->next_;
if (ecb->close) ecb->close(rtx, ecb->ctx); if (ecb->close) ecb->close(rtx, ecb->ctx);
} }
@@ -988,14 +1006,15 @@ void hawk_rtx_setrio (hawk_rtx_t* rtx, const hawk_rio_cbs_t* rio)
void hawk_rtx_killecb (hawk_rtx_t* rtx, hawk_rtx_ecb_t* ecb) void hawk_rtx_killecb (hawk_rtx_t* rtx, hawk_rtx_ecb_t* ecb)
{ {
/* TODO: make it faster with doubly-linked list? */
hawk_rtx_ecb_t* prev, * cur; hawk_rtx_ecb_t* prev, * cur;
for (cur = rtx->ecb, prev = HAWK_NULL; cur != (hawk_rtx_ecb_t*)rtx; cur = cur->next) for (cur = rtx->ecb, prev = HAWK_NULL; cur != (hawk_rtx_ecb_t*)rtx; prev = cur, cur = cur->next_)
{ {
if (cur == ecb) if (cur == ecb)
{ {
if (prev) prev->next = cur->next; if (prev) prev->next_ = cur->next_;
else rtx->ecb = cur->next; else rtx->ecb = cur->next_;
cur->next = HAWK_NULL; cur->next_ = HAWK_NULL;
break; break;
} }
} }
@@ -1005,14 +1024,14 @@ hawk_rtx_ecb_t* hawk_rtx_popecb (hawk_rtx_t* rtx)
{ {
hawk_rtx_ecb_t* top = rtx->ecb; hawk_rtx_ecb_t* top = rtx->ecb;
if (top == (hawk_rtx_ecb_t*)rtx) return HAWK_NULL; if (top == (hawk_rtx_ecb_t*)rtx) return HAWK_NULL;
rtx->ecb = top->next; rtx->ecb = top->next_;
top->next = HAWK_NULL; top->next_ = HAWK_NULL;
return top; return top;
} }
void hawk_rtx_pushecb (hawk_rtx_t* rtx, hawk_rtx_ecb_t* ecb) void hawk_rtx_pushecb (hawk_rtx_t* rtx, hawk_rtx_ecb_t* ecb)
{ {
ecb->next = rtx->ecb; ecb->next_ = rtx->ecb;
rtx->ecb = ecb; rtx->ecb = ecb;
} }
@@ -1045,7 +1064,7 @@ static int init_rtx (hawk_rtx_t* rtx, hawk_t* hawk, hawk_rio_cbs_t* rio)
}; };
hawk_oow_t stack_limit, i; hawk_oow_t stack_limit, i;
rtx->_gem = hawk->_gem; rtx->gem_ = hawk->gem_;
rtx->hawk = hawk; rtx->hawk = hawk;
CLRERR(rtx); CLRERR(rtx);
@@ -1176,6 +1195,14 @@ oops_0:
static void fini_rtx (hawk_rtx_t* rtx, int fini_globals) static void fini_rtx (hawk_rtx_t* rtx, int fini_globals)
{ {
#if !defined(HAWK_ENABLE_ATOMIC_SIG)
if (rtx->sig_mtx_inited)
{
hawk_mtx_fini(&rtx->sig_mtx);
rtx->sig_mtx_inited = 0;
}
#endif
if (rtx->forin.ptr) if (rtx->forin.ptr)
{ {
while (rtx->forin.size > 0) while (rtx->forin.size > 0)
@@ -2249,11 +2276,205 @@ static int run_block (hawk_rtx_t* rtx, hawk_nde_blk_t* nde)
return n; return n;
} }
/* ========================================================================= */
int hawk_rtx_raisesig(hawk_rtx_t* rtx, int sig)
{
if (sig < 0 || sig >= HAWK_COUNTOF(rtx->sig_handler))
{
hawk_rtx_seterrbfmt(rtx, HAWK_NULL, HAWK_EINVAL, "invalid signal number %d", sig);
return -1;
}
/* i assume the sys::signal() is called from the same thread as
* the main runtime context. so i don't use atomic or mutex on
* rtx->sig_handler. */
if (!rtx->sig_handler[sig]) return -1; /* no handler installed */
#if defined(HAWK_ENABLE_ATOMIC_SIG)
{
hawk_uintptr_t bit;
hawk_uintptr_t* word;
int widx;
widx = sig / HAWK_SIG_WORD_BITS;
bit = ((hawk_uintptr_t)1) << (sig % HAWK_SIG_WORD_BITS);
word = &rtx->sig_pending[widx];
(void)HAWK_ATOMIC_FETCH_OR(word, bit, HAWK_ATOMIC_RELAXED);
HAWK_ATOMIC_STORE(&rtx->sig_pending_any, 1, HAWK_ATOMIC_RELAXED);
}
#else
{
int pos;
hawk_mtx_lock(&rtx->sig_mtx, HAWK_NULL);
if (rtx->sig_raise[0].pos[sig] >= 0)
{
/* already raised */
hawk_mtx_unlock(&rtx->sig_mtx);
return 0;
}
pos = rtx->sig_raise[0].count;
rtx->sig_raise[0].pos[sig] = pos;
rtx->sig_raise[0].tab[pos] = sig;
rtx->sig_raise[0].count++;
#if defined(HAWK_ATOMIC_STORE)
HAWK_ATOMIC_STORE(&rtx->sig_pending_any, 1, HAWK_ATOMIC_RELAXED);
#else
rtx->sig_pending_any = 1;
#endif
hawk_mtx_unlock(&rtx->sig_mtx);
}
#endif
return 0;
}
int hawk_rtx_setsighandler (hawk_rtx_t* rtx, int sig, hawk_fun_t* fun)
{
hawk_rtx_ecb_t* ecb, * ecb_next;
if (sig < 0 || sig >= HAWK_COUNTOF(rtx->sig_handler))
{
hawk_rtx_seterrbfmt(rtx, HAWK_NULL, HAWK_EINVAL, "invalid signal number %d", sig);
return -1;
}
/* TODO: anything to do for old handler */
/* i assume the sys::signal() is called from the same thread as
* the runtime context. so i don't use atomic or mutex on
* rtx->sig_handler. */
rtx->sig_handler[sig] = fun;
for (ecb = rtx->ecb; ecb != (hawk_rtx_ecb_t*)(rtx); ecb = ecb_next)
{
ecb_next = ecb->next_;
if (ecb->sigset) ecb->sigset(rtx, sig, fun);
}
return 0;
}
#if defined(HAWK_ENABLE_ATOMIC_SIG)
static HAWK_INLINE int ctz_uintptr (hawk_uintptr_t v)
{
/* precondition - v != 0 */
#if defined(HAWK_HAVE_BUILTIN_CTZL) && (HAWK_SIZEOF_UINTPTR_T <= HAWK_SIZEOF_LONG)
return (int)__builtin_ctzl((unsigned long)v);
#elif defined(HAWK_HAVE_BUILTIN_CTZLL) && (HAWK_SIZEOF_UINTPTR_T <= HAWK_SIZEOF_LONG_LONG)
return (int)__builtin_ctzll((unsigned long long)v);
#else
int c = 0;
while ((v & 1) == 0) { v >>= 1; c++; }
return c;
#endif
}
#endif
static int call_signal_handlers (hawk_rtx_t* rtx)
{
int i;
rtx->sig_handling = 1;
#if defined(HAWK_ENABLE_ATOMIC_SIG)
HAWK_ATOMIC_STORE(&rtx->sig_pending_any, 0, HAWK_ATOMIC_RELAXED);
for (i = 0; i < HAWK_SIG_WORD_COUNT; i++)
{
hawk_uintptr_t bits;
bits = HAWK_ATOMIC_EXCHANGE(&rtx->sig_pending[i], 0, HAWK_ATOMIC_ACQ_REL);
while (bits)
{
int sig;
hawk_fun_t* fun;
hawk_val_t* arg;
hawk_val_t* rv;
int bitpos;
bitpos = ctz_uintptr(bits);
sig = (i * HAWK_SIG_WORD_BITS) + bitpos;
if (sig < 0 || sig >= HAWK_NSIG)
{
bits &= (bits - 1);
continue;
}
fun = rtx->sig_handler[sig];
if (fun)
{
arg = hawk_rtx_makeintval(rtx, sig);
if (HAWK_UNLIKELY(!arg)) return -1;
rv = hawk_rtx_callfun(rtx, fun, &arg, 1);
if (HAWK_UNLIKELY(!rv)) return -1;
hawk_rtx_refdownval(rtx, rv);
}
bits &= (bits - 1);
}
}
#else
hawk_mtx_lock(&rtx->sig_mtx, HAWK_NULL);
#if defined(HAWK_ATOMIC_LOAD)
if (HAWK_ATOMIC_LOAD(&rtx->sig_pending_any, HAWK_ATOMIC_RELAXED) != 0)
#else
if (rtx->sig_pending_any)
#endif
{
/* copy the signal raising state */
rtx->sig_raise[1] = rtx->sig_raise[0];
#if defined(HAWK_ATOMIC_STORE)
HAWK_ATOMIC_STORE(&rtx->sig_pending_any, 0, HAWK_ATOMIC_RELAXED);
#else
rtx->sig_pending_any = 0;
#endif
/* reset the signal raising state modified by hawk_rtx_raisesig() */
rtx->sig_raise[0].count = 0;
for (i = 0; i < HAWK_COUNTOF(rtx->sig_raise[0].pos); i++) rtx->sig_raise[0].pos[i] = -1;
hawk_mtx_unlock(&rtx->sig_mtx);
for (i = 0; i < rtx->sig_raise[1].count; i++)
{
int sig;
hawk_fun_t* fun;
sig = rtx->sig_raise[1].tab[i];
fun = rtx->sig_handler[sig];
if (fun)
{
hawk_val_t* arg;
hawk_val_t* rv;
arg = hawk_rtx_makeintval(rtx, sig);
if (HAWK_UNLIKELY(!arg)) return -1;
/* hawk_rtx_callfun() can invoke run_statement() again. if the signal
* handler is in progress, this function must not be invoked again. */
rv = hawk_rtx_callfun(rtx, fun, &arg, 1);
if (HAWK_UNLIKELY(!rv)) return -1;
hawk_rtx_refdownval(rtx, rv);
}
}
}
#endif
rtx->sig_handling = 0;
return 0;
}
/* ========================================================================= */
#define ON_STATEMENT(rtx,nde) do { \ #define ON_STATEMENT(rtx,nde) do { \
hawk_rtx_ecb_t* ecb, * ecb_next; \ hawk_rtx_ecb_t* ecb, * ecb_next; \
if ((rtx)->hawk->haltall) (rtx)->exit_level = EXIT_ABORT; \ if ((rtx)->hawk->haltall) (rtx)->exit_level = EXIT_ABORT; \
for (ecb = (rtx)->ecb; ecb != (hawk_rtx_ecb_t*)(rtx); ecb = ecb_next) { \ for (ecb = (rtx)->ecb; ecb != (hawk_rtx_ecb_t*)(rtx); ecb = ecb_next) { \
ecb_next = ecb->next; \ ecb_next = ecb->next_; \
if (ecb->stmt) ecb->stmt(rtx, nde, ecb->ctx); \ if (ecb->stmt) ecb->stmt(rtx, nde, ecb->ctx); \
} \ } \
} while(0) } while(0)
@@ -2265,6 +2486,23 @@ static int run_statement (hawk_rtx_t* rtx, hawk_nde_t* nde)
ON_STATEMENT(rtx, nde); ON_STATEMENT(rtx, nde);
if (!rtx->sig_handling)
{
/* run singal handlers if there are raised signals */
#if defined(HAWK_ATOMIC_LOAD)
if (HAWK_ATOMIC_LOAD(&rtx->sig_pending_any, HAWK_ATOMIC_RELAXED) != 0 &&
call_signal_handlers(rtx) <= -1) return -1;
#else
/* NOTE:
* rtx->sig_pending_any accessed non-atomically without mutex concurrently
* from multiple threads(e.g. hawk_rtx_raisesig() called from a different
* thread) is undefined behavior. but ignore this path as i believe most
* modern compilers should support the atomic primitives. */
if (rtx->sig_pending_any && call_signal_handlers(rtx) <= -1) return -1;
#endif
}
/* run the actual statement */
switch (nde->type) switch (nde->type)
{ {
case HAWK_NDE_NULL: case HAWK_NDE_NULL:
@@ -8895,8 +9133,6 @@ oops:
if (str_free) hawk_rtx_freemem(rtx, str_free); if (str_free) hawk_rtx_freemem(rtx, str_free);
return -1; return -1;
} }
/* ========================================================================= */
hawk_ooch_t* hawk_rtx_format ( hawk_ooch_t* hawk_rtx_format (
hawk_rtx_t* rtx, hawk_ooecs_t* out, hawk_ooecs_t* fbu, hawk_rtx_t* rtx, hawk_ooecs_t* out, hawk_ooecs_t* fbu,
const hawk_ooch_t* fmt, hawk_oow_t fmt_len, const hawk_ooch_t* fmt, hawk_oow_t fmt_len,
+19 -19
View File
@@ -35,7 +35,7 @@ static int emit_output (hawk_sed_t* sed, int skipline);
#define EMPTY_REX ((void*)1) #define EMPTY_REX ((void*)1)
#define ADJERR_LOC(sed,l) do { (sed)->_gem.errloc = *(l); } while (0) #define ADJERR_LOC(sed,l) do { (sed)->gem_.errloc = *(l); } while (0)
#define SETERR1(sed,num,argp,argl,loc) \ #define SETERR1(sed,num,argp,argl,loc) \
do { \ do { \
@@ -77,7 +77,7 @@ void hawk_sed_close (hawk_sed_t* sed)
for (ecb = sed->ecb; ecb != (hawk_sed_ecb_t*)sed; ecb = ecb_next) for (ecb = sed->ecb; ecb != (hawk_sed_ecb_t*)sed; ecb = ecb_next)
{ {
ecb_next = ecb->next; /* in case the callback deregisters itself */ ecb_next = ecb->next_; /* in case the callback deregisters itself */
if (ecb->close) ecb->close (sed, ecb->ctx); if (ecb->close) ecb->close (sed, ecb->ctx);
} }
@@ -92,17 +92,17 @@ int hawk_sed_init (hawk_sed_t* sed, hawk_mmgr_t* mmgr, hawk_cmgr_t* cmgr)
{ {
HAWK_MEMSET(sed, 0, HAWK_SIZEOF(*sed)); HAWK_MEMSET(sed, 0, HAWK_SIZEOF(*sed));
sed->_instsize = HAWK_SIZEOF(*sed); sed->instsize_ = HAWK_SIZEOF(*sed);
sed->_gem.mmgr = mmgr; sed->gem_.mmgr = mmgr;
sed->_gem.cmgr = cmgr; sed->gem_.cmgr = cmgr;
/* initialize error handling fields */ /* initialize error handling fields */
sed->_gem.errnum = HAWK_ENOERR; sed->gem_.errnum = HAWK_ENOERR;
sed->_gem.errmsg[0] = '\0'; sed->gem_.errmsg[0] = '\0';
sed->_gem.errloc.line = 0; sed->gem_.errloc.line = 0;
sed->_gem.errloc.colm = 0; sed->gem_.errloc.colm = 0;
sed->_gem.errloc.file = HAWK_NULL; sed->gem_.errloc.file = HAWK_NULL;
sed->_gem.errstr = hawk_dfl_errstr; sed->gem_.errstr = hawk_dfl_errstr;
sed->ecb = (hawk_sed_ecb_t*)sed; /* use this as a special sentinel node */ sed->ecb = (hawk_sed_ecb_t*)sed; /* use this as a special sentinel node */
@@ -158,7 +158,7 @@ void hawk_sed_fini(hawk_sed_t* sed)
hawk_errstr_t hawk_sed_geterrstr (hawk_sed_t* sed) hawk_errstr_t hawk_sed_geterrstr (hawk_sed_t* sed)
{ {
return sed->_gem.errstr; return sed->gem_.errstr;
} }
void hawk_sed_seterrbfmt (hawk_sed_t* sed, const hawk_loc_t* errloc, hawk_errnum_t errnum, const hawk_bch_t* fmt, ...) void hawk_sed_seterrbfmt (hawk_sed_t* sed, const hawk_loc_t* errloc, hawk_errnum_t errnum, const hawk_bch_t* fmt, ...)
@@ -3902,13 +3902,13 @@ void hawk_sed_setlinenum (hawk_sed_t* sed, hawk_oow_t num)
void hawk_sed_killecb (hawk_sed_t* sed, hawk_sed_ecb_t* ecb) void hawk_sed_killecb (hawk_sed_t* sed, hawk_sed_ecb_t* ecb)
{ {
hawk_sed_ecb_t* prev, * cur; hawk_sed_ecb_t* prev, * cur;
for (cur = sed->ecb, prev = HAWK_NULL; cur != (hawk_sed_ecb_t*)sed; cur = cur->next) for (cur = sed->ecb, prev = HAWK_NULL; cur != (hawk_sed_ecb_t*)sed; prev = cur, cur = cur->next_)
{ {
if (cur == ecb) if (cur == ecb)
{ {
if (prev) prev->next = cur->next; if (prev) prev->next_ = cur->next_;
else sed->ecb = cur->next; else sed->ecb = cur->next_;
cur->next = HAWK_NULL; cur->next_ = HAWK_NULL;
break; break;
} }
} }
@@ -3918,14 +3918,14 @@ hawk_sed_ecb_t* hawk_sed_popecb (hawk_sed_t* sed)
{ {
hawk_sed_ecb_t* top = sed->ecb; hawk_sed_ecb_t* top = sed->ecb;
if (top == (hawk_sed_ecb_t*)sed) return HAWK_NULL; if (top == (hawk_sed_ecb_t*)sed) return HAWK_NULL;
sed->ecb = top->next; sed->ecb = top->next_;
top->next = HAWK_NULL; top->next_ = HAWK_NULL;
return top; return top;
} }
void hawk_sed_pushecb (hawk_sed_t* sed, hawk_sed_ecb_t* ecb) void hawk_sed_pushecb (hawk_sed_t* sed, hawk_sed_ecb_t* ecb)
{ {
ecb->next = sed->ecb; ecb->next_ = sed->ecb;
sed->ecb = ecb; sed->ecb = ecb;
} }
+53 -53
View File
@@ -62,7 +62,7 @@ hawk_sio_t* hawk_sio_open (hawk_gem_t* gem, hawk_oow_t xtnsize, const hawk_ooch_
{ {
if (hawk_sio_init(sio, gem, file, flags) <= -1) if (hawk_sio_init(sio, gem, file, flags) <= -1)
{ {
hawk_gem_freemem (gem, sio); hawk_gem_freemem(gem, sio);
return HAWK_NULL; return HAWK_NULL;
} }
else HAWK_MEMSET (sio + 1, 0, xtnsize); else HAWK_MEMSET (sio + 1, 0, xtnsize);
@@ -105,7 +105,7 @@ hawk_sio_t* hawk_sio_openstd (hawk_gem_t* gem, hawk_oow_t xtnsize, hawk_sio_std_
void hawk_sio_close (hawk_sio_t* sio) void hawk_sio_close (hawk_sio_t* sio)
{ {
hawk_sio_fini (sio); hawk_sio_fini (sio);
hawk_gem_freemem (sio->gem, sio); hawk_gem_freemem(sio->gem, sio);
} }
int hawk_sio_init (hawk_sio_t* sio, hawk_gem_t* gem, const hawk_ooch_t* path, int flags) int hawk_sio_init (hawk_sio_t* sio, hawk_gem_t* gem, const hawk_ooch_t* path, int flags)
@@ -156,7 +156,7 @@ int hawk_sio_init (hawk_sio_t* sio, hawk_gem_t* gem, const hawk_ooch_t* path, in
if (hawk_tio_init(&sio->tio.io, gem, topt) <= -1) goto oops03; if (hawk_tio_init(&sio->tio.io, gem, topt) <= -1) goto oops03;
/* store the back-reference to sio in the extension area.*/ /* store the back-reference to sio in the extension area.*/
/*HAWK_ASSERT(hawk, (&sio->tio.io + 1) == &sio->tio.xtn);*/ /*HAWK_ASSERT((&sio->tio.io + 1) == &sio->tio.xtn);*/
*(hawk_sio_t**)(&sio->tio.io + 1) = sio; *(hawk_sio_t**)(&sio->tio.io + 1) = sio;
if (hawk_tio_attachin(&sio->tio.io, file_input, sio->inbuf, HAWK_COUNTOF(sio->inbuf)) <= -1 || if (hawk_tio_attachin(&sio->tio.io, file_input, sio->inbuf, HAWK_COUNTOF(sio->inbuf)) <= -1 ||
@@ -171,13 +171,13 @@ int hawk_sio_init (hawk_sio_t* sio, hawk_gem_t* gem, const hawk_ooch_t* path, in
return 0; return 0;
oops04: oops04:
hawk_tio_fini (&sio->tio.io); hawk_tio_fini(&sio->tio.io);
oops03: oops03:
if (sio->path) hawk_gem_freemem (sio->gem, sio->path); if (sio->path) hawk_gem_freemem(sio->gem, sio->path);
oops02: oops02:
hawk_fio_fini (&sio->file); hawk_fio_fini(&sio->file);
oops01: oops01:
if (sio->mtx) hawk_mtx_close (sio->mtx); if (sio->mtx) hawk_mtx_close(sio->mtx);
oops00: oops00:
return -1; return -1;
} }
@@ -208,11 +208,11 @@ int hawk_sio_initstd (hawk_sio_t* sio, hawk_gem_t* gem, hawk_sio_std_t std, int
void hawk_sio_fini (hawk_sio_t* sio) void hawk_sio_fini (hawk_sio_t* sio)
{ {
/*if (hawk_sio_flush (sio) <= -1) return -1;*/ /*if (hawk_sio_flush (sio) <= -1) return -1;*/
hawk_sio_flush (sio); hawk_sio_flush(sio);
hawk_tio_fini (&sio->tio.io); hawk_tio_fini(&sio->tio.io);
hawk_fio_fini (&sio->file); hawk_fio_fini(&sio->file);
if (sio->path) hawk_gem_freemem (sio->gem, sio->path); if (sio->path) hawk_gem_freemem(sio->gem, sio->path);
if (sio->mtx) hawk_mtx_close (sio->mtx); if (sio->mtx) hawk_mtx_close(sio->mtx);
} }
hawk_cmgr_t* hawk_sio_getcmgr (hawk_sio_t* sio) hawk_cmgr_t* hawk_sio_getcmgr (hawk_sio_t* sio)
@@ -222,7 +222,7 @@ hawk_cmgr_t* hawk_sio_getcmgr (hawk_sio_t* sio)
void hawk_sio_setcmgr (hawk_sio_t* sio, hawk_cmgr_t* cmgr) void hawk_sio_setcmgr (hawk_sio_t* sio, hawk_cmgr_t* cmgr)
{ {
hawk_tio_setcmgr (&sio->tio.io, cmgr); hawk_tio_setcmgr(&sio->tio.io, cmgr);
} }
hawk_sio_hnd_t hawk_sio_gethnd (const hawk_sio_t* sio) hawk_sio_hnd_t hawk_sio_gethnd (const hawk_sio_t* sio)
@@ -242,34 +242,34 @@ const hawk_ooch_t* hawk_sio_getpath (hawk_sio_t* sio)
hawk_ooi_t hawk_sio_flush (hawk_sio_t* sio) hawk_ooi_t hawk_sio_flush (hawk_sio_t* sio)
{ {
hawk_ooi_t n; hawk_ooi_t n;
LOCK_OUTPUT (sio); LOCK_OUTPUT(sio);
n = hawk_tio_flush(&sio->tio.io); n = hawk_tio_flush(&sio->tio.io);
UNLOCK_OUTPUT (sio); UNLOCK_OUTPUT(sio);
return n; return n;
} }
void hawk_sio_drain (hawk_sio_t* sio) void hawk_sio_drain (hawk_sio_t* sio)
{ {
LOCK_OUTPUT (sio); LOCK_OUTPUT(sio);
hawk_tio_drain (&sio->tio.io); hawk_tio_drain (&sio->tio.io);
UNLOCK_OUTPUT (sio); UNLOCK_OUTPUT(sio);
} }
hawk_ooi_t hawk_sio_getbchar (hawk_sio_t* sio, hawk_bch_t* c) hawk_ooi_t hawk_sio_getbchar (hawk_sio_t* sio, hawk_bch_t* c)
{ {
hawk_ooi_t n; hawk_ooi_t n;
LOCK_INPUT (sio); LOCK_INPUT(sio);
n = hawk_tio_readbchars(&sio->tio.io, c, 1); n = hawk_tio_readbchars(&sio->tio.io, c, 1);
UNLOCK_INPUT (sio); UNLOCK_INPUT(sio);
return n; return n;
} }
hawk_ooi_t hawk_sio_getuchar (hawk_sio_t* sio, hawk_uch_t* c) hawk_ooi_t hawk_sio_getuchar (hawk_sio_t* sio, hawk_uch_t* c)
{ {
hawk_ooi_t n; hawk_ooi_t n;
LOCK_INPUT (sio); LOCK_INPUT(sio);
n = hawk_tio_readuchars(&sio->tio.io, c, 1); n = hawk_tio_readuchars(&sio->tio.io, c, 1);
UNLOCK_INPUT (sio); UNLOCK_INPUT(sio);
return n; return n;
} }
@@ -284,10 +284,10 @@ hawk_ooi_t hawk_sio_getbcstr (hawk_sio_t* sio, hawk_bch_t* buf, hawk_oow_t size)
* so I don't implement any hack here */ * so I don't implement any hack here */
#endif #endif
LOCK_INPUT (sio); LOCK_INPUT(sio);
n = hawk_tio_readbchars(&sio->tio.io, buf, size - 1); n = hawk_tio_readbchars(&sio->tio.io, buf, size - 1);
if (n <= -1) return -1; if (n <= -1) return -1;
UNLOCK_INPUT (sio); UNLOCK_INPUT(sio);
buf[n] = '\0'; buf[n] = '\0';
return n; return n;
@@ -301,9 +301,9 @@ hawk_ooi_t hawk_sio_getbchars (hawk_sio_t* sio, hawk_bch_t* buf, hawk_oow_t size
* so I don't implement any hack here */ * so I don't implement any hack here */
#endif #endif
LOCK_INPUT (sio); LOCK_INPUT(sio);
n = hawk_tio_readbchars(&sio->tio.io, buf, size); n = hawk_tio_readbchars(&sio->tio.io, buf, size);
UNLOCK_INPUT (sio); UNLOCK_INPUT(sio);
return n; return n;
} }
@@ -319,9 +319,9 @@ hawk_ooi_t hawk_sio_getucstr (hawk_sio_t* sio, hawk_uch_t* buf, hawk_oow_t size)
* so I don't implement any hack here */ * so I don't implement any hack here */
#endif #endif
LOCK_INPUT (sio); LOCK_INPUT(sio);
n = hawk_tio_readuchars(&sio->tio.io, buf, size - 1); n = hawk_tio_readuchars(&sio->tio.io, buf, size - 1);
UNLOCK_INPUT (sio); UNLOCK_INPUT(sio);
buf[n] = '\0'; buf[n] = '\0';
return n; return n;
@@ -336,9 +336,9 @@ hawk_ooi_t hawk_sio_getuchars(hawk_sio_t* sio, hawk_uch_t* buf, hawk_oow_t size)
* so I don't implement any hack here */ * so I don't implement any hack here */
#endif #endif
LOCK_INPUT (sio); LOCK_INPUT(sio);
n = hawk_tio_readuchars (&sio->tio.io, buf, size); n = hawk_tio_readuchars (&sio->tio.io, buf, size);
UNLOCK_INPUT (sio); UNLOCK_INPUT(sio);
return n; return n;
} }
@@ -362,9 +362,9 @@ static hawk_ooi_t putbc_no_mutex (hawk_sio_t* sio, hawk_bch_t c)
hawk_ooi_t hawk_sio_putbchar (hawk_sio_t* sio, hawk_bch_t c) hawk_ooi_t hawk_sio_putbchar (hawk_sio_t* sio, hawk_bch_t c)
{ {
hawk_ooi_t n; hawk_ooi_t n;
LOCK_OUTPUT (sio); LOCK_OUTPUT(sio);
n = putbc_no_mutex(sio, c); n = putbc_no_mutex(sio, c);
UNLOCK_OUTPUT (sio); UNLOCK_OUTPUT(sio);
return n; return n;
} }
@@ -390,9 +390,9 @@ static hawk_ooi_t put_uchar_no_mutex (hawk_sio_t* sio, hawk_uch_t c)
hawk_ooi_t hawk_sio_putuchar (hawk_sio_t* sio, hawk_uch_t c) hawk_ooi_t hawk_sio_putuchar (hawk_sio_t* sio, hawk_uch_t c)
{ {
hawk_ooi_t n; hawk_ooi_t n;
LOCK_OUTPUT (sio); LOCK_OUTPUT(sio);
n = put_uchar_no_mutex(sio, c); n = put_uchar_no_mutex(sio, c);
UNLOCK_OUTPUT (sio); UNLOCK_OUTPUT(sio);
return n; return n;
} }
@@ -406,7 +406,7 @@ hawk_ooi_t hawk_sio_putbcstr (hawk_sio_t* sio, const hawk_bch_t* str)
#elif defined(__OS2__) #elif defined(__OS2__)
if (sio->status & STATUS_LINE_BREAK) if (sio->status & STATUS_LINE_BREAK)
{ {
LOCK_OUTPUT (sio); LOCK_OUTPUT(sio);
for (n = 0; n < HAWK_TYPE_MAX(hawk_ooi_t) && str[n] != '\0'; n++) for (n = 0; n < HAWK_TYPE_MAX(hawk_ooi_t) && str[n] != '\0'; n++)
{ {
if ((n = putbc_no_mutex(sio, str[n])) <= -1) if ((n = putbc_no_mutex(sio, str[n])) <= -1)
@@ -415,14 +415,14 @@ hawk_ooi_t hawk_sio_putbcstr (hawk_sio_t* sio, const hawk_bch_t* str)
break; break;
} }
} }
UNLOCK_OUTPUT (sio); UNLOCK_OUTPUT(sio);
return n; return n;
} }
#endif #endif
LOCK_OUTPUT (sio); LOCK_OUTPUT(sio);
n = hawk_tio_writebchars(&sio->tio.io, str, (hawk_oow_t)-1); n = hawk_tio_writebchars(&sio->tio.io, str, (hawk_oow_t)-1);
UNLOCK_OUTPUT (sio); UNLOCK_OUTPUT(sio);
return n; return n;
} }
@@ -437,7 +437,7 @@ hawk_ooi_t hawk_sio_putbchars (hawk_sio_t* sio, const hawk_bch_t* str, hawk_oow_
if (sio->status & STATUS_LINE_BREAK) if (sio->status & STATUS_LINE_BREAK)
{ {
if (size > HAWK_TYPE_MAX(hawk_ooi_t)) size = HAWK_TYPE_MAX(hawk_ooi_t); if (size > HAWK_TYPE_MAX(hawk_ooi_t)) size = HAWK_TYPE_MAX(hawk_ooi_t);
LOCK_OUTPUT (sio); LOCK_OUTPUT(sio);
for (n = 0; n < size; n++) for (n = 0; n < size; n++)
{ {
if (putbc_no_mutex(sio, str[n]) <= -1) if (putbc_no_mutex(sio, str[n]) <= -1)
@@ -446,14 +446,14 @@ hawk_ooi_t hawk_sio_putbchars (hawk_sio_t* sio, const hawk_bch_t* str, hawk_oow_
break; break;
} }
} }
UNLOCK_OUTPUT (sio); UNLOCK_OUTPUT(sio);
return n; return n;
} }
#endif #endif
LOCK_OUTPUT (sio); LOCK_OUTPUT(sio);
n = hawk_tio_writebchars (&sio->tio.io, str, size); n = hawk_tio_writebchars (&sio->tio.io, str, size);
UNLOCK_OUTPUT (sio); UNLOCK_OUTPUT(sio);
return n; return n;
} }
@@ -490,7 +490,7 @@ hawk_ooi_t hawk_sio_putucstr (hawk_sio_t* sio, const hawk_uch_t* str)
#elif defined(__OS2__) #elif defined(__OS2__)
if (sio->status & STATUS_LINE_BREAK) if (sio->status & STATUS_LINE_BREAK)
{ {
LOCK_OUTPUT (sio); LOCK_OUTPUT(sio);
for (n = 0; n < HAWK_TYPE_MAX(hawk_ooi_t) && str[n] != '\0'; n++) for (n = 0; n < HAWK_TYPE_MAX(hawk_ooi_t) && str[n] != '\0'; n++)
{ {
if (put_uchar_no_mutex(sio, str[n]) <= -1) if (put_uchar_no_mutex(sio, str[n]) <= -1)
@@ -499,14 +499,14 @@ hawk_ooi_t hawk_sio_putucstr (hawk_sio_t* sio, const hawk_uch_t* str)
break; break;
} }
} }
UNLOCK_OUTPUT (sio); UNLOCK_OUTPUT(sio);
return n; return n;
} }
#endif #endif
LOCK_OUTPUT (sio); LOCK_OUTPUT(sio);
n = hawk_tio_writeuchars(&sio->tio.io, str, (hawk_oow_t)-1); n = hawk_tio_writeuchars(&sio->tio.io, str, (hawk_oow_t)-1);
UNLOCK_OUTPUT (sio); UNLOCK_OUTPUT(sio);
return n; return n;
} }
@@ -564,7 +564,7 @@ hawk_ooi_t hawk_sio_putuchars (hawk_sio_t* sio, const hawk_uch_t* str, hawk_oow_
if (sio->status & STATUS_LINE_BREAK) if (sio->status & STATUS_LINE_BREAK)
{ {
if (size > HAWK_TYPE_MAX(hawk_ooi_t)) size = HAWK_TYPE_MAX(hawk_ooi_t); if (size > HAWK_TYPE_MAX(hawk_ooi_t)) size = HAWK_TYPE_MAX(hawk_ooi_t);
LOCK_OUTPUT (sio); LOCK_OUTPUT(sio);
for (n = 0; n < size; n++) for (n = 0; n < size; n++)
{ {
if (put_uchar_no_mutex(sio, str[n]) <= -1) if (put_uchar_no_mutex(sio, str[n]) <= -1)
@@ -573,14 +573,14 @@ hawk_ooi_t hawk_sio_putuchars (hawk_sio_t* sio, const hawk_uch_t* str, hawk_oow_
break; break;
} }
} }
UNLOCK_OUTPUT (sio); UNLOCK_OUTPUT(sio);
return n; return n;
} }
#endif #endif
LOCK_OUTPUT (sio); LOCK_OUTPUT(sio);
n = hawk_tio_writeuchars(&sio->tio.io, str, size); n = hawk_tio_writeuchars(&sio->tio.io, str, size);
UNLOCK_OUTPUT (sio); UNLOCK_OUTPUT(sio);
return n; return n;
} }
@@ -634,8 +634,8 @@ static hawk_ooi_t file_input (hawk_tio_t* tio, hawk_tio_cmd_t cmd, void* buf, ha
hawk_sio_t* sio; hawk_sio_t* sio;
sio = *(hawk_sio_t**)(tio + 1); sio = *(hawk_sio_t**)(tio + 1);
/*HAWK_ASSERT (tio->hawk, sio != HAWK_NULL); /*HAWK_ASSERT(sio != HAWK_NULL);
HAWK_ASSERT (tio->hawk, tio->hawk == sio->hawk);*/ HAWK_ASSERT(tio->hawk == sio->hawk);*/
return hawk_fio_read(&sio->file, buf, size); return hawk_fio_read(&sio->file, buf, size);
} }
@@ -650,8 +650,8 @@ static hawk_ooi_t file_output (hawk_tio_t* tio, hawk_tio_cmd_t cmd, void* buf, h
hawk_sio_t* sio; hawk_sio_t* sio;
sio = *(hawk_sio_t**)(tio + 1); sio = *(hawk_sio_t**)(tio + 1);
/*HAWK_ASSERT (tio->hawk, sio != HAWK_NULL); /*HAWK_ASSERT(sio != HAWK_NULL);
HAWK_ASSERT (tio->hawk, tio->hawk == sio->hawk);*/ HAWK_ASSERT(tio->hawk == sio->hawk);*/
return hawk_fio_write(&sio->file, buf, size); return hawk_fio_write(&sio->file, buf, size);
} }
+1 -2
View File
@@ -77,7 +77,6 @@ hawk_cut_t* hawk_cut_openstd (hawk_oow_t xtnsize, hawk_errinf_t* errinf)
hawk_cut_t* hawk_cut_openstdwithmmgr (hawk_mmgr_t* mmgr, hawk_oow_t xtnsize, hawk_cmgr_t* cmgr, hawk_errinf_t* errinf) hawk_cut_t* hawk_cut_openstdwithmmgr (hawk_mmgr_t* mmgr, hawk_oow_t xtnsize, hawk_cmgr_t* cmgr, hawk_errinf_t* errinf)
{ {
hawk_cut_t* cut; hawk_cut_t* cut;
xtn_t* xtn;
if (!mmgr) mmgr = hawk_get_sys_mmgr(); if (!mmgr) mmgr = hawk_get_sys_mmgr();
if (!cmgr) cmgr = hawk_get_cmgr_by_id(HAWK_CMGR_UTF8); if (!cmgr) cmgr = hawk_get_cmgr_by_id(HAWK_CMGR_UTF8);
@@ -86,7 +85,7 @@ hawk_cut_t* hawk_cut_openstdwithmmgr (hawk_mmgr_t* mmgr, hawk_oow_t xtnsize, haw
cut = hawk_cut_open(mmgr, HAWK_SIZEOF(xtn_t) + xtnsize, cmgr, errinf); cut = hawk_cut_open(mmgr, HAWK_SIZEOF(xtn_t) + xtnsize, cmgr, errinf);
if (HAWK_UNLIKELY(!cut)) return HAWK_NULL; if (HAWK_UNLIKELY(!cut)) return HAWK_NULL;
cut->_instsize += HAWK_SIZEOF(xtn_t); cut->instsize_ += HAWK_SIZEOF(xtn_t);
return cut; return cut;
} }
+1 -1
View File
@@ -52,7 +52,7 @@ hawk_json_t* hawk_json_openstdwithmmgr (hawk_mmgr_t* mmgr, hawk_oow_t xtnsize, h
json = hawk_json_open(mmgr, HAWK_SIZEOF(xtn_t) + xtnsize, cmgr, prim, errinf); json = hawk_json_open(mmgr, HAWK_SIZEOF(xtn_t) + xtnsize, cmgr, prim, errinf);
if (HAWK_UNLIKELY(!json)) return HAWK_NULL; if (HAWK_UNLIKELY(!json)) return HAWK_NULL;
json->_instsize += HAWK_SIZEOF(xtn_t); json->instsize_ += HAWK_SIZEOF(xtn_t);
return json; return json;
} }
+1 -1
View File
@@ -121,7 +121,7 @@ hawk_sed_t* hawk_sed_openstdwithmmgr(hawk_mmgr_t* mmgr, hawk_oow_t xtnsize, hawk
sed = hawk_sed_open(mmgr, HAWK_SIZEOF(xtn_t) + xtnsize, cmgr, errinf); sed = hawk_sed_open(mmgr, HAWK_SIZEOF(xtn_t) + xtnsize, cmgr, errinf);
if (HAWK_UNLIKELY(!sed)) return HAWK_NULL; if (HAWK_UNLIKELY(!sed)) return HAWK_NULL;
sed->_instsize += HAWK_SIZEOF(xtn_t); sed->instsize_ += HAWK_SIZEOF(xtn_t);
return sed; return sed;
} }
+3 -3
View File
@@ -1014,7 +1014,7 @@ hawk_t* hawk_openstdwithmmgr (hawk_mmgr_t* mmgr, hawk_oow_t xtnsize, hawk_cmgr_t
if (HAWK_UNLIKELY(!hawk)) return HAWK_NULL; if (HAWK_UNLIKELY(!hawk)) return HAWK_NULL;
/* adjust the object size by the sizeof xtn_t so that hawk_getxtn() returns the right pointer. */ /* adjust the object size by the sizeof xtn_t so that hawk_getxtn() returns the right pointer. */
hawk->_instsize += HAWK_SIZEOF(xtn_t); hawk->instsize_ += HAWK_SIZEOF(xtn_t);
/* /*
#if defined(USE_DLFCN) #if defined(USE_DLFCN)
@@ -2738,7 +2738,7 @@ static void fini_rxtn (hawk_rtx_t* rtx, void* ctx)
if (rxtn->cmgrtab_inited) if (rxtn->cmgrtab_inited)
{ {
hawk_htb_fini (&rxtn->cmgrtab); hawk_htb_fini(&rxtn->cmgrtab);
rxtn->cmgrtab_inited = 0; rxtn->cmgrtab_inited = 0;
} }
} }
@@ -3009,7 +3009,7 @@ static hawk_rtx_t* open_rtx_std (
rtx = hawk_rtx_open(hawk, HAWK_SIZEOF(rxtn_t) + xtnsize, &rio); rtx = hawk_rtx_open(hawk, HAWK_SIZEOF(rxtn_t) + xtnsize, &rio);
if (HAWK_UNLIKELY(!rtx)) return HAWK_NULL; if (HAWK_UNLIKELY(!rtx)) return HAWK_NULL;
rtx->_instsize += HAWK_SIZEOF(rxtn_t); rtx->instsize_ += HAWK_SIZEOF(rxtn_t);
rxtn = GET_RXTN(rtx); rxtn = GET_RXTN(rtx);
+3 -3
View File
@@ -1723,7 +1723,7 @@ void hawk_rtx_refupval(hawk_rtx_t* rtx, hawk_val_t* val)
#endif #endif
#if defined(USE_ATOMIC_REFCNT) && __has_builtin(__atomic_fetch_add) #if defined(USE_ATOMIC_REFCNT) && __has_builtin(__atomic_fetch_add)
__atomic_fetch_add(&val->v_refs, 1, __ATOMIC_RELAXED); __atomic_fetch_add(&val->v_refs, 1, HAWK_ATOMIC_RELAXED);
#else #else
val->v_refs++; val->v_refs++;
#endif #endif
@@ -1744,7 +1744,7 @@ void hawk_rtx_refdownval(hawk_rtx_t* rtx, hawk_val_t* val)
HAWK_ASSERT(val->v_refs > 0); HAWK_ASSERT(val->v_refs > 0);
#if defined(USE_ATOMIC_REFCNT) && __has_builtin(__atomic_fetch_sub) #if defined(USE_ATOMIC_REFCNT) && __has_builtin(__atomic_fetch_sub)
if (__atomic_fetch_sub(&val->v_refs, 1, __ATOMIC_RELAXED) == 1) if (__atomic_fetch_sub(&val->v_refs, 1, HAWK_ATOMIC_RELAXED) == 1)
{ {
hawk_rtx_freeval (rtx, val, HAWK_RTX_FREEVAL_CACHE); hawk_rtx_freeval (rtx, val, HAWK_RTX_FREEVAL_CACHE);
} }
@@ -1768,7 +1768,7 @@ void hawk_rtx_refdownval_nofree (hawk_rtx_t* rtx, hawk_val_t* val)
HAWK_ASSERT(val->v_refs > 0); HAWK_ASSERT(val->v_refs > 0);
#if defined(USE_ATOMIC_REFCNT) && __has_builtin(__atomic_fetch_sub) #if defined(USE_ATOMIC_REFCNT) && __has_builtin(__atomic_fetch_sub)
__atomic_fetch_sub(&val->v_refs, 1, __ATOMIC_RELAXED); __atomic_fetch_sub(&val->v_refs, 1, HAWK_ATOMIC_RELAXED);
#else #else
val->v_refs--; val->v_refs--;
#endif #endif