#if A_THREADSAFE
#define PTABLE_NAME ptable_loaded
-#define PTABLE_VAL_FREE(V) NOOP
+#define PTABLE_NEED_DELETE 1
+#define PTABLE_NEED_WALK 0
#include "ptable.h"
#define PTABLE_NAME ptable_hints
#define PTABLE_VAL_FREE(V) A_HINT_FREE(V)
+#define PTABLE_NEED_DELETE 0
+#define PTABLE_NEED_WALK 1
#define pPTBL pTHX
#define pPTBL_ pTHX_
#endif /* A_WORKAROUND_REQUIRE_PROPAGATION */
#define PTABLE_NAME ptable_seen
-#define PTABLE_VAL_FREE(V) NOOP
+#define PTABLE_NEED_DELETE 0
+#define PTABLE_NEED_WALK 0
#include "ptable.h"
#define PTABLE_NAME ptable_map
#define PTABLE_VAL_FREE(V) PerlMemShared_free(V)
+#define PTABLE_NEED_DELETE 1
+#define PTABLE_NEED_WALK 0
#include "ptable.h"
/* PerlMemShared_free() needs the [ap]PTBLMS_? default values */
#define ptable_map_store(T, K, V) ptable_map_store(aPTBLMS_ (T), (K), (V))
#define ptable_map_delete(T, K) ptable_map_delete(aPTBLMS_ (T), (K))
+#define ptable_map_free(T) ptable_map_free(aPTBLMS_ (T))
static ptable *a_op_map = NULL;
}
o = old_ck(aTHX_ o);
- if (hint & A_HINT_DO) {
#if A_HAS_MULTIDEREF
- if (old_ck == a_old_ck_rv2sv && o->op_flags & OPf_KIDS) {
- OP *kid = cUNOPo->op_first;
- if (kid && kid->op_type == OP_GV)
+ if (old_ck == a_old_ck_rv2sv && o->op_flags & OPf_KIDS) {
+ OP *kid = cUNOPo->op_first;
+ if (kid && kid->op_type == OP_GV) {
+ if (hint & A_HINT_DO)
a_map_store(kid, kid->op_ppaddr, NULL, hint);
+ else
+ a_map_delete(kid);
}
+ }
#endif
+
+ if (hint & A_HINT_DO) {
a_map_store_root(o, o->op_ppaddr, hint);
o->op_ppaddr = a_pp_deref;
} else
ptable_map_free(a_op_map);
a_op_map = NULL;
+
+#ifdef USE_ITHREADS
+ MUTEX_DESTROY(&a_op_map_mutex);
+#endif
}
A_LOADED_UNLOCK;
PERL_HASH(a_hash, __PACKAGE__, __PACKAGE_LEN__);
a_op_map = ptable_new();
+
#ifdef USE_ITHREADS
MUTEX_INIT(&a_op_map_mutex);
#endif