84
84
#include "storage/ipc.h"
85
85
#include "storage/predicate.h"
86
86
#include "storage/proc.h"
87
+ #include "storage/proclist.h"
87
88
#include "storage/spin.h"
88
89
#include "utils/memutils.h"
89
90
@@ -717,7 +718,7 @@ LWLockInitialize(LWLock *lock, int tranche_id)
717
718
pg_atomic_init_u32 (& lock -> nwaiters , 0 );
718
719
#endif
719
720
lock -> tranche = tranche_id ;
720
- dlist_init (& lock -> waiters );
721
+ proclist_init (& lock -> waiters );
721
722
}
722
723
723
724
/*
@@ -920,25 +921,25 @@ LWLockWakeup(LWLock *lock)
920
921
{
921
922
bool new_release_ok ;
922
923
bool wokeup_somebody = false;
923
- dlist_head wakeup ;
924
- dlist_mutable_iter iter ;
924
+ proclist_head wakeup ;
925
+ proclist_mutable_iter iter ;
925
926
926
- dlist_init (& wakeup );
927
+ proclist_init (& wakeup );
927
928
928
929
new_release_ok = true;
929
930
930
931
/* lock wait list while collecting backends to wake up */
931
932
LWLockWaitListLock (lock );
932
933
933
- dlist_foreach_modify (iter , & lock -> waiters )
934
+ proclist_foreach_modify (iter , & lock -> waiters , lwWaitLink )
934
935
{
935
- PGPROC * waiter = dlist_container ( PGPROC , lwWaitLink , iter .cur );
936
+ PGPROC * waiter = GetPGProcByNumber ( iter .cur );
936
937
937
938
if (wokeup_somebody && waiter -> lwWaitMode == LW_EXCLUSIVE )
938
939
continue ;
939
940
940
- dlist_delete ( & waiter -> lwWaitLink );
941
- dlist_push_tail (& wakeup , & waiter -> lwWaitLink );
941
+ proclist_delete ( & lock -> waiters , iter . cur , lwWaitLink );
942
+ proclist_push_tail (& wakeup , iter . cur , lwWaitLink );
942
943
943
944
if (waiter -> lwWaitMode != LW_WAIT_UNTIL_FREE )
944
945
{
@@ -963,7 +964,7 @@ LWLockWakeup(LWLock *lock)
963
964
break ;
964
965
}
965
966
966
- Assert (dlist_is_empty (& wakeup ) || pg_atomic_read_u32 (& lock -> state ) & LW_FLAG_HAS_WAITERS );
967
+ Assert (proclist_is_empty (& wakeup ) || pg_atomic_read_u32 (& lock -> state ) & LW_FLAG_HAS_WAITERS );
967
968
968
969
/* unset required flags, and release lock, in one fell swoop */
969
970
{
@@ -982,7 +983,7 @@ LWLockWakeup(LWLock *lock)
982
983
else
983
984
desired_state &= ~LW_FLAG_RELEASE_OK ;
984
985
985
- if (dlist_is_empty (& wakeup ))
986
+ if (proclist_is_empty (& wakeup ))
986
987
desired_state &= ~LW_FLAG_HAS_WAITERS ;
987
988
988
989
desired_state &= ~LW_FLAG_LOCKED ; /* release lock */
@@ -994,12 +995,12 @@ LWLockWakeup(LWLock *lock)
994
995
}
995
996
996
997
/* Awaken any waiters I removed from the queue. */
997
- dlist_foreach_modify (iter , & wakeup )
998
+ proclist_foreach_modify (iter , & wakeup , lwWaitLink )
998
999
{
999
- PGPROC * waiter = dlist_container ( PGPROC , lwWaitLink , iter .cur );
1000
+ PGPROC * waiter = GetPGProcByNumber ( iter .cur );
1000
1001
1001
1002
LOG_LWDEBUG ("LWLockRelease" , lock , "release waiter" );
1002
- dlist_delete ( & waiter -> lwWaitLink );
1003
+ proclist_delete ( & wakeup , iter . cur , lwWaitLink );
1003
1004
1004
1005
/*
1005
1006
* Guarantee that lwWaiting being unset only becomes visible once the
@@ -1046,9 +1047,9 @@ LWLockQueueSelf(LWLock *lock, LWLockMode mode)
1046
1047
1047
1048
/* LW_WAIT_UNTIL_FREE waiters are always at the front of the queue */
1048
1049
if (mode == LW_WAIT_UNTIL_FREE )
1049
- dlist_push_head (& lock -> waiters , & MyProc -> lwWaitLink );
1050
+ proclist_push_head (& lock -> waiters , MyProc -> pgprocno , lwWaitLink );
1050
1051
else
1051
- dlist_push_tail (& lock -> waiters , & MyProc -> lwWaitLink );
1052
+ proclist_push_tail (& lock -> waiters , MyProc -> pgprocno , lwWaitLink );
1052
1053
1053
1054
/* Can release the mutex now */
1054
1055
LWLockWaitListUnlock (lock );
@@ -1070,7 +1071,7 @@ static void
1070
1071
LWLockDequeueSelf (LWLock * lock )
1071
1072
{
1072
1073
bool found = false;
1073
- dlist_mutable_iter iter ;
1074
+ proclist_mutable_iter iter ;
1074
1075
1075
1076
#ifdef LWLOCK_STATS
1076
1077
lwlock_stats * lwstats ;
@@ -1086,19 +1087,17 @@ LWLockDequeueSelf(LWLock *lock)
1086
1087
* Can't just remove ourselves from the list, but we need to iterate over
1087
1088
* all entries as somebody else could have unqueued us.
1088
1089
*/
1089
- dlist_foreach_modify (iter , & lock -> waiters )
1090
+ proclist_foreach_modify (iter , & lock -> waiters , lwWaitLink )
1090
1091
{
1091
- PGPROC * proc = dlist_container (PGPROC , lwWaitLink , iter .cur );
1092
-
1093
- if (proc == MyProc )
1092
+ if (iter .cur == MyProc -> pgprocno )
1094
1093
{
1095
1094
found = true;
1096
- dlist_delete ( & proc -> lwWaitLink );
1095
+ proclist_delete ( & lock -> waiters , iter . cur , lwWaitLink );
1097
1096
break ;
1098
1097
}
1099
1098
}
1100
1099
1101
- if (dlist_is_empty (& lock -> waiters ) &&
1100
+ if (proclist_is_empty (& lock -> waiters ) &&
1102
1101
(pg_atomic_read_u32 (& lock -> state ) & LW_FLAG_HAS_WAITERS ) != 0 )
1103
1102
{
1104
1103
pg_atomic_fetch_and_u32 (& lock -> state , ~LW_FLAG_HAS_WAITERS );
@@ -1719,12 +1718,12 @@ LWLockWaitForVar(LWLock *lock, uint64 *valptr, uint64 oldval, uint64 *newval)
1719
1718
void
1720
1719
LWLockUpdateVar (LWLock * lock , uint64 * valptr , uint64 val )
1721
1720
{
1722
- dlist_head wakeup ;
1723
- dlist_mutable_iter iter ;
1721
+ proclist_head wakeup ;
1722
+ proclist_mutable_iter iter ;
1724
1723
1725
1724
PRINT_LWDEBUG ("LWLockUpdateVar" , lock , LW_EXCLUSIVE );
1726
1725
1727
- dlist_init (& wakeup );
1726
+ proclist_init (& wakeup );
1728
1727
1729
1728
LWLockWaitListLock (lock );
1730
1729
@@ -1737,15 +1736,15 @@ LWLockUpdateVar(LWLock *lock, uint64 *valptr, uint64 val)
1737
1736
* See if there are any LW_WAIT_UNTIL_FREE waiters that need to be woken
1738
1737
* up. They are always in the front of the queue.
1739
1738
*/
1740
- dlist_foreach_modify (iter , & lock -> waiters )
1739
+ proclist_foreach_modify (iter , & lock -> waiters , lwWaitLink )
1741
1740
{
1742
- PGPROC * waiter = dlist_container ( PGPROC , lwWaitLink , iter .cur );
1741
+ PGPROC * waiter = GetPGProcByNumber ( iter .cur );
1743
1742
1744
1743
if (waiter -> lwWaitMode != LW_WAIT_UNTIL_FREE )
1745
1744
break ;
1746
1745
1747
- dlist_delete ( & waiter -> lwWaitLink );
1748
- dlist_push_tail (& wakeup , & waiter -> lwWaitLink );
1746
+ proclist_delete ( & lock -> waiters , iter . cur , lwWaitLink );
1747
+ proclist_push_tail (& wakeup , iter . cur , lwWaitLink );
1749
1748
}
1750
1749
1751
1750
/* We are done updating shared state of the lock itself. */
@@ -1754,11 +1753,11 @@ LWLockUpdateVar(LWLock *lock, uint64 *valptr, uint64 val)
1754
1753
/*
1755
1754
* Awaken any waiters I removed from the queue.
1756
1755
*/
1757
- dlist_foreach_modify (iter , & wakeup )
1756
+ proclist_foreach_modify (iter , & wakeup , lwWaitLink )
1758
1757
{
1759
- PGPROC * waiter = dlist_container ( PGPROC , lwWaitLink , iter .cur );
1758
+ PGPROC * waiter = GetPGProcByNumber ( iter .cur );
1760
1759
1761
- dlist_delete ( & waiter -> lwWaitLink );
1760
+ proclist_delete ( & wakeup , iter . cur , lwWaitLink );
1762
1761
/* check comment in LWLockWakeup() about this barrier */
1763
1762
pg_write_barrier ();
1764
1763
waiter -> lwWaiting = false;
0 commit comments