1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-12-04 14:46:47 -05:00

Reapply 644908c1, "Garbage-collect SMJS objects before flushing caches."

Reapply commit 644908c130 of 2007-05-28,
"Garbage-collect SMJS objects before flushing caches." which was reverted
in commit 6cd6a843d1 on 2007-05-30.
It is now safe to apply because bug 956 has been fixed.
This commit is contained in:
Kalle Olavi Niemitalo 2007-07-02 22:34:11 +03:00 committed by Kalle Olavi Niemitalo
parent e1e81db035
commit 907ef0b7d3
3 changed files with 43 additions and 0 deletions

View File

@ -113,6 +113,26 @@ Description:
Open Lua console dialog. Open Lua console dialog.
-------------------------------------------------------------------------------
Name: flush-caches
Managed By: The scripting subsystem/backends
Triggered When:
Elinks is going to free its caches. This happens when the user chooses
ACT_MAIN_CACHE_MINIMIZE, but currently also on ACT_MAIN_FORGET_CREDENTIALS
and when ELinks is quitting.
Arguments:
None
Description:
If scripting backends hold pointers to cache entries, they should try
to release those pointers so that ELinks can free the entries. This
may involve a full garbage collection. Also, if backends have some
caches of their own, they should flush them.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Name: follow-url Name: follow-url
Managed By: The scripting subsystem/backends Managed By: The scripting subsystem/backends

View File

@ -315,6 +315,13 @@ terminate_all_subsystems(void)
void void
shrink_memory(int whole) shrink_memory(int whole)
{ {
#ifdef CONFIG_SCRIPTING
/* The SMJS pre-format-html hook constructs an SMJS object for
* each cache entry. Give all scripting modules a cue to garbage
* collect any such objects so that the entries can be freed. */
if (whole)
trigger_event_name("flush-caches");
#endif
shrink_dns_cache(whole); shrink_dns_cache(whole);
shrink_format_cache(whole); shrink_format_cache(whole);
garbage_collection(whole); garbage_collection(whole);

View File

@ -122,10 +122,26 @@ end:
return ret; return ret;
} }
static enum evhook_status
script_hook_flush_caches(va_list ap, void *data)
{
/* script_hook_pre_format_html() calls smjs_get_cache_entry_object()
* for each struct cache_entry. The resulting SMJS objects hold
* references to the structs, and these references prevent ELinks
* from freeing the cache entries. (The resource info dialog shows
* that the entries are "in use".) SMJS does not immediately collect
* these objects as garbage. If we're really trying to flush the
* caches then ask SMJS to run a check. */
if (smjs_ctx)
JS_GC(smjs_ctx);
return EVENT_HOOK_STATUS_NEXT;
}
struct event_hook_info smjs_scripting_hooks[] = { struct event_hook_info smjs_scripting_hooks[] = {
{ "goto-url", 0, script_hook_goto_url, NULL }, { "goto-url", 0, script_hook_goto_url, NULL },
{ "follow-url", 0, script_hook_follow_url, NULL }, { "follow-url", 0, script_hook_follow_url, NULL },
{ "pre-format-html", 0, script_hook_pre_format_html, NULL }, { "pre-format-html", 0, script_hook_pre_format_html, NULL },
{ "flush-caches", 0, script_hook_flush_caches, NULL },
NULL_EVENT_HOOK_INFO, NULL_EVENT_HOOK_INFO,
}; };