なんでも作っちゃう、かも。

Arduino/Make/フィジカルコンピューティング/電子工作あたりで活動しています。スタバの空きカップを使ったスタバカップアンプなど製作。最近はもっぱらArduinoと3Dプリンタの自作に興味があります。

V850付録基板でOgg Vorbisプレイヤー(2)

Posted by arms22 on 2007年05月13日 0  0

前回、TremorをMacOSX上でコンパイル+実行しメモリの使用量を調べるところまでやりました。結果は100KBを超えるメモリを使用し、さらにメモリリークまで起こしていました。

メモリリークしているライブラリは使えませんので、さっそくリークしている箇所を探してみました。Tremorのコードは大きくないのでリークしている箇所を特定するのは難しくはありませんでした。
ogg_stream_destroyと_ogg_buffer_destroyでの解放もれがありました。
これらはOggファイルをクローズする時に実行される処理なので、ファイルを開いて閉じてを繰り返して行くとどんどんリークしてゆきます。
ogg_stream_destroyと_ogg_buffer_destroyを修正して再度メモリの使用量を計測してみました。あいかわらず100KBを超えていましたけど、、メモリリークはなくなったみたいです。
修正後のソースの差分は「続きを読む」。

Index: framing.c
===================================================================
--- framing.c   (revision 12931)
+++ framing.c   (working copy)
@@ -53,11 +53,6 @@
     bt=bs->unused_buffers;
     rt=bs->unused_references;
 
-    if(!bs->outstanding){
-      _ogg_free(bs);
-      return;
-    }
-
     while(bt){
       ogg_buffer *b=bt;
       bt=b->ptr.next;
@@ -71,6 +66,10 @@
       _ogg_free(r);
     }
     bs->unused_references=0;
+
+    if(!bs->outstanding){
+      _ogg_free(bs);
+    }
   }
 }
 
@@ -569,7 +568,6 @@
 
 ogg_sync_state *ogg_sync_create(void){
   ogg_sync_state *oy=_ogg_calloc(1,sizeof(*oy));
-  memset(oy,0,sizeof(*oy));
   oy->bufferpool=ogg_buffer_create();
   return oy;
 }
@@ -578,7 +576,6 @@
   if(oy){
     ogg_sync_reset(oy);
     ogg_buffer_destroy(oy->bufferpool);
-    memset(oy,0,sizeof(*oy));
     _ogg_free(oy);
   }
   return OGG_SUCCESS;
@@ -833,7 +830,7 @@
   if(os){
     ogg_buffer_release(os->header_tail);
     ogg_buffer_release(os->body_tail);
-    memset(os,0,sizeof(*os));    
+    _ogg_free(os);
   }
   return OGG_SUCCESS;
 } 

Ads by Google

Leave a reply






管理者にだけ表示を許可する

該当の記事は見つかりませんでした。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。