Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ LocalFindAndPop()

bool System.Threading.ThreadPoolWorkQueue.WorkStealingQueue.LocalFindAndPop ( object obj)
inline

Definition at line 167 of file ThreadPoolWorkQueue.cs.

168 {
169 if (m_array[(m_tailIndex - 1) & m_mask] == obj)
170 {
171 object obj2 = LocalPop();
172 return obj2 != null;
173 }
174 for (int num = m_tailIndex - 2; num >= m_headIndex; num--)
175 {
176 if (m_array[num & m_mask] == obj)
177 {
178 bool lockTaken = false;
179 try
180 {
181 m_foreignLock.Enter(ref lockTaken);
182 if (m_array[num & m_mask] == null)
183 {
184 return false;
185 }
186 Volatile.Write(ref m_array[num & m_mask], null);
187 if (num == m_tailIndex)
188 {
189 m_tailIndex--;
190 }
191 else if (num == m_headIndex)
192 {
193 m_headIndex++;
194 }
195 return true;
196 }
197 finally
198 {
199 if (lockTaken)
200 {
201 m_foreignLock.Exit(useMemoryBarrier: false);
202 }
203 }
204 }
205 }
206 return false;
207 }
void Enter(ref bool lockTaken)
Definition SpinLock.cs:94

References System.Threading.SpinLock.Enter(), System.Threading.SpinLock.Exit(), System.Threading.ThreadPoolWorkQueue.WorkStealingQueue.LocalPop(), System.Threading.ThreadPoolWorkQueue.WorkStealingQueue.m_array, System.Threading.ThreadPoolWorkQueue.WorkStealingQueue.m_foreignLock, System.Threading.ThreadPoolWorkQueue.WorkStealingQueue.m_headIndex, System.Threading.ThreadPoolWorkQueue.WorkStealingQueue.m_mask, System.Threading.ThreadPoolWorkQueue.WorkStealingQueue.m_tailIndex, System.obj, and System.Threading.Volatile.Write().