move insn_cache into cs_struct to gurantee thread-safe
diff --git a/arch/AArch64/mapping.c b/arch/AArch64/mapping.c
index 73ad300..3c77373 100644
--- a/arch/AArch64/mapping.c
+++ b/arch/AArch64/mapping.c
@@ -2991,18 +2991,16 @@
 	// { AArch64_SUBSxxx_lsl, ARM64_INS_NEGS, { 0 }, { ARM64_REG_NZCV, 0 }, { 0 } },
 };
 
-static unsigned short *insn_cache = NULL;
-
 // given internal insn id, return public instruction info
-void AArch64_get_insn_id(cs_insn *insn, unsigned int id, int detail)
+void AArch64_get_insn_id(cs_struct *h, cs_insn *insn, unsigned int id)
 {
-	int i = insn_find(insns, ARR_SIZE(insns), id, &insn_cache);
+	int i = insn_find(insns, ARR_SIZE(insns), id, &h->insn_cache);
 	if (i != 0) {
 		insn->id = insns[i].mapid;
 
-		if (detail) {
+		if (h->detail) {
 			cs_struct handle;
-			handle.detail = detail;
+			handle.detail = h->detail;
 
 			memcpy(insn->detail->regs_read, insns[i].regs_use, sizeof(insns[i].regs_use));
 			insn->detail->regs_read_count = count_positive(insns[i].regs_use);
@@ -3527,9 +3525,8 @@
 	return (i != -1)? i : ARM64_REG_INVALID;
 }
 
-void AArch64_free_cache(void)
+void AArch64_free_cache(cs_struct *h)
 {
-	my_free(insn_cache);
-
-	insn_cache = NULL;
+	my_free(h->insn_cache);
+	h->insn_cache = NULL;
 }
diff --git a/arch/AArch64/mapping.h b/arch/AArch64/mapping.h
index 4bcd40d..402ee83 100644
--- a/arch/AArch64/mapping.h
+++ b/arch/AArch64/mapping.h
@@ -11,7 +11,7 @@
 const char *AArch64_reg_name(csh handle, unsigned int reg);
 
 // given internal insn id, return public instruction info
-void AArch64_get_insn_id(cs_insn *insn, unsigned int id, int detail);
+void AArch64_get_insn_id(cs_struct *h, cs_insn *insn, unsigned int id);
 
 // given public insn id, return internal instruction ID
 unsigned int AArch64_get_insn_id2(unsigned int id);
@@ -22,6 +22,6 @@
 arm64_reg AArch64_map_insn(const char *name);
 
 // free insn cache
-void AArch64_free_cache(void);
+void AArch64_free_cache(cs_struct *h);
 
 #endif
diff --git a/arch/AArch64/module.c b/arch/AArch64/module.c
index 60f9654..9d28889 100644
--- a/arch/AArch64/module.c
+++ b/arch/AArch64/module.c
@@ -32,7 +32,7 @@
 
 static void destroy(cs_struct *handle)
 {
-	AArch64_free_cache();
+	AArch64_free_cache(handle);
 }
 
 static void __attribute__ ((constructor)) __init_arm64__()