February 09, 2016 Problem with release build. | ||||
---|---|---|---|---|
| ||||
In the following sample program (which tries to set terminal to raw mode and check for key presses), compiling as usual (dmd t.d), the program works, but compiling in release mode (dmd -release t.d) and the raw mode doesn't seem to work. Where do I start looking to figure this out or if it is obvious, what am I doing wrong? (In the release mode output, notice the character getting echo-ed before the "Got"). MacBook-Pro:$ dmd --version DMD64 D Compiler v2.069.2 Copyright (c) 1999-2015 by Digital Mars written by Walter Bright MacBook-Pro:$ dmd t.d MacBook-Pro:$ ./t Got: a Got: b Got: c Got: d Got: q MacBook-Pro:$ dmd -release t.d MacBook-Pro:$ ./t aGot: a bGot: b cGot: c dGot: d eGot: e qGot: q MacBook-Pro:$ cat t.d import core.thread; import core.stdc.stdio; import core.sys.posix.fcntl; import core.sys.posix.termios; import std.stdio : writeln; int oldf; termios oldt; void makeraw() { termios newt; assert(tcgetattr(0, &oldt) == 0); newt = oldt; newt.c_lflag &= ~(ICANON | ECHO | ECHONL | ISIG | IEXTEN); newt.c_iflag &= ~(IGNBRK | BRKINT | ISTRIP | INLCR | ICRNL | IGNCR | IXON | IXOFF); newt.c_cc[VMIN] = 1; assert(tcsetattr(0, TCSANOW, &newt) == 0); oldf = fcntl(0, F_GETFL, 0); fcntl(0, F_SETFL, oldf | O_NONBLOCK); } void makecooked() { fcntl(0, F_SETFL, oldf); assert(tcsetattr(0, TCSANOW, &oldt) == 0); } void main(string[] args) { int ch; makeraw(); scope(exit) makecooked(); do { while ((ch = fgetc(stdin)) == EOF) { Thread.sleep(dur!("seconds")(1)); } writeln("Got: ", cast(dchar)ch); } while (ch != 'q'); } |
February 09, 2016 Re: Problem with release build. | ||||
---|---|---|---|---|
| ||||
Posted in reply to sanjayss | Ignore this -- this is probably due to how I am doing the assert(). In the release build, it is getting compiled out and in the process compiling out the tcgetattr and the tcsetattr.....
On Tuesday, 9 February 2016 at 05:08:20 UTC, sanjayss wrote:
> In the following sample program (which tries to set terminal to raw mode and check for key presses), compiling as usual (dmd t.d), the program works, but compiling in release mode (dmd -release t.d) and the raw mode doesn't seem to work. Where do I start looking to figure this out or if it is obvious, what am I doing wrong? (In the release mode output, notice the character getting echo-ed before the "Got").
>
> MacBook-Pro:$ dmd --version
> DMD64 D Compiler v2.069.2
> Copyright (c) 1999-2015 by Digital Mars written by Walter Bright
> MacBook-Pro:$ dmd t.d
> MacBook-Pro:$ ./t
> Got: a
> Got: b
> Got: c
> Got: d
> Got: q
> MacBook-Pro:$ dmd -release t.d
> MacBook-Pro:$ ./t
> aGot: a
> bGot: b
> cGot: c
> dGot: d
> eGot: e
> qGot: q
> MacBook-Pro:$ cat t.d
> import core.thread;
> import core.stdc.stdio;
> import core.sys.posix.fcntl;
> import core.sys.posix.termios;
> import std.stdio : writeln;
>
> int oldf;
> termios oldt;
>
> void
> makeraw()
> {
> termios newt;
>
> assert(tcgetattr(0, &oldt) == 0);
> newt = oldt;
>
> newt.c_lflag &= ~(ICANON | ECHO | ECHONL | ISIG | IEXTEN);
> newt.c_iflag &= ~(IGNBRK | BRKINT | ISTRIP | INLCR | ICRNL | IGNCR | IXON | IXOFF);
> newt.c_cc[VMIN] = 1;
> assert(tcsetattr(0, TCSANOW, &newt) == 0);
>
> oldf = fcntl(0, F_GETFL, 0);
> fcntl(0, F_SETFL, oldf | O_NONBLOCK);
> }
>
> void
> makecooked()
> {
> fcntl(0, F_SETFL, oldf);
> assert(tcsetattr(0, TCSANOW, &oldt) == 0);
> }
>
> void
> main(string[] args)
> {
> int ch;
>
> makeraw();
> scope(exit) makecooked();
>
> do
> {
> while ((ch = fgetc(stdin)) == EOF)
> {
> Thread.sleep(dur!("seconds")(1));
> }
> writeln("Got: ", cast(dchar)ch);
> } while (ch != 'q');
> }
|
Copyright © 1999-2021 by the D Language Foundation