static private GetOverlappedData ( |
||
overlapped | ||
리턴 |
internal static OverlappedData GetOverlappedData(Overlapped overlapped)
{
OverlappedData overlappedData = null;
Interlocked.Exchange(ref m_overlappedDataCacheAccessed, 1);
while (true)
{
OverlappedDataCacheLine walk = m_overlappedDataCache;
while (null != walk)
{
for (short i = 0; i < OverlappedDataCacheLine.CacheSize; i ++)
{
if (walk.m_items[i] != null)
{
overlappedData = Interlocked.Exchange<OverlappedData>(ref walk.m_items[i], null);
if (overlappedData != null)
{
overlappedData.m_overlapped = overlapped;
return overlappedData;
}
}
}
walk = walk.m_next;
}
GrowOverlappedDataCache();
}
/*
Interlocked.Increment(ref m_Total);
Console.WriteLine("OverlappedDataCache get " + m_Total +
" create " + m_Create +
" Cache " + m_Cache);
*/
}
public Overlapped(int offsetLo, int offsetHi, IntPtr hEvent, IAsyncResult ar) { m_overlappedData = OverlappedDataCache.GetOverlappedData(this); m_overlappedData.m_nativeOverlapped.OffsetLow = offsetLo; m_overlappedData.m_nativeOverlapped.OffsetHigh = offsetHi; m_overlappedData.UserHandle = hEvent; m_overlappedData.m_asyncResult = ar; }