@@ -56,6 +56,7 @@ typedef struct
56
56
typedef struct
57
57
{
58
58
char dummy ;
59
+ int backend_maxid ;
59
60
BIDLatch l_arr [FLEXIBLE_ARRAY_MEMBER ];
60
61
} GlobState ;
61
62
@@ -68,17 +69,31 @@ WLOwnLatch(void)
68
69
SpinLockAcquire (& state -> l_arr [MyBackendId ].slock );
69
70
OwnLatch (& state -> l_arr [MyBackendId ].latch );
70
71
is_latch_owned = true;
72
+
73
+ if (state -> backend_maxid < MyBackendId )
74
+ state -> backend_maxid = MyBackendId ;
75
+
71
76
state -> l_arr [MyBackendId ].pid = MyProcPid ;
72
77
SpinLockRelease (& state -> l_arr [MyBackendId ].slock );
73
78
}
74
79
75
80
static void
76
81
WLDisownLatch (void )
77
82
{
83
+ int i ;
78
84
SpinLockAcquire (& state -> l_arr [MyBackendId ].slock );
79
85
DisownLatch (& state -> l_arr [MyBackendId ].latch );
80
86
is_latch_owned = false;
81
87
state -> l_arr [MyBackendId ].pid = 0 ;
88
+
89
+ if (state -> backend_maxid == MyBackendId )
90
+ for (i = (MaxConnections + 1 ); i >=0 ; i -- )
91
+ if (state -> l_arr [i ].pid != 0 )
92
+ {
93
+ state -> backend_maxid = i ;
94
+ break ;
95
+ }
96
+
82
97
SpinLockRelease (& state -> l_arr [MyBackendId ].slock );
83
98
}
84
99
@@ -124,14 +139,15 @@ WaitLSNShmemInit(void)
124
139
SpinLockInit (& state -> l_arr [i ].slock );
125
140
InitSharedLatch (& state -> l_arr [i ].latch );
126
141
}
142
+ state -> backend_maxid = 0 ;
127
143
}
128
144
}
129
145
130
146
void
131
147
WaitLSNSetLatch (void )
132
148
{
133
- uint32 i ;
134
- for (i = 0 ; i < ( MaxConnections + 1 ) ; i ++ )
149
+ uint i ;
150
+ for (i = 0 ; i <= state -> backend_maxid ; i ++ )
135
151
{
136
152
SpinLockAcquire (& state -> l_arr [i ].slock );
137
153
if (state -> l_arr [i ].pid != 0 )
0 commit comments