www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Problem with release build.

reply sanjayss <dummy dummy.dummy> writes:
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');
}
Feb 08 2016
parent sanjayss <dummy dummy.dummy> writes:
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');
 }
Feb 08 2016