small adjustments to udp-set-receive-buffer-size!

Minor adjustments to a commenably complete addition.
This commit is contained in:
Matthew Flatt 2019-01-05 16:30:15 -07:00
parent 4cd34ce10d
commit 52358ec42e
4 changed files with 26 additions and 8 deletions

View File

@ -498,14 +498,13 @@ exception is raised, but not both.}
[size exact-positive-integer?]) [size exact-positive-integer?])
void]{ void]{
On Unix systems, set the receive buffer size (@tt{SO_RCVBUF}) for Set the receive buffer size (@tt{SO_RCVBUF}) for @racket[udp-socket].
@racket[udp-socket]. Using a larger buffer can minimize packet loss that can occur due to
slow polling of a connection, including during a major garbage
collection.
If @racket[size] is greater than the maximum allowed by the system, If @racket[size] is greater than the maximum allowed by the system,
the @exnraise[exn:fail]. the @exnraise[exn:fail:network].
Using a larger buffer can minimize packet loss that can occur during a
major garbage collection.
@history[#:added "7.1.0.11"]} @history[#:added "7.1.0.11"]}

View File

@ -57,12 +57,14 @@
(err/rt-test (udp-set-receive-buffer-size! udp1 -1)) (err/rt-test (udp-set-receive-buffer-size! udp1 -1))
(err/rt-test (udp-set-receive-buffer-size! udp1 0)) (err/rt-test (udp-set-receive-buffer-size! udp1 0))
(err/rt-test (udp-set-receive-buffer-size! udp1 (expt 2 300))
exn:fail:network?)
;; Something a user program might do to find the max allowed size ;; Something a user program might do to find the max allowed size
(test-values (test-values
'(ok) '(ok)
(λ () (λ ()
(let loop ([n 4096]) (let loop ([n 4096])
(with-handlers ([exn:fail? (with-handlers ([exn:fail:network?
(λ _ (λ _
(let ([n (/ n 2)]) (let ([n (/ n 2)])
(udp-set-receive-buffer-size! udp1 n) (udp-set-receive-buffer-size! udp1 n)

View File

@ -164,6 +164,9 @@
(check who exact-nonnegative-integer? size) (check who exact-nonnegative-integer? size)
(atomically (atomically
(check-udp-closed who u) (check-udp-closed who u)
(unless (fixnum? size)
(end-atomic)
(raise-non-fixnum who size))
(define r (rktio_udp_set_receive_buffer_size rktio (udp-s u) size)) (define r (rktio_udp_set_receive_buffer_size rktio (udp-s u) size))
(when (rktio-error? r) (when (rktio-error? r)
(raise-option-error who "set" r)))) (raise-option-error who "set" r))))
@ -171,3 +174,11 @@
(define (raise-option-error who mode v) (define (raise-option-error who mode v)
(end-atomic) (end-atomic)
(raise-network-error who v (string-append mode "sockopt failed"))) (raise-network-error who v (string-append mode "sockopt failed")))
(define (raise-non-fixnum who size)
(raise (exn:fail:network
(format (string-append "~a: given size is too large\n"
" given size: ~e")
who
size)
(current-continuation-marks))))

View File

@ -2704,7 +2704,13 @@ static Scheme_Object *udp_set_receive_buffer_size(int argc, Scheme_Object *argv[
scheme_wrong_contract("udp-set-receive-buffer-size!", "udp?", 0, argc, argv); scheme_wrong_contract("udp-set-receive-buffer-size!", "udp?", 0, argc, argv);
if (!SCHEME_INTP(argv[1]) || (SCHEME_INT_VAL(argv[1]) <= 0)) { if (!SCHEME_INTP(argv[1]) || (SCHEME_INT_VAL(argv[1]) <= 0)) {
scheme_wrong_contract("udp-set-receive-buffer-size!", "exact-positive-integer?", 1, argc, argv); if (SCHEME_BIGNUMP(argv[1]) && SCHEME_BIGPOS(argv[1]))
scheme_raise_exn(MZEXN_FAIL_NETWORK,
"udp-set-receive-buffer-size!: given size is too large\n"
" given size: %V",
argv[1]);
else
scheme_wrong_contract("udp-set-receive-buffer-size!", "exact-positive-integer?", 1, argc, argv);
return NULL; return NULL;
} }