The Shell destructor was never called. Calling it showed that
the PtyReader thread in TermParse hanged in read(). There's even a comment in there (by Axel) that read() is never interrupted. Switched to kill_thread() in TermParse::StopPtyReader() until this problem is fixed. At least we don't leave running apps around anymore. :) git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21997 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -31,7 +31,6 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#define MAXPTTYS 16 * 4
|
|
||||||
|
|
||||||
#ifndef CEOF
|
#ifndef CEOF
|
||||||
#define CEOF ('D'&037)
|
#define CEOF ('D'&037)
|
||||||
@@ -55,29 +54,6 @@
|
|||||||
#define CSWTCH 0
|
#define CSWTCH 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* ANSI emulation.
|
|
||||||
*/
|
|
||||||
#define INQ 0x05
|
|
||||||
#define FF 0x0C /* C0, C1 control names */
|
|
||||||
#define LS1 0x0E
|
|
||||||
#define LS0 0x0F
|
|
||||||
#define CAN 0x18
|
|
||||||
#define SUB 0x1A
|
|
||||||
#define ESC 0x1B
|
|
||||||
#define US 0x1F
|
|
||||||
#define DEL 0x7F
|
|
||||||
#define HTS ('H'+0x40)
|
|
||||||
#define SS2 0x8E
|
|
||||||
#define SS3 0x8F
|
|
||||||
#define DCS 0x90
|
|
||||||
#define OLDID 0x9A /* ESC Z */
|
|
||||||
#define CSI 0x9B
|
|
||||||
#define ST 0x9C
|
|
||||||
#define OSC 0x9D
|
|
||||||
#define PM 0x9E
|
|
||||||
#define APC 0x9F
|
|
||||||
#define RDEL 0xFF
|
|
||||||
|
|
||||||
/* default shell command and options. */
|
/* default shell command and options. */
|
||||||
const char *kDefaultShellCommand = { "/bin/sh" "-login" };
|
const char *kDefaultShellCommand = { "/bin/sh" "-login" };
|
||||||
@@ -506,7 +482,6 @@ Shell::_Spawn(int row, int col, const char *encoding, int argc, const char **arg
|
|||||||
setenv("TTYPE", encoding, true);
|
setenv("TTYPE", encoding, true);
|
||||||
setenv("SHELL", *argv, true);
|
setenv("SHELL", *argv, true);
|
||||||
|
|
||||||
|
|
||||||
execve(*argv, (char * const *)argv, environ);
|
execve(*argv, (char * const *)argv, environ);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -102,9 +102,6 @@ TermParse::StopThreads()
|
|||||||
|
|
||||||
fQuitting = true;
|
fQuitting = true;
|
||||||
|
|
||||||
//suspend_thread(fReaderThread);
|
|
||||||
// TODO: interrupt read() - doesn't work for whatever reason
|
|
||||||
|
|
||||||
StopPtyReader();
|
StopPtyReader();
|
||||||
StopTermParse();
|
StopTermParse();
|
||||||
|
|
||||||
@@ -229,7 +226,11 @@ TermParse::StopPtyReader()
|
|||||||
|
|
||||||
if (fReaderThread >= 0) {
|
if (fReaderThread >= 0) {
|
||||||
status_t dummy;
|
status_t dummy;
|
||||||
wait_for_thread(fReaderThread, &dummy);
|
//suspend_thread(fReaderThread);
|
||||||
|
// TODO: interrupt read() - doesn't work for whatever reason
|
||||||
|
//wait_for_thread(fReaderThread, &dummy);
|
||||||
|
kill_thread(fReaderThread);
|
||||||
|
|
||||||
fReaderThread = -1;
|
fReaderThread = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -328,10 +328,13 @@ TermView::_InitObject(int32 argc, const char **argv)
|
|||||||
|
|
||||||
TermView::~TermView()
|
TermView::~TermView()
|
||||||
{
|
{
|
||||||
|
Shell *shell = fShell;
|
||||||
|
// _DetachShell sets fShell to NULL
|
||||||
|
printf("TermView::~TermView()\n");
|
||||||
_DetachShell();
|
_DetachShell();
|
||||||
|
|
||||||
delete fTextBuffer;
|
delete fTextBuffer;
|
||||||
delete fShell;
|
delete shell;
|
||||||
|
|
||||||
fQuitting = true;
|
fQuitting = true;
|
||||||
kill_thread(fMouseThread);
|
kill_thread(fMouseThread);
|
||||||
|
|||||||
Reference in New Issue
Block a user