From: <di...@us...> - 2022-10-06 16:24:17
|
Revision: 3786 http://sourceforge.net/p/ftm/code/3786 Author: diemo Date: 2022-10-06 16:24:15 +0000 (Thu, 06 Oct 2022) Log Message: ----------- fix the very last bug in ftm: crash with check_external_scopes/resolve_unresolved_scopes: an ftm external needs to be removed from the scopes table maxpat_check_external_hash when deleted, since this can happen before check_external_scopes, depending on loadbang order. Modified Paths: -------------- trunk/ftm/ftmlib/max5/ftmexternals.h trunk/ftm/ftmlib/max5/maxext.c trunk/ftm/ftmlib/max5/maxpat.c trunk/ftm/ftmlib/namedef.c Modified: trunk/ftm/ftmlib/max5/ftmexternals.h =================================================================== --- trunk/ftm/ftmlib/max5/ftmexternals.h 2022-10-06 12:04:54 UTC (rev 3785) +++ trunk/ftm/ftmlib/max5/ftmexternals.h 2022-10-06 16:24:15 UTC (rev 3786) @@ -531,6 +531,7 @@ FTS_API fts_scope_t *maxpat_new_scope(t_object *maxpat); FTS_API void maxpat_fix_scope(ftmext_t *ext, fts_scope_t *scope); FTS_API void maxpat_register_new_external(ftmext_t *ext); +FTS_API void maxpat_unregister_external(ftmext_t *ext); FTS_API void maxpat_is_closing(void); FTS_API int maxext_is_loading(void); Modified: trunk/ftm/ftmlib/max5/maxext.c =================================================================== --- trunk/ftm/ftmlib/max5/maxext.c 2022-10-06 12:04:54 UTC (rev 3785) +++ trunk/ftm/ftmlib/max5/maxext.c 2022-10-06 16:24:15 UTC (rev 3786) @@ -32,9 +32,11 @@ /* debug scope console printouts */ #ifndef WIN32 -#define debug_post(args...) -//#define debug_post(args...) post(args) -//#define debug_post(args...) printf(args); puts("\n") +# if !defined(DEBUG) || DEBUG == 0 || defined(NDEBUG) +# define debug_post(args...) {} /*empty*/ +# else +# define debug_post(args...) printf(args); puts("\n") //post(args) +# endif #else static void debug_post(const char *format, ...){} #endif @@ -929,6 +931,8 @@ void maxext_delete(ftmext_t *ext) { + debug_post("maxext_delete %p", ext); + maxpat_unregister_external(ext); maxext_delete_dsp(ext); /* should be first!! */ maxext_delete_alarm(ext); maxext_delete_inlets(ext); Modified: trunk/ftm/ftmlib/max5/maxpat.c =================================================================== --- trunk/ftm/ftmlib/max5/maxpat.c 2022-10-06 12:04:54 UTC (rev 3785) +++ trunk/ftm/ftmlib/max5/maxpat.c 2022-10-06 16:24:15 UTC (rev 3786) @@ -26,8 +26,11 @@ /* debug scope console printouts */ #ifndef WIN32 -#define debug_post(args...) -//#define debug_post(args...) printf(args); puts("\n") //post(args) +# if !defined(DEBUG) || DEBUG == 0 || defined(NDEBUG) +# define debug_post(args...) {} /*empty*/ +# else +# define debug_post(args...) printf(args); puts("\n") //post(args) +#endif #else static void debug_post(const char *format, ...){} #endif @@ -245,7 +248,7 @@ debug_post("--> destroy empty scope %p", scope); fts_object_release((fts_object_t *)scope); /* let down */ } - } + } // end while iter unresolved_scope_hash /* reset hastable of unresolved scopes */ fts_hashtable_clear(&unresolved_scope_hash); @@ -664,8 +667,6 @@ fts_iterator_t iter; fts_atom_t k, v; - debug_post("check_external_scopes"); - /* iterate over all unresolved scopes */ fts_hashtable_get_keys(&maxpat_check_external_hash, &iter); while(fts_iterator_has_more(&iter)) @@ -679,8 +680,12 @@ /* get scope with unresolved Max patcher */ ext = (ftmext_t *)fts_get_pointer(&k); + debug_post("check_external_scopes: try ext %p", ext); + if(!NOGOOD(ext)) { + debug_post("check_external_scopes: ext %p ok", ext); + ext_scope = ftmext_get_scope(ext); toplevel = maxpat_get_toplevel(ext->head.patcher); scope = toplevel_lookup_scope(toplevel); @@ -708,6 +713,10 @@ fts_hashtable_put(&maxpat_fixfile_hash, &k, &v); } } + else + { // ext is NOGOOD! + debug_post("check_external_scopes: ext %p NOGOOD!!!", ext); + } } /* reset hastable of unresolved scopes */ @@ -745,8 +754,23 @@ fts_set_pointer(&k, ext); fts_hashtable_put(&maxpat_check_external_hash, &k, fts_null); + debug_post("maxpat_register_new_external: %p", ext); } +void maxpat_unregister_external (ftmext_t *ext) +{ // when ftm external disappears, check if it was still in external scope hash, remove it + if (fts_hashtable_get_size(&maxpat_check_external_hash) > 0) + { + fts_atom_t k; + + fts_set_pointer(&k, ext); + fts_hashtable_remove(&maxpat_check_external_hash, &k); + debug_post("maxpat_unregister_external: %p", ext); + } +} + + + /******************************************************** * * FTM RTE API Modified: trunk/ftm/ftmlib/namedef.c =================================================================== --- trunk/ftm/ftmlib/namedef.c 2022-10-06 12:04:54 UTC (rev 3785) +++ trunk/ftm/ftmlib/namedef.c 2022-10-06 16:24:15 UTC (rev 3786) @@ -31,9 +31,14 @@ #endif /* debug scope console printouts */ -//#define debug_post(args...) post(args) #ifndef WIN32 -#define debug_post(args...) +# if !defined(DEBUG) || DEBUG == 0 || defined(NDEBUG) +# define debug_post(args...) {} /* empty */ +// force debug print, otherwise crash????? +//# define debug_post(args...) post(args) +# else +# define debug_post(args...) post(args) +# endif #else static void debug_post(const char* format, ...){} #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |