ロックの種類とかは以下の説明を読めばよいのだけども、RESERVEDやPENDINGなど特殊なロックがあるので、実際にどう実装しているのか気になった
ソースコード読むに以下のような感じ。(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はほとんど使われていないと思うけども
- LockFileは共有ロックが存在せず、常に排他ロックであるため、SHAREDロックを取得するためには、後述する510バイトのうちランダムに1バイトをロックするようにする。
- NT系はLockFileExだが、非NT系(Windows 95/98/ME)はLockFileExがないのでLockFileを使う
- UNIX系OSの場合はfcntl(fd, F_SETLK, ...)を使う
- ロックするバイト範囲は実際のデータを書き込まない位置(0x40000000のあたり)を使う
- PENDINGは0x40000000から1バイト
- RESERVEDは0x40000001から1バイト
- SHAREDとEXCLUSIVEは0x40000002から510バイト