LWLockRelease

LightWeightLockを開放する。
まず、held_lwlocksを検索し,lockされていることを確認する。
spinlockを取得する。
exclusiveロックのときは,lock->exclusiveをデクリメント。それ以外は,lock->sharedをデクリメント。

次にlock待ちのプロセスを起こす。
lock->headに,ロック待ちの先頭プロセスが入っている。
lock->exclusive == 0 かつ lock->shared == 0 かつ lock->releaseOKのとき,プロセスを起こす。そうではないとき,lockが開放されてないと判断して,プロセスを起こさない。
ロック待ちの先頭プロセスが,exclusiveロックを要求していないとき,proc->lwWaitLinkをたどっていき,exclusiveロックを要求してない最後のプロセスを見つける。(共有ロックを待っているプロセスをまとめて起こす)
lock->headを作り直す。
(次に起こされる予定のプロセスが入る。次のうちどれかになる
(1)先頭がexclusive lockのとき,次のプロセス
(2)先頭がexclusive lockでないとき,次のexclusive lockを要求するプロセス)
lock->releaseOKをfalseにする。
(ロック待ちプロセスが起きる前に,別プロセスのLWLockReleaseが,後のロック待ちプロセスを起こさないようにする。 そうしないと,ロックの優先順位が入れ替わる可能性がある?)
spinlockを開放する。
headからprocまでループして,ロック待ちプロセスのセマフォを開放することによって,プロセスを起こす。
RESUME_INTERRUPTS()で,cancel/dieを受け付けるようにする。