From: Ewald S. <es...@us...> - 2002-04-23 13:52:27
|
Update of /cvsroot/xine/xine-lib/src/xine-engine In directory usw-pr-cvs1:/tmp/cvs-serv27857/xine-lib/src/xine-engine Modified Files: load_plugins.c Log Message: Fix memory leaks by disposing unused plugins Index: load_plugins.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/xine-engine/load_plugins.c,v retrieving revision 1.73 retrieving revision 1.74 diff -u -r1.73 -r1.74 --- load_plugins.c 16 Apr 2002 22:22:48 -0000 1.73 +++ load_plugins.c 23 Apr 2002 13:52:22 -0000 1.74 @@ -452,6 +452,8 @@ int i; int spu_prio[DECODER_PLUGIN_MAX], video_prio[DECODER_PLUGIN_MAX], audio_prio[DECODER_PLUGIN_MAX]; + int *spu_used[DECODER_PLUGIN_MAX], *video_used[DECODER_PLUGIN_MAX], + *audio_used[DECODER_PLUGIN_MAX]; if(this == NULL || config == NULL) { @@ -467,18 +469,21 @@ for (i=0; i<DECODER_PLUGIN_MAX; i++) { this->spu_decoder_plugins[i] = NULL; spu_prio[i] = 0; + spu_used[i] = NULL; } this->cur_video_decoder_plugin = NULL; for (i=0; i<DECODER_PLUGIN_MAX; i++) { this->video_decoder_plugins[i] = NULL; video_prio[i] = 0; + video_used[i] = NULL; } this->cur_audio_decoder_plugin = NULL; for (i=0; i<DECODER_PLUGIN_MAX; i++) { this->audio_decoder_plugins[i] = NULL; audio_prio[i] = 0; + audio_used[i] = NULL; } /* @@ -536,18 +541,33 @@ sdp = (spu_decoder_t *) initplug(5, this); if (sdp) { + int *used = (int *)xine_xmalloc (sizeof (int)); + sdp->metronom = this->metronom; for (streamtype = 0; streamtype<DECODER_PLUGIN_MAX; streamtype++) if ((plugin_prio = decide_spu_insert(sdp, streamtype, spu_prio[streamtype]))) { + + if (spu_used[streamtype] && --(*spu_used[streamtype]) == 0) { + this->spu_decoder_plugins[streamtype]->dispose (this->spu_decoder_plugins[streamtype]); + free (spu_used[streamtype]); + } + this->spu_decoder_plugins[streamtype] = sdp; spu_prio[streamtype] = plugin_prio; + spu_used[streamtype] = used; + (*used)++; } xine_log (this, XINE_LOG_PLUGIN, _("spu decoder plugin found : %s\n"), sdp->get_identifier()); + + if (*used == 0) { + sdp->dispose (sdp); + free (used); + } } } } @@ -565,18 +585,33 @@ vdp = (video_decoder_t *) initplug(iface_version, this); if (vdp) { + int *used = (int *)xine_xmalloc (sizeof (int)); + vdp->metronom = this->metronom; for (streamtype = 0; streamtype<DECODER_PLUGIN_MAX; streamtype++) if ((plugin_prio = decide_video_insert(vdp, streamtype, video_prio[streamtype]))) { + + if (video_used[streamtype] && --(*video_used[streamtype]) == 0) { + this->video_decoder_plugins[streamtype]->dispose (this->video_decoder_plugins[streamtype]); + free (video_used[streamtype]); + } + this->video_decoder_plugins[streamtype] = vdp; video_prio[streamtype] = plugin_prio; + video_used[streamtype] = used; + (*used)++; } xine_log (this, XINE_LOG_PLUGIN, _("video decoder plugin found : %s\n"), vdp->get_identifier()); + + if (*used == 0) { + vdp->dispose (vdp); + free (used); + } } } @@ -591,17 +626,31 @@ adp = (audio_decoder_t *) initplug(iface_version, this); if (adp) { + int *used = (int *)xine_xmalloc (sizeof (int)); for (streamtype = 0; streamtype<DECODER_PLUGIN_MAX; streamtype++) if ((plugin_prio = decide_audio_insert(adp, streamtype, audio_prio[streamtype]))) { + + if (audio_used[streamtype] && --(*audio_used[streamtype]) == 0) { + this->audio_decoder_plugins[streamtype]->dispose (this->audio_decoder_plugins[streamtype]); + free (audio_used[streamtype]); + } + this->audio_decoder_plugins[streamtype] = adp; audio_prio[streamtype] = plugin_prio; + audio_used[streamtype] = used; + (*used)++; } xine_log (this, XINE_LOG_PLUGIN, _("audio decoder plugin found : %s\n"), adp->get_identifier()); + + if (*used == 0) { + adp->dispose (adp); + free (used); + } } } @@ -612,6 +661,17 @@ closedir(dir); } remove_segv_handler(); + + for (i=0; i<DECODER_PLUGIN_MAX; i++) { + if (spu_used[i] && --(*spu_used[i]) == 0) + free (spu_used[i]); + + if (video_used[i] && --(*video_used[i]) == 0) + free (video_used[i]); + + if (audio_used[i] && --(*audio_used[i]) == 0) + free (audio_used[i]); + } this->cur_spu_decoder_plugin = NULL; this->cur_video_decoder_plugin = NULL; |