てきとうなメモ

本の感想とか技術メモとか

SQLiteのロック

ロックの種類とかは以下の説明を読めばよいのだけども、RESERVEDやPENDINGなど特殊なロックがあるので、実際にどう実装しているのか気になった

www.sqlite.org

ソースコード読むに以下のような感じ。(src/{os.h,os_win.c,os_unix.c})

  • Windowsの場合はLockFileEx()やLockFile()を使う
    • NT系はLockFileExだが、非NT系(Windows 95/98/ME)はLockFileExがないのでLockFileを使う
      • LockFileは共有ロックが存在せず、常に排他ロックであるため、SHAREDロックを取得するためには、後述する510バイトのうちランダムに1バイトをロックするようにする。
        • そのため、95/98/MEでは運が悪いとSHAREDロックしか取られていないのにSHAREDロックを取れないはず
        • NT系と非NT系からアクセスがある場合は、非NT系がSHAREDロックを取ると、NT系はロックをとろうとする510バイトのうち1バイトがロックされているのでSHAREDロックを取れないし、NT系がSHAREDロックを取った場合も、非NT系は510バイトすべてロックされているので、SHAREDロックを取れない
        • まあ、今どきWin95/98/MEはほとんど使われていないと思うけども
  • UNIX系OSの場合はfcntl(fd, F_SETLK, ...)を使う
  • ロックするバイト範囲は実際のデータを書き込まない位置(0x40000000のあたり)を使う
    • PENDINGは0x40000000から1バイト
    • RESERVEDは0x40000001から1バイト
    • SHAREDとEXCLUSIVEは0x40000002から510バイト