syndicate-2017/port-allocator.rkt

39 lines
1.5 KiB
Racket
Raw Normal View History

2014-06-19 22:00:37 +00:00
#lang racket/base
;; UDP/TCP port allocator
(provide spawn-port-allocator
(struct-out port-allocation-request))
(require racket/set)
(require racket/match)
(require prospect-monolithic)
2014-06-19 22:00:37 +00:00
(require "ip.rkt")
(struct port-allocation-request (type k) #:prefab)
(struct port-allocator-state (used-ports local-ips) #:transparent)
(define (spawn-port-allocator allocator-type observer-gestalt compute-used-ports)
2016-01-28 02:46:09 +00:00
(spawn #:name (string->symbol (format "port-allocator:~a" allocator-type))
(lambda (e s)
2014-06-19 22:00:37 +00:00
(match e
2016-01-24 02:59:33 +00:00
[(scn g)
2014-06-19 22:00:37 +00:00
(define local-ips (or (gestalt->local-ip-addresses g) (set)))
2014-06-20 02:16:53 +00:00
(define new-used-ports (compute-used-ports g local-ips))
2014-06-19 22:00:37 +00:00
(log-info "port-allocator ~v used ports: ~v" allocator-type new-used-ports)
(transition (port-allocator-state new-used-ports local-ips) '())]
2016-01-24 02:59:33 +00:00
[(message (port-allocation-request _ k))
2014-06-19 22:00:37 +00:00
(define currently-used-ports (port-allocator-state-used-ports s))
(let randomly-allocate-until-unused ()
(define p (+ 1024 (random 64512)))
(if (set-member? currently-used-ports p)
(randomly-allocate-until-unused)
(transition (struct-copy port-allocator-state s
[used-ports (set-add currently-used-ports p)])
(k p (port-allocator-state-local-ips s)))))]
[_ #f]))
(port-allocator-state (set) (set))
2016-01-24 02:59:33 +00:00
(scn/union (subscription (port-allocation-request allocator-type ?))
observe-local-ip-addresses-gestalt
observer-gestalt)))