2018-03-09 16:02 GMT+01:00 Alistair Grant <akgrant0...@gmail.com>: > Hi Pavel, > > I tried to get this working on Ubuntu 16.04 and found the following: > > - The compilation failed unless I added the '-fPIC' flag (as suggested by > gcc).
is it on 64-bit system and VM? > - The example code in the TerminalEmulator class comment references > ProcessEndpoint, but the class doesn't exist. Thanks, this class was renamed Cheers, -- Pavel > > Pharo 7.0 > Build information: > Pharo-7.0+alpha.build.674.sha.57447e756fa6fcf1877f9d0d1cda235b3b63c807 > (64 Bit) > > > Cheers, > Alistair > > > > > > > On 5 March 2018 at 10:29, Pavel Krivanek <pavel.kriva...@gmail.com> wrote: >> Hi, >> >> Guille is working on the Iceberg improvements and he wanted to be able to >> open a terminal window on top of the repository and interact with it via the >> command line. So we looked at this issue because I already in December made >> some experiments with the terminal emulation in Pharo. >> >> In past, the Squeak had a working terminal emulation that used >> PseudoTTYPlugin. The VM is not built with this code for a long time but I >> tried to replace it with a small C library and then wrote an FFI interface >> to it. Together with that, I ported most of the old code Squeak code to >> Pharo. >> >> With Guille we tried to avoid usage of such external library and wrote an >> FFI interface to all the required LibC functions. We were successful but we >> realized that there are several issues that are limiting us. >> >> When you want to execute a separate process for the program that you want to >> open in terminal (typically the Bash), you need to redirect the standard IO >> files, create a fork of your process, do some additional initialization in >> it and call 'exec' on it. In the parent process, you change redirected IO >> files back to the original values. >> >> But the problem is that between the FFI calls from Smalltalk the VM can do a >> lot of things including garbage collection etc. On OS X the fork() function >> has the following limitation described in man: >> >> "There are limits to what you can do in the child process. To be totally >> safe you should restrict your yourself to only executing async-signal safe >> operations until such time as one of the exec functions is called. All >> APIs, including global data symbols, in any framework or library should be >> assumed to be unsafe after a fork() unless explicitly documented to be safe >> or async-signal safe. If you need to use these frameworks in the child >> process, you must exec. In this >> situation it is reasonable to exec your-self. yourself." >> >> >> As the result in most cases (but not all) the fork() and exec() pair from >> the Smalltalk side fails on OS X. Linux does not have this limitation >> however even there we found an issue. It is bound to the fact that fork() >> makes a fork of all the parent process that uses the same resources. As soon >> as Pharo is opened in a window and X11 is involved (the window wants to be >> repainted), it can lead to the VM crash. >> >> So we learned that unfortunately we currently cannot use image-only FFI code >> for this task. We need a C library or VM plugin. >> >> The repository of the terminal emulator is here: >> https://github.com/pavel-krivanek/terminal >> >> and can be loaded using the following code: >> >> Metacello new >> baseline: 'TerminalEmulator'; >> repository: 'github://pavel-krivanek/terminal/src'; >> load. >> >> #TerminalEmulator asClass compileLibrary. >> >> >> It compiles and links the small library with only one function using the GCC >> so the machine needs to have a proper development environment. >> >> The terminal emulator is in very early stage and has a lot of issues like >> processes cleanup, drawing, keyboard input etc. etc. If you are interested >> in it, feel free to contribute. >> >> Cheers, >> -- Pavel >> >> >> >> >> >> >> >