Skip to content

Instantly share code, notes, and snippets.

@fitomad
Created November 26, 2018 15:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fitomad/35ed0b44332491d7b05d06c713382ec5 to your computer and use it in GitHub Desktop.
Save fitomad/35ed0b44332491d7b05d06c713382ec5 to your computer and use it in GitHub Desktop.
public class Pool<Element>
{
/// Los elementos que gestionamos
public private(set) var elements: [Element]
/// La queue de tipo serial
private let queue: DispatchQueue
/// El semáforo de control de acceso
private let semaphore: DispatchSemaphore
/// Elementos disponibles en un momento dado
public var elementsAvailables: Int
{
var count = 0
self.queue.sync
{
count = self.elements.count
}
return count
}
/**
Nuevo Pool
*/
public init(elements: [Element])
{
self.elements = elements
self.queue = DispatchQueue(label: "com.desappstre.Pool./serial_queue")
self.semaphore = DispatchSemaphore(value: elements.count)
}
/**
Recupera un elemento
*/
public func getElement() -> Element?
{
// Esperamos a que haya un elemento disponible
// y decrementamos el contador del semáforo
self.semaphore.wait()
var the_element: Element?
self.queue.sync
{
the_element = self.elements.removeFirst()
}
return the_element
}
/**
*/
public func restore(_ element: Element) -> Void
{
self.queue.async
{
self.elements.append(element)
// Aumentamos el contador del semáforo
self.semaphore.signal()
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment