
Folks:
  As I study the source of LockBuffer in bufmgr.c I came across
the following code snippet for the case of releasing a
shared (read) lock:


        if (mode == BUFFER_LOCK_UNLOCK)
        {
                if (*buflock & BL_R_LOCK)
                {
                        Assert(buf->r_locks > 0);
                        Assert(!(buf->w_lock));
                        Assert(!(*buflock & (BL_W_LOCK | BL_RI_LOCK)));
                        (buf->r_locks)--;
                         *buflock &= ~BL_R_LOCK;

This code resets BL_R_LOCK on the first release of a shared lock.
I think it should check that the count of readers be zero:
( something like

        if (mode == BUFFER_LOCK_UNLOCK)
        {
                if (*buflock & BL_R_LOCK)
                {
                        Assert(buf->r_locks > 0);
                        Assert(!(buf->w_lock));
                        Assert(!(*buflock & (BL_W_LOCK | BL_RI_LOCK)));
                        (buf->r_locks)--;
                        if (!buf->r_locks)
                                *buflock &= ~BL_R_LOCK;


Or I am missing something...

       thanks
            regards
                   Mauricio
_________________________________________________________________
Get your FREE download of MSN Explorer at http://explorer.msn.com


Tue, 22 May 2001 15:40:16 -0500
"Mauricio Breternitz" <mbjsql@hotmail.com>
? potential bug in LockBuffer ?