version 1.2, 2025/02/28 20:06:07
|
version 1.8, 2025/04/04 12:46:13
|
Line 1
|
Line 1
|
/* |
/* |
* * |
* $Id$ |
* * * |
|
* * * |
|
* *************** |
|
* * * * * |
|
* * MUMPS * |
|
* * * * * |
|
* *************** |
|
* * * |
|
* * * |
|
* * |
|
* |
|
* symtab.c |
|
* FreeM local system table and user-defined special variable table |
* FreeM local system table and user-defined special variable table |
* |
* |
* |
* |
* Author: Serena Willis <jpw@coherent-logic.com> |
* Author: Serena Willis <snw@coherent-logic.com> |
* Copyright (C) 1998 MUG Deutschland |
* Copyright (C) 1998 MUG Deutschland |
* Copyright (C) 2020 Coherent Logic Development LLC |
* Copyright (C) 2020, 2025 Coherent Logic Development LLC |
* |
* |
* |
* |
* This file is part of FreeM. |
* This file is part of FreeM. |
Line 35
|
Line 23
|
* You should have received a copy of the GNU Affero Public License |
* You should have received a copy of the GNU Affero Public License |
* along with FreeM. If not, see <https://www.gnu.org/licenses/>. |
* along with FreeM. If not, see <https://www.gnu.org/licenses/>. |
* |
* |
|
* $Log$ |
|
* Revision 1.8 2025/04/04 12:46:13 snw |
|
* Patch Solaris 8 crash and bump version to 0.63.1-rc1 |
|
* |
|
* Revision 1.7 2025/03/26 15:17:12 snw |
|
* Fall back to global-backed SSVNs when memory-backed globals fail in attempt to fix Tru64 |
|
* |
|
* Revision 1.6 2025/03/24 04:13:11 snw |
|
* Replace action macro dat with fra_dat to avoid symbol conflict on OS/2 |
|
* |
|
* Revision 1.5 2025/03/24 02:01:41 snw |
|
* Work around some OS/2 incompatibilities in symbol table code |
|
* |
|
* Revision 1.4 2025/03/09 19:50:47 snw |
|
* Second phase of REUSE compliance and header reformat |
|
* |
|
* |
|
* SPDX-FileCopyrightText: (C) 2025 Coherent Logic Development LLC |
|
* SPDX-License-Identifier: AGPL-3.0-or-later |
**/ |
**/ |
|
|
#include <stdlib.h> |
#include <stdlib.h> |
Line 54
|
Line 61
|
symbol-table calls */ |
symbol-table calls */ |
/* #define DEBUG_SYM */ |
/* #define DEBUG_SYM */ |
|
|
|
short st_use_shm = FALSE; |
short restoring_consts = FALSE; |
short restoring_consts = FALSE; |
int semid_symtab; |
int semid_symtab; |
|
|
#if !defined(__OpenBSD__) && !defined(__APPLE__) |
#if !defined(__OpenBSD__) && !defined(__APPLE__) && !defined(__OS2__) |
union semun { |
union semun { |
int val; /* Value for SETVAL */ |
int val; /* Value for SETVAL */ |
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */ |
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */ |
Line 113 void symtab_init (void)
|
Line 121 void symtab_init (void)
|
shm_config->hdr->PSIZE = DEFPSIZE; |
shm_config->hdr->PSIZE = DEFPSIZE; |
shm_config->hdr->argptr = mbpartition; |
shm_config->hdr->argptr = mbpartition; |
|
|
|
|
fprintf (stderr, "symtab_init: initializing memory-backed globals\r\n"); |
fprintf (stderr, "symtab_init: initializing memory-backed globals\r\n"); |
|
|
semid_symtab = semget (symtab_sk, 1, 0666 | IPC_CREAT); |
semid_symtab = semget (symtab_sk, 1, 0666 | IPC_CREAT); |
Line 124 void symtab_init (void)
|
Line 133 void symtab_init (void)
|
fprintf (stderr, "symtab_init: symbol table semaphore created with semid %d\r\n", semid_symtab); |
fprintf (stderr, "symtab_init: symbol table semaphore created with semid %d\r\n", semid_symtab); |
} |
} |
|
|
|
#if defined(__sun__) |
|
fprintf (stderr, "symtab_init: falling back to global-backed structured system variables\r\n"); |
|
shm_config->hdr->use_mb_globals = FALSE; |
|
return; |
|
#endif |
|
|
|
|
arg.val = 1; |
arg.val = 1; |
if (semctl (semid_symtab, 0, SETVAL, arg) == -1) { |
if (semctl (semid_symtab, 0, SETVAL, arg) == -1) { |
fprintf (stderr, "symtab_init: failed to initialize symbol table semaphore\r\n"); |
fprintf (stderr, "symtab_init: failed to initialize symbol table semaphore\r\n"); |
Line 136 void symtab_init (void)
|
Line 152 void symtab_init (void)
|
fprintf (stderr, "symtab_init: allocating partition for memory-backed globals\r\n"); |
fprintf (stderr, "symtab_init: allocating partition for memory-backed globals\r\n"); |
|
|
mbpartition = (char *) shm_alloc ((size_t) PSIZE + 2); |
mbpartition = (char *) shm_alloc ((size_t) PSIZE + 2); |
NULLPTRCHK(mbpartition,"symtab_init"); |
if (mbpartition != NULL) { |
|
shm_config->hdr->use_mb_globals = TRUE; |
|
} |
|
else { |
|
fprintf (stderr, "symtab_init: falling back to global-backed structured system variables\r\n"); |
|
shm_config->hdr->use_mb_globals = FALSE; |
|
} |
|
|
shm_config->hdr->partition = mbpartition; |
shm_config->hdr->partition = mbpartition; |
|
|
Line 156 void symtab_init (void)
|
Line 178 void symtab_init (void)
|
|
|
mbpartition = shm_config->hdr->partition; |
mbpartition = shm_config->hdr->partition; |
|
|
|
symtab_release_sem (); |
} |
} |
|
|
} |
} |
Line 206 void symtab_shm (short action, char *key
|
Line 229 void symtab_shm (short action, char *key
|
unsigned long stptrs[128]; |
unsigned long stptrs[128]; |
register int i; |
register int i; |
char *old_partition = partition; |
char *old_partition = partition; |
|
|
|
if (shm_config->hdr->use_mb_globals == FALSE) { |
|
symtab_bltin (action, key, data); |
|
return; |
|
} |
partition = mbpartition; |
partition = mbpartition; |
|
|
writing_mb = TRUE; |
writing_mb = TRUE; |
Line 948 old0: /* entry from getinc */
|
Line 976 old0: /* entry from getinc */
|
/* end of set_sym section */ |
/* end of set_sym section */ |
|
|
|
|
case dat: |
case fra_dat: |
|
|
|
|
/* note: we assume EOL<DELIM<ASCII */ |
/* note: we assume EOL<DELIM<ASCII */ |