@ -1068,7 +1068,7 @@ ZeroAndLockBuffer(Buffer buffer, ReadBufferMode mode, bool already_valid)
* already valid . )
*/
if ( ! isLocalBuf )
LWL ockAcquire ( BufferDescriptorGetContentLock ( bufHdr ) , LW _EXCLUSIVE ) ;
LockBuffer ( buffer , BUFFER_LOCK _EXCLUSIVE ) ;
/* Set BM_VALID, terminate IO, and wake up any waiters */
if ( isLocalBuf )
@ -2825,7 +2825,7 @@ ExtendBufferedRelShared(BufferManagerRelation bmr,
}
if ( lock )
LWL ockAcquire ( BufferDescriptorGetContentLock ( buf_hdr ) , LW _EXCLUSIVE ) ;
LockBuffer ( buf , BUFFER_LOCK _EXCLUSIVE) ;
TerminateBufferIO ( buf_hdr , false , BM_VALID , true , false ) ;
}
@ -2838,14 +2838,40 @@ ExtendBufferedRelShared(BufferManagerRelation bmr,
}
/*
* BufferIsExclusiveLocked
* BufferIsLockedByMe
*
* Checks if this backend has the buffer locked in any mode .
*
* Buffer must be pinned .
*/
bool
BufferIsLockedByMe ( Buffer buffer )
{
BufferDesc * bufHdr ;
Assert ( BufferIsPinned ( buffer ) ) ;
if ( BufferIsLocal ( buffer ) )
{
/* Content locks are not maintained for local buffers. */
return true ;
}
else
{
bufHdr = GetBufferDescriptor ( buffer - 1 ) ;
return LWLockHeldByMe ( BufferDescriptorGetContentLock ( bufHdr ) ) ;
}
}
/*
* BufferIsLockedByMeInMode
*
* Checks if buffer is exclusive - locked .
* Checks if this backend has the buffer locked in the specified mode .
*
* Buffer must be pinned .
*/
bool
BufferIsExclusiveLocked ( Buffer buffer )
BufferIsLockedByMeInMode ( Buffer buffer , int mode )
{
BufferDesc * bufHdr ;
@ -2858,9 +2884,23 @@ BufferIsExclusiveLocked(Buffer buffer)
}
else
{
LWLockMode lw_mode ;
switch ( mode )
{
case BUFFER_LOCK_EXCLUSIVE :
lw_mode = LW_EXCLUSIVE ;
break ;
case BUFFER_LOCK_SHARE :
lw_mode = LW_SHARED ;
break ;
default :
pg_unreachable ( ) ;
}
bufHdr = GetBufferDescriptor ( buffer - 1 ) ;
return LWLockHeldByMeInMode ( BufferDescriptorGetContentLock ( bufHdr ) ,
LW_EXCLUSIVE ) ;
lw_mode ) ;
}
}
@ -2889,8 +2929,7 @@ BufferIsDirty(Buffer buffer)
else
{
bufHdr = GetBufferDescriptor ( buffer - 1 ) ;
Assert ( LWLockHeldByMeInMode ( BufferDescriptorGetContentLock ( bufHdr ) ,
LW_EXCLUSIVE ) ) ;
Assert ( BufferIsLockedByMeInMode ( buffer , BUFFER_LOCK_EXCLUSIVE ) ) ;
}
return pg_atomic_read_u32 ( & bufHdr - > state ) & BM_DIRTY ;
@ -2924,8 +2963,7 @@ MarkBufferDirty(Buffer buffer)
bufHdr = GetBufferDescriptor ( buffer - 1 ) ;
Assert ( BufferIsPinned ( buffer ) ) ;
Assert ( LWLockHeldByMeInMode ( BufferDescriptorGetContentLock ( bufHdr ) ,
LW_EXCLUSIVE ) ) ;
Assert ( BufferIsLockedByMeInMode ( buffer , BUFFER_LOCK_EXCLUSIVE ) ) ;
old_buf_state = pg_atomic_read_u32 ( & bufHdr - > state ) ;
for ( ; ; )
@ -3259,7 +3297,10 @@ UnpinBufferNoOwner(BufferDesc *buf)
*/
VALGRIND_MAKE_MEM_NOACCESS ( BufHdrGetBlock ( buf ) , BLCKSZ ) ;
/* I'd better not still hold the buffer content lock */
/*
* I ' d better not still hold the buffer content lock . Can ' t use
* BufferIsLockedByMe ( ) , as that asserts the buffer is pinned .
*/
Assert ( ! LWLockHeldByMe ( BufferDescriptorGetContentLock ( buf ) ) ) ;
/*
@ -5324,7 +5365,7 @@ FlushOneBuffer(Buffer buffer)
bufHdr = GetBufferDescriptor ( buffer - 1 ) ;
Assert ( LWLockHeldByMe ( BufferDescriptorGetContentLock ( bufHdr ) ) ) ;
Assert ( BufferIsLockedByMe ( buffer ) ) ;
FlushBuffer ( bufHdr , NULL , IOOBJECT_RELATION , IOCONTEXT_NORMAL ) ;
}
@ -5415,7 +5456,7 @@ MarkBufferDirtyHint(Buffer buffer, bool buffer_std)
Assert ( GetPrivateRefCount ( buffer ) > 0 ) ;
/* here, either share or exclusive lock is OK */
Assert ( LWLockHeldByMe ( BufferDescriptorGetContentLock ( bufHdr ) ) ) ;
Assert ( BufferIsLockedByMe ( buffer ) ) ;
/*
* This routine might get called many times on the same page , if we are
@ -5898,8 +5939,7 @@ IsBufferCleanupOK(Buffer buffer)
bufHdr = GetBufferDescriptor ( buffer - 1 ) ;
/* caller must hold exclusive lock on buffer */
Assert ( LWLockHeldByMeInMode ( BufferDescriptorGetContentLock ( bufHdr ) ,
LW_EXCLUSIVE ) ) ;
Assert ( BufferIsLockedByMeInMode ( buffer , BUFFER_LOCK_EXCLUSIVE ) ) ;
buf_state = LockBufHdr ( bufHdr ) ;