IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

tie がわからない

HTTP::Session::Store::DBM の insert で

以下のように、

sub insert {
    my ( $self, $key, $value ) = @_; 

    defined(tied %{ $self->{dbm} }); # => false になる場合がある

    $self->dbm->{$key} = Storable::freeze $value;
}

$self->{dbm} に tie されたオブジェクトが undef になってる時がある。

ちょっと調べた

どうやら HTTP::Session::DESTROY → HTTP::Session::finalize → HTTP::Session::Store::DBM::insert という風に呼ばれた時にごくまれに起こるみたい。
ってくらいしか今の僕にはわからない。
再現する条件もいまいち分かってない><

うーん

HTTP::Session::DESTROY って、 HTTP::Session がガーベジコレクションされるときに呼ばれるのだと思ってるけど、その時点で HTTP::Session::Store::DBM に tie された SDBM_Files オブジェクトが既に解放されているってことありえるのかなー。