diff --git a/pkgs/racket-test-core/tests/racket/foreign-test.c b/pkgs/racket-test-core/tests/racket/foreign-test.c index 03e4024877..5687057886 100644 --- a/pkgs/racket-test-core/tests/racket/foreign-test.c +++ b/pkgs/racket-test-core/tests/racket/foreign-test.c @@ -1,4 +1,5 @@ #include +#include #ifdef USE_THREAD_TEST #include #endif @@ -256,3 +257,13 @@ X void* foreign_thread_callback(test_callback_t f, return r; } #endif + +X int check_multiple_of_ten(int v) { + int r = v % 10; + if (r == 0) { + return 0; + } else { + errno = r; + return -1; + } +} diff --git a/pkgs/racket-test-core/tests/racket/foreign-test.rktl b/pkgs/racket-test-core/tests/racket/foreign-test.rktl index 1a43c52f12..faa234363f 100644 --- a/pkgs/racket-test-core/tests/racket/foreign-test.rktl +++ b/pkgs/racket-test-core/tests/racket/foreign-test.rktl @@ -552,6 +552,21 @@ (define a-bar (bar (malloc 16 'raw))) (free a-bar)) +(let () + ;; saved-errno tests + (define check-multiple-of-ten + (get-ffi-obj 'check_multiple_of_ten test-lib (_fun #:save-errno 'posix _int -> _int))) + (test 0 check-multiple-of-ten 40) + (test -1 check-multiple-of-ten 42) + (test 2 saved-errno) + (saved-errno 5) + (test 5 saved-errno) + ;; test saved-errno is thread-local + (define errno-from-thread #f) + (sync (thread (lambda () (check-multiple-of-ten 17) (set! errno-from-thread (saved-errno))))) + (test 5 saved-errno) ;; same as before + (test 7 (lambda () errno-from-thread))) + (delete-test-files) (let ()