// SNMP application factory class.
// Copyright (C) 2009-2010 Lex Li
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
// software and associated documentation files (the "Software"), to deal in the Software
// without restriction, including without limitation the rights to use, copy, modify, merge,
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
// to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or
// substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System.Collections.Generic;
using System.Net.Sockets;
namespace GSF.Net.Snmp.Messaging
{
///
/// SNMP application factory, who holds all pipeline instances.
///
public sealed class SocketAsyncEventArgsFactory
{
internal const string DisposedMessage = "disposed";
private readonly object _root = new object();
private readonly Queue _queue = new Queue();
///
/// Finds an available event args.
///
///
public SocketAsyncEventArgs Create()
{
lock (_root)
{
SocketAsyncEventArgs result = null;
while (_queue.Count > 0)
{
SocketAsyncEventArgs item = _queue.Dequeue();
if (item?.UserToken?.ToString() == DisposedMessage)
{
item.Dispose();
continue;
}
result = item;
break;
}
return result ?? new SocketAsyncEventArgs();
}
}
///
/// Reuses the specified event args.
///
/// The resource.
internal void Reuse(SocketAsyncEventArgs args)
{
lock (_root)
{
_queue.Enqueue(args);
}
}
}
}