mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
As observed previously (see3654ee73
,7e6bbf85
,79d19458
), the ksh 93u+ codebase on which we rebased development was in a transition: AT&T evidently wanted to make it possible to have several shell interpreter states in the same process, which in theory would have made it possible to start a complete new shell (not just a subshell) without forking a new process. This required transitioning from accessing the 'sh' state struct directly to accessing it via pointers (usually but not always called 'shp'), introducing a lot of bug-prone passing around of those pointers via function arguments and other state structs. Some of the original 'sh' struct was separated into a 'struct shared' called 'shgd' a.k.a. 'sh.gd' (global data) instead; these were global state variables that were going to be shared between the different main shell environments sharing a process. Yet, for some reason, that struct was allocated dynamically once at init time, requiring yet another pointer to access it. <shrug> None of this ever worked, because that transition was incomplete. It was much further along in the ksh 93v- beta, but I don't think it actually worked there either (not very much really did). So, starting a new shell has always required starting a new process. So, now that it's clear what they were trying to do, should we try to make it work? I'm going to go with a firm "no" on that question. Even non-forking (virtual) subshells, something quite a bit less ambitious, were already an unmitigated nightmare of bugs. In 93u+m we fixed a load of bugs related to those, but I'm sure there are still many left. At the very least there are multiple memory leaks. I think the ambition to go even further and have complete shells running separate programs share a process, particularly given the brittle and buggy state of the existing codebase, is evidence that the AT&T team, in the final years, had well and truly lost the ability to think "wait a minute, aren't we in over our heads here, and why are we doing this again? Is this *actually* a feasible and useful idea?" In my view, having entirely separate programs share a process is a *terrible*, horrible, no-good idea that takes us back to the bad old days before Unix, when kernels and CPUs were unable to enforce any memory access restrictions. Programmers are imperfect. If you're going to run a new program, you need the kernel to enforce the separation between programs, or you're just asking for memory corruption and security holes. And that separation is enforced by starting a new program in a new process. That's what processes are *for*. And if you need *that* to be radically performance-optimised then you're probably doing it wrong anyway. (By the way, I would still argue the same for subshells, even after we fixed many bugs in virtual subshells. But forking all subshells would in fact cause many scripts to slow down, and the community would surely revolt. <sigh> Maybe I should make it a shell option instead, so scripts can 'set -o subfork' for reliability.) It is also unclear how they were going to make something like 'ulimit' work, which can only work in a separate process. There was no sign of a mechanism to fork a separate program's shell mid-execution like there is for subshells (sh_subfork()). Anyway... I had already changed some code here and there to access the sh state struct directly, but as of this commit I'm beginning to properly undo this exercise in pointlessness. From now on, we're exercising pointerlessness instead. I'll do this in stages to make any problems introduced more traceable. Stage 0 restores the full 'sh' state struct to its former static glory and reverts 'shgd' as a separate entity. src/cmd/ksh93/sh/defs.c, src/cmd/ksh93/include/defs.h, src/cmd/ksh93/include/shell.h src/cmd/ksh93/Mamfile:: - Move 'struct sh_scoped' and 'struct limits' from defs.h to shell.h as the sh struct will need their complete definitions. - Get rid of 'struct shared' (shgd) in defs.h; its members are folded back into their original place, the main Shell_t struct (sh) in shell.h. There are no name conflicts. - Get rid of the _SH_PRIVATE macro in defs.h. The members it defines are now defined normally in the main Shell_t struct (sh) in shell.h. - To make this possible, move <history.h> and "fault.h" includes from defs.h to shell.h and update the Mamfile accordingly. - Turn sh_getinterp() and shgd into macros that resolve to (&sh). This will allow the compiler to optimise out many pointer dereferences already. - Keep extern sh_getinterp() for libshell ABI compatibility. src/cmd/ksh93/sh/init.c: - sh_init(): Do not calloc (sh_newof) the sh or shgd structs. - sh_getinterp(): Keep function for libshell ABI compat.
47 lines
1.9 KiB
C
47 lines
1.9 KiB
C
/***********************************************************************
|
|
* *
|
|
* This software is part of the ast package *
|
|
* Copyright (c) 1982-2011 AT&T Intellectual Property *
|
|
* Copyright (c) 2020-2021 Contributors to ksh 93u+m *
|
|
* and is licensed under the *
|
|
* Eclipse Public License, Version 1.0 *
|
|
* by AT&T Intellectual Property *
|
|
* *
|
|
* A copy of the License is available at *
|
|
* http://www.eclipse.org/org/documents/epl-v10.html *
|
|
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
|
|
* *
|
|
* Information and Software Systems Research *
|
|
* AT&T Research *
|
|
* Florham Park NJ *
|
|
* *
|
|
* David Korn <dgk@research.att.com> *
|
|
* *
|
|
***********************************************************************/
|
|
/*
|
|
* Ksh - AT&T Labs
|
|
* Written by David Korn
|
|
* This file defines all the read/write shell global variables
|
|
*/
|
|
|
|
#include "defs.h"
|
|
#include "jobs.h"
|
|
#include "shlex.h"
|
|
#include "edit.h"
|
|
#include "timeout.h"
|
|
|
|
Shell_t sh = {0};
|
|
#ifdef __IMPORT__
|
|
Shell_t *_imp__sh = &sh;
|
|
#endif
|
|
|
|
Dtdisc_t _Nvdisc =
|
|
{
|
|
offsetof(Namval_t,nvname), -1 , 0, 0, 0, nv_compare
|
|
};
|
|
|
|
/* reserve room for writable state table */
|
|
char *sh_lexstates[ST_NONE] = {0};
|
|
|
|
struct jobs job = {0};
|
|
int32_t sh_mailchk = 600;
|