1
0
mirror of https://github.com/Interlisp/maiko.git synced 2026-02-23 07:32:20 +00:00
Files
Interlisp.maiko/inc/version.h
Nick Briggs fae5c4956e Cleanup in the "version array" handling in the {DSK} device (#513)
* Remove useless VersionArray parameter in maintain_version()

The 2nd argument, FileName *varray, is only ever NULL, so
remove it and simplify the code.

* Remove useless and unused VersionArray cache mechanism

* Simplify setting of file times on file close

The futimes(fd, ...) function allows changing the times of a file with
reference to an open file descriptor which allows us to avoid trying to
find a pathname by which utimes(path, ...) would operate on the inode
corresponding to the fd we have just closed.

* Remove unnecessary temporary variable for VersionArray

* In get_version_array() do not mix array and pointer access to VersionArray

* Improve {DSK} device handling of files with many versions

Somewhat dynamically allocate the version array storage, in chunks of
VERSIONARRAYCHUNKLENGTH (currently 200) allowing for up to
VERSIONARRAYMAXLENGTH (currently 2000) entries before reporting an
error. These numbers could be adjusted, or the limit could be removed.

Sorts the version array in descending order of version number to
improve the performance of check_vless_link() which stats every file
in the version array until it finds one linked to the versionless name
(which should be the highest version).  Sorting, and tracking the
number of active entries, also allows for future optimization of other
operations that currently walk through the version array.

* futimens() appears more widely available than futimes() - so use it

* Rework caching of version array for files

While enumerating the entries in a directory is relatively fast,
on some systems (macOS) stat() of a file is slow.
While there is not general agreement on the name in the stat structure
of the timespec field for the modification time, POSIX specifies it
as "st_mtim", and it is possible to #define st_mtim to be the
system-specific name in "version.h" (macOS: st_mtimespec).

* FindHighestVersion can make use of sorted order of filename/version cache

Since the list of filename and versions is maintained in descending order
by version number (see get_version_array) the highest version is trivially
located at index 0 of the filename array.
2024-10-14 14:15:02 -07:00

254 lines
6.2 KiB
C

#ifndef VERSION_H
#define VERSION_H 1
/* $Id: version.h,v 1.5 2001/12/26 22:17:01 sybalsky Exp $ (C) Copyright Venue, All Rights Reserved */
/************************************************************************/
/* */
/* (C) Copyright 1989-98 Venue. All Rights Reserved. */
/* Manufactured in the United States of America. */
/* */
/************************************************************************/
#include <stdint.h>
#include "maiko/platform.h" // IWYU pragma: export
/************************************************************************/
/* */
/* V E R S I O N . H */
/* */
/* Version control: Set the two values that keep sysouts and emul- */
/* ators in sync: The LVERSION and MINBVERSION fields in the IFPAGE */
/* */
/* MINBVERSION is the current emulator version, incremented with each */
/* modification. This must be >= a sysout's ifpage.minbversion. */
/* */
/* LVERSION is the minimum lisp version that will run with this emu- */
/* lator. This must be <= a sysouts's ifpage.lversion. */
/* */
/* The loadup process sets both of these values in the sysout. */
/* */
/* */
/* */
/* C O N F I G U R A T I O N / O P T I O N C O N T R O L */
/* */
/* Given a release specification, set flags for the features */
/* that release has. This lets us set one flag in the make- */
/* file, rather than remembering all the options that must change. */
/* */
/* -DRELEASE=115 Medley 1.15, small atoms */
/* -DRELEASE=200 Medley 2.0 as released */
/* -DRELEASE=201 Medley with DOS & European kbd support */
/* -DRELEASE=210 Medley with big VM */
/* -DRELEASE=300 Medley bigvm as released. */
/* -DRELEASE=350 Medley with 256MB vm. */
/* -DRELEASE=351 Medley with 256MB vm and cursor fix */
/* */
/* */
/************************************************************************/
/* The current values */
#define LVERSION 21000
#define MINBVERSION 21001
/* But remember old values, if we can figure them out from ifdef's */
#if (RELEASE == 115)
#undef LVERSION
#undef MINBVERSION
#define LVERSION 15000
#define MINBVERSION 15000
#undef BIGATOMS
#define NOEUROKBD
#define NOVERSION
#elif (RELEASE == 200)
/* Medley 2.0 as released */
#undef LVERSION
#undef MINBVERSION
#define LVERSION 20000
#define MINBVERSION 20000
#define BIGATOMS
#define NOEUROKBD
#define NOVERSION
#elif (RELEASE == 201 )
/* Medley 2.0 with EUROKBD modification */
#undef LVERSION
#undef MINBVERSION
#define LVERSION 20100
#define MINBVERSION 20100
#define BIGATOMS
#undef NOEUROKBD
#define NOVERSION
#elif (RELEASE == 210)
/* Medley 2.1, big-vm Medley while in beta-test */
#undef LVERSION
#undef MINBVERSION
#define LVERSION 21000
#define MINBVERSION 21000
#define BIGATOMS
#define BIGVM 1
#define NEWCDRCODING
# elif (RELEASE == 300 )
/* Medley 301, big-vm Medley in release?? */
#undef LVERSION
#undef MINBVERSION
#define LVERSION 30000
#define MINBVERSION 30000
#define BIGATOMS
#define BIGVM
#define NEWCDRCODING
#elif (RELEASE == 350)
/* Medley 3.5, 256Mb version */
#undef LVERSION
#undef MINBVERSION
#define LVERSION 35000
#define MINBVERSION 35000
#define BIGATOMS
#define BIGVM
#define BIGBIGVM
#define NEWCDRCODING
#elif (RELEASE == 351)
/* Medley 3.5, 256Mb version, X cursor hotspot fix 1/00 */
#undef LVERSION
#undef MINBVERSION
#define LVERSION 35010
#define MINBVERSION 35010
#define BIGATOMS
#define BIGVM
#define BIGBIGVM
#define NEWCDRCODING
#define NEWXCURSOR
#else
error Must specify RELEASE to build Medley.
#endif
/****************************************************************/
/* */
/* There used to be a define NEW_STORAGE, but this wasn't tied */
/* clearly to any RELEASE values. There are comments related */
/* to this in LLPARAMS on the Lisp side. */
/* */
/****************************************************************/
/****************************************************************/
/* */
/* Architecture-specific flags: Set flags */
/* based on thing we know about the architecture */
/* or idiosyncrasies of the machine we're compiling for. */
/* */
/* Defaults: Unaligned fetches OK UNALIGNED_FETCH_OK */
/* fp values used with */
/* pointer-wide unsigned UNSIGNED */
/* pointer-wide int INT */
/* */
/* */
/* */
/****************************************************************/
#ifdef NOASM
#undef OPDISP
#undef PROFILE
#endif
/* Set up defaults */
#define UNALIGNED_FETCH_OK
typedef uintptr_t UNSIGNED;
typedef intptr_t INT;
/* Not all platforms want to do unaligned reads, so
* we will disable those here. */
#if defined(MAIKO_ARCH_SPARC) || defined(MAIKO_ARCH_ARM)
#undef UNALIGNED_FETCH_OK
#endif
/********************************************************/
/* */
/********************************************************/
#ifndef __has_builtin
#define __has_builtin(x) 0
#endif
#if __has_builtin(__builtin_sadd_overflow) && \
__has_builtin(__builtin_ssub_overflow) && \
__has_builtin(__builtin_smul_overflow)
#define USE_OVERFLOW_BUILTINS
#endif
/********************************************************/
/* */
/********************************************************/
#ifdef DOS
typedef unsigned char u_char;
typedef unsigned long u_int;
typedef unsigned short u_short;
#undef UNALIGNED_FETCH_OK
typedef unsigned USHORT;
#else
typedef unsigned short USHORT;
#endif /* DOS */
/****************************************************************/
/* End of architecture-specific flag settings */
/* --Start of system-specific flags */
/* */
/****************************************************************/
#ifdef MAIKO_OS_MACOS
/* macOS does not follow the POSIX standard for the names of the stat
fields that allow access to the nanosecond resolution times
*/
#define st_atim st_atimespec
#define st_mtim st_mtimespec
#define st_ctim st_ctimespec
#endif
/****************************************************************/
/* End of system-specific flag settings */
/****************************************************************/
#endif /* VERSION_H */