バグ: 使用中の宿を多重にオープンできてしまう

Issue #379 resolved
Liar_cw NA created an issue

「起動時の動作: 最後に選択した拠点を開く」設定でCWPyを多重起動するとエラーメッセージ通知後にタイトル画面が表示されますが、 使用中の宿データがロックされておらず、最大ふたつまで同じ宿をロードできてしまいます。

  • 三つ目からは該当する宿がロックされ、それ以上同じ宿を開くことは出来なくなる。
  • 三つ目から二つ目を閉じてもロックされない。常にふたつまで同じ宿でプレイできてしまう。
  • 拠点・シナリオプレイ中を問わない。
  • 検証で使用した宿データはひとつのみ。それ以外の宿は存在しない。

「タイトル画面を開く」設定にしている場合は正常にロックされましたが、 そのまま「最後に選択した拠点を開く」に変更すると多重ロードできてしまいました。 設定を戻すと再び正常にロックされるようになりました。 外から見た感じだと、どうやら「最後に選択した拠点を開く」設定の場合は 同宿データの最大使用許可数が2になってしまっているようです。

cardwirthpy_20160505b
CardWirthPy 1.0 Beta 1
Build: 2016-05-05 20:48:23

Comments (5)

  1. k4nagatsuki repo owner

    ありがとうございます。

    宿の二重オープン防止の仕組みはMutexを使ったもので、これには許可数などという概念はありません。使用権を取得できるかできないかです。ですからこの場合、なぜか1つ目の起動が使用権を取得せずに宿を開いてしまったか、取得した使用権を解放してしまったかのどちらかになります。

    この現象が私のところではまったく再現できません。しかし続けざまに起動するとなぜか二重に同じ宿を開けてしまう場合があるので、ロック機構に何らかの問題があることは間違いないようです。しかし今のところ見当も付きません。この現象は確実に再現できるのでしょうか。

  2. k4nagatsuki repo owner

    pull request #1459

    たぶん直りました。以下、かなり専門的ですが現象の説明です。

    二重オープンが発生したところでMutexの状態をProcess Explorerで見たところ、二つ目の方が開いているMutexの名前の後ろの方にゴミのような文字列がくっついているのを確認しました。おそらくCreateMutex()に渡す文字列が0終端になっていなかったので、メモリ上のゴミが入ってしまったのでしょう。これではロックに使う名前が正しく認識されず、正常にロックできない・正常にロックされているのを無視してしまう、という事が起こってしまいます。

    私の環境で再現しなかったのは、おそらくメモリ上に文字列が配置される時に、たまたま0で埋まっている領域に配置されるような傾向にあったためだと思われます。Windowsは、特定のアプリケーションが使用するメモリ空間は、だいたい同じようなところになるように割り当てるはずです。@Liar_cwさんの環境では0で埋まっていない確率が高い空間がよく割り当てられ、そのため問題の再現率も高くなっていたという可能性もあります。

    @Liar_cwさんがぶつかった問題の正体がこれだとすれば、上記pull request(Mutex名を確実に0終端にする)で解決したはずです。

  3. Liar_cw NA reporter

    「起動時の動作: 最後に選択した拠点を開く」「タイトル画面を開く」 どちらの設定でも正常にロックされていることを確認しました。

    すみません、最初の通知メールが届いておらず反応が遅れてしまいました。 念のために再度 05b版でも確認を行ってみましたが、

    1. 05b版から06版へ上書き更新。06版で発生しないことを確認。
    2. 06版の動作確認後に05bに上書き。発生しない。
    3. 05bを立ち上げ直すと問題が再発した。

    こんな感じでした。05b版と06版を逆にした場合では発生することはありませんでした。 私の技量では確信のある発言はできませんが、 @k4nagatsuki さんの仰るとおり問題の正体はMutexだったのかもしれません。

    cardwirthpy_20160506
    CardWirthPy 1.0 Beta 1
    Build: 2016-05-06 21:38:28
    
  4. k4nagatsuki repo owner

    ここ数日で通知が3本も抜けてる!!

    どうもBitbucket.orgのプラットフォームに何か問題が起きてるみたいですね。データを吹っ飛ばされなければまあ……。

    というわけでこっちも反応が遅れてしまいました。申し訳ないです。修正の確認が取れたという事で、このIssueは完了とさせていただきます。

  5. Log in to comment