From 52b4e8f661c9db57677d4236a1f39c3cc028147b Mon Sep 17 00:00:00 2001 From: "A. S. Budden" Date: Sun, 12 Jun 2016 07:40:28 +0100 Subject: [PATCH 1/4] Added setStdIoUnbuffered for unbuffered stdio (fixes #2146). --- lib/system.nim | 3 +++ lib/system/sysio.nim | 5 +++++ web/news/version_0_15_released.rst | 1 + 3 files changed, 9 insertions(+) diff --git a/lib/system.nim b/lib/system.nim index d58d00ae9f..504d215eaa 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -2708,6 +2708,9 @@ when not defined(JS): #and not defined(nimscript): ## ## Default mode is readonly. Returns true iff the file could be reopened. + proc setStdIoUnbuffered() {.tags: [], benign.} + ## Configures `stdin`, `stdout` and `stderr` to be unbuffered. + proc close*(f: File) {.importc: "fclose", header: "", tags: [].} ## Closes the file. diff --git a/lib/system/sysio.nim b/lib/system/sysio.nim index 2fcfd69d8e..bf3be955dc 100644 --- a/lib/system/sysio.nim +++ b/lib/system/sysio.nim @@ -354,4 +354,9 @@ proc writeFile(filename, content: string) = else: sysFatal(IOError, "cannot open: ", filename) +proc setStdIoUnbuffered() = + discard setvbuf(stdout, nil, IONBF, 0) + discard setvbuf(stderr, nil, IONBF, 0) + discard setvbuf(stdin, nil, IONBF, 0) + {.pop.} diff --git a/web/news/version_0_15_released.rst b/web/news/version_0_15_released.rst index 4cc5fb2a72..9ca8c3ec57 100644 --- a/web/news/version_0_15_released.rst +++ b/web/news/version_0_15_released.rst @@ -14,6 +14,7 @@ Changes affecting backwards compatibility Library Additions ----------------- +- Added ``setStdIoUnbuffered`` proc to ``system.nim`` to enable unbuffered I/O. Compiler Additions ------------------ From 5327cd0a84df0ad6c29bf534003ba7c97e9bcb73 Mon Sep 17 00:00:00 2001 From: "A. S. Budden" Date: Mon, 13 Jun 2016 16:37:50 +0100 Subject: [PATCH 2/4] Corrected setStdIoUnbuffered for systems without stdout, stderr or stdin declared. --- lib/system/sysio.nim | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/system/sysio.nim b/lib/system/sysio.nim index bf3be955dc..d94220d1ba 100644 --- a/lib/system/sysio.nim +++ b/lib/system/sysio.nim @@ -355,8 +355,11 @@ proc writeFile(filename, content: string) = sysFatal(IOError, "cannot open: ", filename) proc setStdIoUnbuffered() = - discard setvbuf(stdout, nil, IONBF, 0) - discard setvbuf(stderr, nil, IONBF, 0) - discard setvbuf(stdin, nil, IONBF, 0) + when declared(stdout): + discard setvbuf(stdout, nil, IONBF, 0) + when declared(stderr): + discard setvbuf(stderr, nil, IONBF, 0) + when declared(stdin): + discard setvbuf(stdin, nil, IONBF, 0) {.pop.} From 8e28a6140bac00b40ff1e0ea2c8c42adb707ad0d Mon Sep 17 00:00:00 2001 From: "A. S. Budden" Date: Mon, 13 Jun 2016 16:57:52 +0100 Subject: [PATCH 3/4] Correction as I hadn't realised setvbuf had been renamed. --- lib/system/sysio.nim | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/system/sysio.nim b/lib/system/sysio.nim index 552213a2d2..6622a4f648 100644 --- a/lib/system/sysio.nim +++ b/lib/system/sysio.nim @@ -371,10 +371,10 @@ proc writeFile(filename, content: string) = proc setStdIoUnbuffered() = when declared(stdout): - discard setvbuf(stdout, nil, IONBF, 0) + discard c_setvbuf(stdout, nil, IONBF, 0) when declared(stderr): - discard setvbuf(stderr, nil, IONBF, 0) + discard c_setvbuf(stderr, nil, IONBF, 0) when declared(stdin): - discard setvbuf(stdin, nil, IONBF, 0) + discard c_setvbuf(stdin, nil, IONBF, 0) {.pop.} From 72bd22a380b5bc95c42ee37c9d0676ec96da5bc5 Mon Sep 17 00:00:00 2001 From: "A. S. Budden" Date: Mon, 13 Jun 2016 19:08:13 +0100 Subject: [PATCH 4/4] Added missing export marker. --- lib/system.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/system.nim b/lib/system.nim index a1668cc78c..5a84f4a522 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -2715,7 +2715,7 @@ when not defined(JS): #and not defined(nimscript): ## ## Default mode is readonly. Returns true iff the file could be reopened. - proc setStdIoUnbuffered() {.tags: [], benign.} + proc setStdIoUnbuffered*() {.tags: [], benign.} ## Configures `stdin`, `stdout` and `stderr` to be unbuffered. proc close*(f: File) {.tags: [].}