diff --git a/include/simics/dmllib.h b/include/simics/dmllib.h index ba570a22..153909fb 100644 --- a/include/simics/dmllib.h +++ b/include/simics/dmllib.h @@ -2286,6 +2286,15 @@ _DML_get_qname(_identity_t id, const _id_info_t *id_infos, return qname; } +void +_DML_free_qname_cache(qname_cache_t *cache) +{ + for (int i = 0; i < 4; i++) { + MM_FREE(cache->bufs[i]); + cache->bufs[i] = NULL; + } +} + static inline int DML_pointer_eq(lang_void *data, lang_void *match_data) { return data == match_data; } diff --git a/lib/1.4/dml-builtins.dml b/lib/1.4/dml-builtins.dml index 4c686f60..d4fcea79 100644 --- a/lib/1.4/dml-builtins.dml +++ b/lib/1.4/dml-builtins.dml @@ -663,7 +663,10 @@ template device { method _init() { _rec_init(); } method _post_init() { _rec_post_init(); } - method _destroy() { _rec_destroy(); } + method _destroy() { + _rec_destroy(); + _DML_free_qname_cache(); + } method init() default {} method post_init() default {} method destroy() default {} @@ -3735,6 +3738,7 @@ template init_val is init { extern const char *_DML_get_qname(_identity_t, const _id_info_t *, dml_qname_cache_t *, const char *); +extern void _DML_free_qname_cache(dml_qname_cache_t *); template _qname { shared method _qname() -> (const char *) { local _qname ref = this;