On Thursday 31 October 2002 12:25 pm, Lars Gullik Bj�nnes wrote:
> | I see that nobody has commented on my zombies patch.
> | Shall I just apply it?
>
> why not...
Ok. But before I do, I think that the current code leaks. I've got this
right too, haven't I? (See below).
Angus
// generate child in background
int Forkedcall::generateChild()
{
const int MAX_ARGV = 255;
char *syscmd = 0;
char *argv[MAX_ARGV];
string childcommand(command_); // copy
bool more = true;
string rest = split(command_, childcommand, ' ');
int index = 0;
while (more) {
childcommand = ltrim(childcommand);
if (syscmd == 0) {
syscmd = new char[childcommand.length() + 1];
childcommand.copy(syscmd, childcommand.length());
syscmd[childcommand.length()] = '\0';
}
if (!childcommand.empty()) {
char * tmp = new char[childcommand.length() + 1];
childcommand.copy(tmp, childcommand.length());
tmp[childcommand.length()] = '\0';
argv[index++] = tmp;
}
// reinit
more = !rest.empty();
if (more)
rest = split(rest, childcommand, ' ');
}
argv[index] = 0;
#ifndef __EMX__
pid_t cpid = ::fork();
if (cpid == 0) { // child
execvp(syscmd, argv);
// If something goes wrong, we end up here
string args;
int i = 0;
while (argv[i] != 0)
args += string(" ") + argv[i++];
lyxerr << "execvp of \"" << syscmd << args << "\" failed: "
<< strerror(errno) << endl;
+ _exit(1);
}
#else
pid_t cpid = spawnvp(P_SESSION|P_DEFAULT|P_MINIMIZE|P_BACKGROUND,
syscmd, argv);
#endif
if (cpid < 0) { // error
lyxerr << "Could not fork: "
<< strerror(errno) << endl;
}
+ // Clean-up.
+ delete [] syscmd;
+ for (int i = 0; i < MAX_ARGV; ++i) {
+ if (argv[i] == 0)
+ break;
+ delete [] argv[i];
+ }
+
return cpid;
}