フォーラム: 開発者 (スレッド #3339)

大きさ0のメモリブロック (2003-09-10 01:58 by m-arai #5820)

Graham Whaleyさんから、メールにてご報告いただきまし
た件をPatchesに登録しました。
ご確認お願いします。

https://sourceforge.jp/tracker/index.php?func=detail&aid=2970&group_id=183&atid=780

RE: 大きさ0のメモリブロック (2003-09-10 21:29 by m-arai #5832)

これだけでは説明不足だったかもしれませんので、
Graham Whaleyさんからのご報告の要旨を書いて
おきます。

{
ER Error;
T_CDTQ State;

State.dtqatr = TA_TFIFO;
State.dtqcnt = 0;
State.dtq = NULL;
Error = cre_dtq(Id, &State);
}

のように、大きさ0のデータキューを確保した場合、
カーネルメモリから大きさ0の領域が確保される訳ですが、
メモリブロックの終端検出にブロックサイズ==0を条件と
して使っているため、それ以降のメモリ確保が、終端の
誤検出により正しく行われない場合があるという問題が
あります。

そこで、flagにMEMBLK_ENDを新設し、それをもってメモリ
ブロック終端検出をすれば、この問題は発生しません。


これはこれで解決案だとは思いますが、大きさ0のメモリ
ブロックの扱いについては一考の余地があるのではと
思います。実際には使われない管理ブロックを消費する
だけのものですから。

サイズが0のメモリ確保に対しては、NULLとはまた別の無効
アドレスを取り敢えず返すだけにするのも一案かと思いま
すが…。まだよく考えていません。
#5820 への返信

RE: 大きさ0のメモリブロック (2003-09-10 22:52 by hamayan #5833)

お世話になっています。

前に配列の0サイズについて話題になっていたので、その事かと思っていましたが、動的生成(静的生成もかな?)のメモリブロックの話だったんですね。

うーん、10人居れば、10通りの使い方が有ると言う感じですかね。
#5832 への返信

RE: 大きさ0のメモリブロック (2003-09-10 23:16 by m-arai #5834)

私も今回初めてdtqでdtqcnt=0が許されるのを知りました。
どう使うのか、思いつきません。

mpfではサイズ0というのはE_PARなんですけどね。
#5833 への返信

RE: 大きさ0のメモリブロック (2003-10-11 00:19 by m-arai #6124)

カーネルメモリからのメモリ確保を1度にまとめるように
する差分をTrackerに追加しました。
こうすれば、dtqcnt=0でもkernel_alc_mem(0)は発生
しません。
が、kernel_alc_mem(0)の対策は、やはり別に必要では
ありましょう。

結果としてメモリ確保/解放を1回減らせるという
メリットもあります。mpfについて挙げているのと同様の
ものです。

しかし、ソースがどうにも汚くなる…。
#5834 への返信