$(LD) is set to $(CC) if $(LD) not set before makefile-tail.
2. In makefile-tail added $(UPFRONT_LDFLAGS) to accomdate emscripten build
where -lidbfs.js needs to come before files in ld call.
3) replaced wasm builds with wasm_nl builds; removed wasm_nl builds.
Compiling with -DMAIKO_ENABLE_NETHUB makes it possible to test out having a WebSocket
server that could pass packets back and forth to the Dodo NetHub.
Setting Emscripten link-time option for EXIT_RUNTIME allows the runtime code to shutdown
when you exit Medley via a (LOGOUT)
Set up preloads for all the parts of the Medley directory that MEDLEYDIR-INIT expects
to be there. The resulting ldesdl.data is (at this time) 128 MB. It can be installed
gzipped if using nginx or some other web server that supports pre-zipped static files.
It would be better to have these as lazy-loading files, but the setup for that is
complicated. Another alternative to embedding all the data would be if a WebSocket
to XNS/Nethub gateway were written and deployed.
Passes the window width/height as the requested geometry to lde at startup.
Since we control the directory structure of the file-system, we can pass the
known fixed location of the Medley directories in the MEDLEYDIR environment variable.
Sets up the NetHub host as localhost - not currenty functional, but a WebSocket
server could be added to communicate with the NetHub gateway to enable local
networking from the browser version of Medley.
Moves the full.sysout from the root of tle system to /medley/loadups/full.sysout,
adds /medley/lispusers/BACKGROUND-YIELD.LCOM and an Emscripten/WAsm specific
site init file at /usr/local/lde/site-init.lisp
Adjusts options so that the options are in the correct place for the
compiler and loader.
There is no need for an additional Emscripten-specific counter to periodically call emscripten_sleep().
Make test for Emscripten environment check MAIKO_OS_EMSCRIPTEN rather than checking __EMSCRIPTEN__,
which is localized in the maiko/platform.h include.
Adds stub procedures and hooks them in to the X11 error handlers as an
example of how we may be able to handle lost X connections and
gracefully terminate the session.
This is only a potential issue in DEBUG build. A problem hasn't occurred, that I know of, but it seemed best just to be safe.
Moved the DEBUG code to precede the XFree(mapping) call. (Equivalent to moving the XFree down.)
The forward and backward pointers in an array block only contain
valid pointer values when the block is free therefore avoid
producing native addresses from these fields if the block is in use.
Add comments regarding the operation of the array block merging code
Array block merging will produce a single block if possible,
otherwise it will produce two blocks with one as large as possible
and the other no less than the minimum block size.
Rewrite the checks in array block merge forward to minimize unnecessary field accesses
Have CMake build ldeinit when configured for X11 display, and
update the ever-growing list of names under which clang-tidy may
be found (now up to version 16)
If machinetype or osversion are executed from other than the current working directory
they will fail to execute the config.guess script because it was invoked with "./config.guess".
This update attempts to determine the directory where machinetype or osversion
were found and uses the same path to invoke config.guess.
While there was a definition for the pre-bigvm case, with 24-bit
pointers, for byteswapped (little-endian) systems, there was no
structure definition for the bigvm case, with 28-bit pointers.
* Start cygwin-sdl builds: first pass at buildCygwinBuilderImage workflow. Add makefile-cygwin.x86_64-sdl.
* WIP Dockerfile_cygwin_builder
* First pass of complete cygwin-sdl build workflow
* Fix indent error in buildCygwinBuilderImage.yml
* fix incorrect use of github token in buildCygwinBuilderImage.yml
* fix incorrect use of --build-arg in buildCygwinBuilderImage.
* fix incorrect docker build statement in buildCygwinBuilderImage.
* make docker tag lowercase since apparently Wiondows docker doesn't like uppercase tags in buildCygwinBuilderImage.
* fix quotiing on last commit in buildCygwinBuilderImage.
* fix download output location for SDL2 in buildCygwinBuilderImage.
* Add windows/cygwin build to buildRelease workflow
* Fix typos in buildRelease workflow
* Fix more typos in buildRelease workflow
* Debugging per-system if statements buildRelease workflow
* Debugging per-system if statements buildRelease workflow #2
* Debugging per-system if statements buildRelease workflow #3
* Fix checkout actions step to use powershell-sims not bash-isms in Windows job
* Fix Docker_env step to use powershell-isms not bash-isms in Windows job
* Fix Docker_env step to use powershell-isms not bash-isms in Windows job #2
* Fix Docker_env step to use powershell-isms not bash-isms in Windows job #3
* Revamp cygwin build to use docker build instead of docker buildxx because buildx seems to not like windows containers
* Fix some line split nonsense
* Fix typo in last commit
* Add proper repo info to Dockerfile_cygwin_maiko
* More debugging
* Revamp how cygwin-sdl is built - now build directly on runner and not via a Dcokerfile and docker.
* Fix typo
* Fix retrieve of sdl2
* Fix set up release tag action to ake account of the fact that Maiko has been checked out to cygwin\maiko instead of top level workspace
* Fix set up release tag action to ake account of the fact that Maiko has been checked out to cygwin\maiko instead of top level workspace #2
* Fix set up release tag action to ake account of the fact that Maiko has been checked out to cygwin\maiko instead of top level workspace #3
* Cleanup build maiko step
* Prevent git from messing uo line endings on checkout
* Fix copy of cygwin.x86_64 dir to relesase tars
* Set execute bit of (almost) all files in release tar; rearrange build step to use cyugwin bash as the shell
* Fix rearrange build step to use cyugwin bash as the shell
* Try a different way of rearrange build step to use cyugwin bash as the shell
* Fix typo
* When cygwin bash as shell did not work; reverting to brute-force way
* Hopefully fix release push not getting tar file
* Cygwin-sdl build working; remove debugging code
* Remove wrokflow files associated with abandoned attempts at building cygwin via docker
---------
Co-authored-by: Frank Halasz <fghalasz@interlisp.org>
Introduce buildCygwinBuilderImage.yml into master so I can test on dev branch
Trivial add so I can continue testing on a dev branch - so immediate merge.
On a Mac laptop (without a full keyboard) it isn't easy to generate
the delete in the ctrl-shift-delete user interrupt. The esc key is
in the same word and can easily be generated, so add ctrl-shift-esc
as an alternative.
The pathname for the display program is constructed to parallel the
path for "lde", which makes it more likely that the correct display
program will get run rather than
(a) not being found because "lde" wasn't found from the PATH, or
(b) a different version of the display program which was found from the PATH
No functional difference. Replaces a few leftover references to a prior
project name for the C implementation of the Lisp Virtual Machine with the
current name.
Remove unused #include "miscstat.h"
Make parameters of cursor_equal_p both const
Remove unnecessary extern declarations for EmKbdAd068K, EmRealUtilin68K, MiscStats
On slower filesystems/disks, an lseek() operation can consume
noticeable time. During initial sysout loading we can avoid an
unnecessary lseek() before each read() by tracking if the position it
will seek to is the same position that the previous read() left us.
There is no reason for the constructed makefile not to recognize "clean"
as well as the original "cleanup" as target to remove the object files
and executables.
The fix to allow compiling for Alpine Linux caused breakage on Solaris
because MAXNAMLEN is defined in <dirent.h> which was now NOT included.
Pending a conversion to POSIX NAME_MAX, include <dirent.h> in "locfile.h".
* Changes needed to compile maiko on Alpine Linux with clang. Switching to Alpine on github actions to streamline maiko release builds
* Changes needed to compile maiko on Alpine Linux with clang.
Switching to Alpine on github actions to streamline maiko release builds.
* ether_nethub.c missing a couple of includes, and incorrectly including
<sys/poll.h> instead of plain <poll.h>
* <dirent.h> does not define MAXNAMLEN on Alpine Linux, but "locfile.h"
compensates for this already, if it is modified to include <limits.h>,
so use this in "dirdefs.h".
---------
Co-authored-by: Nick Briggs <nicholas.h.briggs@gmail.com>
Handle compilation with both SDL and XWINDOW defines
If both are defined then the -d/-display will accept
SDL as a display name and invoke ldesdl rather than ldex.
Improve error messages when display can't be opened
Use exit status 1 for all failures (vs. mixed 1, -1)
Rationalize the SDL.h include file references so that they work on all systems
Use the correct macOS Framework options to get include path and library search path
Add makefile fragments for SDL on macOS on Apple Silicon, plus FreeBSD and Linux
on same cpus as X11
Switch to gcc rather than clang as the default compiler for Linux systems
Use the Lisp type DLword where referring to data stored by Lisp
Access the extern EmCursorBitMap68K directly where appropriate.
Use GETBYTE() macro to correct for endian-ness of host system
when accessing the cursor bitmaps.
Cached cursors can use an ordering strategy that only promotes the
found item if it is third or later in the list since in normal
operation Medley is highly likely to flip back-and-forth between
two cursors.
sdl_bitblt_to_texture2 is an experiment, parallel to sdl_bitblt_to_texture
that only moves as many bits as are required, rather than rounding down(up) to the
nearest (16-bit) word boundary for the start(end) of the line.
Introduces some name changes to make things a little clearer.
Instead of checking "do_invert" at each pixel assignment, assign the
foreground and background colors appropriately when responding to the
(VIDEOCOLOR x) call.
Modify sdl_bitblt_to_texture() so that it does less arithmetic in the inner loop,
including using a table of masks rather than computing 1<<n on each pixel.
Modify sdl_bitblt_to_texture() so that it accesses the Lisp display region
16-bits at a time with the correct ordering for whether we are on a byte-swapped
system or not.
Adds an sdl_blt_to_window_surface() that goes directly from the Lisp bitmap
to the window surface avoiding the intermediate copy. This is only coded for a
scale factor of 1. Uses the intermediate buffer if the scale is not 1.
Corrects an error where the damage rectangle was not properly reset.
Using SDL_LockTexture/SDL_UnlockTexture we can gain more direct access to the pixels of the
texture and update them directly from the Lisp screen bitmap.
At the same time, for both the rendering case and the display surface case,
update the pixel format used to be either the first (presumably preferred?)
format for a texture, or the surface format of the window.
Use the SDL routines to pick out the pixel value for Black and White based on the
destination it will be placed in.
If the preprocessor symbol SDLRENDERING is defined the code operates as
it previously did. In the absence of that, we process the Lisp bitmap
into an intermediate form (as before) but then use SDL bitblt to
redraw the intermediate form on the window's surface.
On startup, bitblt calls may be made for the original screen size
and if the new screen size is smaller than that, we must ensure
that damage notifications are contained within the new screen.
Move definition of min() so we can use it in sdl_notify_damage()
Build with cmake. This will create a new backend (ldesdl).
- Resolution can only be set by editing the variables in sdl.c.
- Key repeat does not work.
- Still problems with keysyms that implicitly contain modifiers.
- The entire screen is bitblted onto the SDL display every frame.
Support keyboard, and work on mouse.
Kind of working...
Fix display resolution problems.
The Lisp implementation distinguishes between 0 and NIL as the result of
the gcscan1/gcscan2 opcodes, however the C implementation did not, since
NIL and 0 are indistinguishable.
CSTKPTR is "LispPTR *" while CurrentStackPTR is "DLword *", cast to "void *" to
silence the warning, add comment pointing out size difference to explain the
"- 1" vs "+ 2" adjustments when saving/restoring.
Creating a free block or guard block on the stack with an odd number of 16-bit words
will cause the system to break badly. Always check that and report an error.
Because the stack pointer is declared as "DLword *" (16-bit) for pointer arithmetic,
although it is always maintained as a pointer to a 32-bit boundary, the compiler generates
spurious warnings on casting the stack pointer to structures that require 32-bit alignment.
Silence those warnings by casting through (void *).
The "fillpointer" and "totalsize" fields of the array header and the "offst"
of the sequence descriptor were declared as LispPTR, an unsigned type that
represents an offset into the Lisp memory, however the Lisp datatype
declaration indicates that these are FIXP (int32_t) rather than pointers.
Number of items to be sorted (prepare_sort_buf, file_sort) is size_t
Get consts in correct place arguments for comparison routines dsk_filecmp, unix_filecmp
Use compile-time constant SMALLP_MINUSONE/SMALLP_ZERO instead of calling GetSmallp()
ERRSETJMP(-1) should be ERRSETJMP(SMALLP_MINUSONE) as it must return a LispPTR
Call GetPosSmallp() when argument is unsigned (correct type conversion warning)
GCC treats the size of a void as 1 for the purposes of arithmetic on
a pointer to void. Since this was provoked by an explicit cast to
pointer to void we can replace it with a cast to pointer to char for
the same effect.
by casting through (void *) since we know that the CurrentStackPTR is maintained with 4-byte
aligned pointers.
Resolve type error for user_subr argument.
Define alternative macros for CSTKPTR, PVAR, and IVAR that can be used
in an lvalue context, since CSTKPTR = ...; would generate
error: assignment to cast is illegal, lvalue casts are not supported
A similar issue drives the PCMAC/PCMACL defines, although there it is
that the rvalue is (pccache - 1) and the lvalue is (pccache)
Correct various warning: implicit conversion loses integer precision (30)
Correct parameter type declaration error for N_OP_aset1()
Ensure that appropriate types and casts are used in aref_switch()
Remove requirement for declaring "int new" when using aset_switch() macro
Initialize MaxTypeNumber_word from address of value cell of \MaxTypeNumber in initsout.c
Correctly extract value of \MaxTypeNumber where used in gcmaptable() (though gcmaptable() itself is unused at this time)
Update GetDTD() macro to return (void *), result will be cast to (struct dtd *) where it is needed. Alignment should always be sufficiently large.
createcell68k(typecode) returns a pointer that is aligned for the typecode
argument. Changing the return type to "void *" puts the onus on the caller
to cast the result to an appropriately aligned object. All current uses
in the maiko source ask for 4-byte objects (TYPE_FIXP, TYPE_FLOATP).
* sort_fptovp() and twowords() can be static and are sometimes (depending on flags)
not needed at all
* roundup() macro is unused and can be removed
* maxpages can be unsigned (affects main.c)
* variables used for return values of system calls should be correctly declared
* pointers into Lisp_world should be DLword* rather than char*, and
computations must take that into account.
* ENOSPC and EDQUOT errors on write should return NOFILESPACE instead of FILECANNOTWRITE error.
Note that one might analyze the order of the variables in the bitblt inner loops and
adjust so that items accessed together are in the same cache-line.
The global variable holding the native address of the I/O page is spelled "IOPage"
The global variable "IOPage" is declared extern by "lspglob.h"
The structure pointed to by IOPage is named IOPAGE and is defined in "iopage.h"
If there is no direct reference to the IOPAGE struct do not include "iopage.h"
* Update struct DevRec methods to take a "void *" parameter
since they get called with different xxxInterface records
depending on whether they are a keyboard, mouse, or display.
Introduce GenericReturnVoid method implementation for use
where needed with DevRec methods. (see mouseif.c)
* Cast functions implementing DevRec methods as appropriate to match
the method signature.
* Update struct DspInterfaceRec methods cleardisplay,
bitblt_to_screen, mouse_invisible, and mouse_visible to declare
the parameters they require and all return unsigned long results
(though it's not clear that this is actually the correct type).
Requires updating dosmouse.c method implementations.
* Update GenericReturnT and GenericPanic method implementations
to have the signature required by the method slots they
are used in.
* Correct DOS-only section with incorrect arguments to device.exit
call for the mouse.
* Use include "dspifdefs.h" for prototypes for GenericReturnXXX method
implementations.
devif.h, mnxdefs.h:
Update MRegion to reflect that width/height are unsigned.
Update ...EventMask fields in XWINDOW section of DspInterfaceRec to match parameter
type used in XSelectInput() to which they are passed.
Add padding to explicitly align colors field (short among longs)
xbitmaps.h:
Reorder fields in LISP_CURSOR struct to avoid requiring padding for alignment
constraints, and adjust initialization to match.
Declare cursors static const.
Move Lisp_Icon from xbitmaps.h to xmkicon.c
xinit.c, xinitdefs.h
Replace bound() (xwinmandefs.h) with static inline unsigned ubound() in xinit.c
Change signature of X_init() to use unsigned values for width, height, depth.
Add casts where necessary to avoid implicit signedness conversions.
Add extern declarations for all globals defined in xinit.c
xwinman.c, xwinmandefs.h
Remove bound() from xwinmandefs.h and use static inline unsigned ubound() in xwinman.c
Change signature of lisp_Xconfigure() to use unsigned width and height parameters.
Make GravSize unsigned to match its usage context.
Add casts where necessary to avoid implicit signedness conversions.
Add missing break to correct switch case fall-through warning.
dspif.c
Change LispDisplayRequestedWidth/Height to unsigned to reflect context of use.
xlspwin.c
Eliminate declaration for unused XEvent report.
Move global variable gcv, used only locally, to local variable in the procedures where needed.
Change various variables used in width/height calculation to unsigned to match usage context.
Add casts where necessary to avoid implicit signedness conversions.
xmkicon.c
Move Lisp_Icon from xbitmaps.h to xmkicon.c.
Move global XImage IconImage to local in function where it is required.
Add cast where necessary to avoid implicit signedness conversions.
xrdopt.c
Remove incorrect casts for signedness causing implicit sign conversion warnings.
Add extern declarations for all globals defined in xrdopt.c
xscroll.c
Replace bound() (xwinmandefs.h) with static inline signed sbound() in xscroll.c
initdsp.c, initdspdefs.h
Change signedness of various display variables from int to unsigned.
Change signature of init_display2() to unsigned display_max.
Add extern declarations for some globals defined in initdsp.c
xbbt.c
Add explicit casts for type warnings from MRegion width/height change.
Add explicit casts for type warnings in arguments to XPutImage().
* The transport between the Maiko client and Nethub server is TCP based and therefore data is buffered by the kernel so it is not necessary to have an additional layer of buffering to capture multiple logical packets before passing them to the Lisp ethernet interrupt handler.
* Receive packet directly into Lisp’s buffer and byte-swap in place only if necessary.
* Ethernet packet handling is no longer done directly in the signal handler so it is not necessary to block/unblock signals while a packet is being read from the byte stream in ether_get().
* Remove references to ETHEREventCount as it is unnecessary and the implementation (xc.c; other ethernet handlers) that attempted to use it to handle missed ethernet interrupts is incorrect, resulting in calls to the Lisp interrupt handler with no new packet data.
* Style changes - Use early return rather than nesting if statements. Move variable declarations from inline to beginning of function if they are not local to a small block. Use %p format specifier for printing pointers.
word_swap_page() should only touch each 32-bit word once to change
the byte order from ABCD to DCBA rather than twice doing a transform
of the entire region from ABCD to BADC and then again to DCBA
The compiler provided ntohl() usually gets favorable optimizations
applied, so use it for the byte reordering.
With word_swap_page() rewritten, byte_swap_word() is superfluous.
* added support for XNS networking via Dodo-Nethub
* NetHub connection now optional (only if -nh-host is given); released NetHub-related changes to 'ether.c' to the public domain
* Added file using-dodo-networking-with-maiko.md
Documentation for building and using the Dodo-networking addition to Maiko
* Added support for running Maiko unter cygwin/x86_64-x
* Migrate Addr68k/NativeAlignment{2,4} in Nethub code, move timer/async defines to platform.h
* added missing include <netinet/in.h> for FreeBSD
* updated 'compile-flags' with added flags
* splitted ether.c in 3 (_common, _sunos, _nethub)
* reworks/modifications for nbriggs' pull-request review comments
* addintional additions for nbriggs' pull-request review comments
* get the Lisp packet lengths with 'LispInt2CInt'
* renamed variables in dblwordsSwap to indicate it's about double-words
* fixed wrong preprocessor directive unnoticed by clang
* added networking choice option to cmake build, fix to printf warning
- for cmake specify the networking to use with -DMAIKO_NETWORK_TYPE=<type>
- with <type> one of: NONE, SUN_DLPI, SUN_NIT, NETHUB
- e.g.: cmake .. -DMAIKO_NETWORK_TYPE=NETHUB
* integrated improvement to sendPacket() proposed by nbriggs
* integrated fix for SIGBUS on 32-bit big-endian, provided by nbriggs
* MAIKO_ENABLE_ETHERNET should not be unconditionally set on Solaris systems
* Receiving an ethernet packet is an ether interrupt but not an i/o interrupt.
Co-authored-by: dev hawala <devhawala@x.y>
Co-authored-by: Nick Briggs <nicholas.h.briggs@gmail.com>
Solaris does not define O_ASYNC, but does define FASYNC and FNDELAY,
which it expects to be used in place of O_ASYNC in an fcntl() to set up
asynchronous I/O on a socket.
This fix also generates a compiler warning if neither the O_ASYNC nor
FASYNC/FNDELAY methods are available.
Addr68k_from_LADDR always produced a 2-byte aligned pointer which
was frequently cast to a type requiring 4-byte alignment.
This commit changes Addr68k_from_LADDR uses to one of two new
inline procedures, NativeAligned2FromLAddr or NativeAligned4FromLAddr,
which produce a result with the appropriate alignment for the context.
This permits checking for cases where the Lisp address is not
appropriately aligned for the usage context, and localizes compiler
warnings to these two procedures.
Similarly, the Addr68k_from_StkOffset macros are replaced by
NativeAligned2FromStackOffset and NativeAligned4FromStackOffset.
NativeAligned4FromLPage replaces Addr68k_from_LPAGE as page address
will always be at least 4-byte aligned.
LAddrFromNative, LPageFromNative, and StackOffsetFromNative complete
the set, replacing LADDR_from_68k, LPAGE_from_68k, and
StkOffset_from_68K (note K not k) respectively.
Instead of using a single macro that converts from a lisp pointer to
a native pointer to a 2-byte aligned item then perhaps casting to objects
that require 4-byte alignment... use separate functions for 2-byte and
4-byte aligned pointer results. The clients should be explicit about
which alignment they require, and the conversion functions can check
(perhaps in DEBUG mode) that the resulting pointer is on an appropriate
boundary.
This commit defines the functions but does not introduce any uses.
posix_memalign() does not guarantee initializing the allocated
memory to zero, which Lisp expects, so the code must memset() the
entire allocated region to zero. The effect of this is (generally) to
force the allocation of RAM to the process, which is wasteful, since
we normally start with only 4% of 256 MB in use for a full.sysout.
Allocating memory with mmap, using MAP_ANON, guarantees that the
memory is already zeroed (effectively mapping /dev/zero with copy-on-write)
so it is not necessary to touch it before use. This keeps the
pre-allocated RAM to a minimum.
Remove deprecated register attribute
Ensure correct type used to store result of system calls
Use memset to zero buffer vs byte-at-a-time stores
Use GetPosSmallP where appropriate
Remove deprecated register attribute
Use #ifdef SYM (vs #if SYM) when SYM may be undefined
Use ptrdiff_t rather than int for pointer differences
Correct signedness problems
Many of the warnings were newly visible after the DBPRINT macro
was modified, but the pedantic warnings also caught existing printf
family usage which was not strictly correct.
Mostly replacing 0x%x with %p for pointers, adding (void *) for
those and other pointers, %td for ptrdiff_t, but also changing
some function parameters from UNSIGNED (uintptr_t) to int
where that was the more appropriate type.
Combines arith2.c ... arith4.c files and their associated header files
into new arithops.c/arithopsdefs.h files, and adjusts the CMakeLists.txt,
and old-style makefile-tail. Also updates makefile-dos,
inlnPS2.h, and inlndos.h to reflect these changes, though these are not
used.
Combines the array..array6 files and their associated header files
into new arrayops.c/arrayopsdefs.h files, and adjusts the CMakeLists.txt
and old-style makefile-tail to reflect these changes.
Remove unused #define PERCENT_OF_SCREEN in MyWindow.h
Move structures for dir.c to dirdefs.h where they are used
Resolve S_CHAR vs S_CHARACTER in favor of S_CHARACTER and cleanup #defines
Fix = vs == bug in FSDEBUG code in dir.c
Eliminate duplicate/unused constant definitions in gcr.c
Declare static internal function bytecmp in mkatom.c
Update many source and include files to include headers for what they use
If the debugging printf macros are elided by the preprocessor
rather than being removed by the compiler's optimizer then
the debugging statements may get out-of-date as variables are
modified. Wrap the non-debug case in "if (0) ..." instead.
Github is deprecating the MacOS-10.15 environment as MacOS-12 is coming
online (currently beta), so this runner must be updated to MacOS-11
Ubuntu 22.04 LTS is now available so add that to the builds.
Ubuntu 18.04 LTS should be supported until April 2023.
* arithmetic opcode implementations should return LispPTR rather than int
* all callers of ERROR_EXIT() have return type LispPTR, therefore ERROR_EXIT should too
* N_[I]GETNUMBER, [N_]ARITH_SWITCH need (int) casts for some large constants that would otherwise be unsigned
* Expand use of macro N_ARITH_BODY_1_UNSIGNED and correct types
* Remove unused macros N_ARITH_BODY_1 and N_ARITH_BODY_1_UNSIGNED
* Cast to correct type for storing to TopOfStack, and return type of TIMER_EXIT()
* Pedantic C compilers want an extern declaration separate from initialization
* Remove duplicate definitions for fns in initdspdefs.h from display.h
* Remove misleading comments on structure member offsets and reorder to minimize padding
The device_before_raid() call that disables X11 scrolling and bit-gravity
selection needs to avoid referring to the scrollbars and other ancillary
windows that have not been initialized when the "-noscroll" option was
given at startup.
Keyboard, cursor, and mouse pointers are not initialized in
ldeinit. Do not process X events as they will cause a segmentation
fault referencing the uninitialized pointers.
Prior to this change there was no mechanism within Medley to create a new directory
on a {UNIX} style device. This change makes the {UNIX} directory creation happen in
the same manner that {DSK} directory creation is done. Opening a file with access
OUTPUT, BOTH, or APPEND, which would create the file if it does not exist, will also
create any missing directories in the path.
stat.st_mode cannot be tested for whether a node is S_IFDIR with
if (stat.st_mode & S_IFDIR) ...
since S_IFDIR bit (0040000) is a subset of S_IFSOCK (0140000) bits.
A correct check is
if ((stat.st_mode & S_IFMT) == S_IFDIR) ...
or alternatively, since the convenience macros are defined on all modern systems
if (S_ISDIR(stat.st_mode)) ...
If the argument to DELFILE represents a directory on the {unix} device
either directly or through resolving to a full pathname via the connected
host/directory, and the directory is empty, then the directory will be deleted
and the deleted directory name will be returned. Will error if the
directory is not empty, and return NIL if the argument does not name a directory
or file.
* Adding new workflow that builds maiko releaases for Linux/amd64, Linux/arm64, Linux/arm7, Macos/amd64. (Not Macos/arm64 as yet.) Also builds and pushes to DockerHub docker images for Linux/amd64 and Linux/arm64. Delete old buildDocker.yml workflow.
* Adding latest version of buildReleaseInclDocker.yml; builds release and docker images for all major platforms except MacOs arm64.
* Adding Dockerfile. Was out of sync with final dev version at fghalasz/maiko
* Adding new workflow that builds maiko releaases for Linux/amd64, Linux/arm64, Linux/arm7, Macos/amd64. (Not Macos/arm64 as yet.) Also builds and pushes to DockerHub docker images for Linux/amd64 and Linux/arm64. Delete old buildDocker.yml workflow.
* Adding latest version of buildReleaseInclDocker.yml; builds release and docker images for all major platforms except MacOs arm64.
Since the native addresses for objects within the Lisp memory may be at locations
that can't be represented in 32-bits conversion between a native address and a
Lisp FIXP can't be supported. For now, return NIL for conversion in either direction.
There are no known users of these two subrs. Should it be necessary to reimplement them
at some future time the representation will need to be something that can hold 64 bits.
When Medley closes a stream open to a process it uses a "unixcomm"
command (3) which should close() the communication channel open with
the process and give it a chance to handle that and exit cleanly
before using a SIGKILL on it. We can't determine apriori whether the
process is going to cooperate, so we're stuck trying for up to 0.1s
(arbitrary choice!) waiting for the process to exit, then it gets a
SIGKILL, and we wait up to 0.1s again to see that it really exited.
These routines were stubs that did nothing and were not called from anywhere
so lack value in even providing a template or hook for a fuller implementation.
Also note that "stackcheck" conflicts with a predefined symbol in some runtime
libraries. Should these be implemented in the future they should use a
maiko-specific name.
Add m68k to recognized CPUs (machinetype)
Add amigaos to recognized operating systems (osversion)
Add ability to override "config.guess" output w/ LDEARCH= to osversion
Add platform.h clauses to recognize AmigaOS 3 using gcc to cross-compile
makepathname() is only ever called with one of two constant string
arguments, in one case (DOS) such that it only does a strncpy(...),
and the other case (non-DOS) expanding "~" to the current user's home
directory. Additional code duplicates realpath() functionality but is
never used.
Commit c46fcce307 fixed a warning for
incompatible pointers to nnewframe() but did not consider that the
order of the DLwords is swapped depending on the endianness of the
system it is running on. Add the necessary GETBASEWORD() macros to
access the items when constructing the pointer.
nnewframe() as called from the EVAL implementation expects to be passed
the address of an array of two DLwords. Do that, and compose the 32-bit
result correctly rather than passing the address of a (32-bit) LispPTR
and then having to swapx() that result to get the expected value.
* Correct warning: cast to smaller integer type -- X_init/lispbitmap
* Fixes to INTRSAFE, INTRSAFE0 and ensure TIMEOUT, TIMEOUT0 used appropriately
INTRSAFE and INTRSAFE0 must clear errno before executing the library or system
call because not all library calls set errno on success.
Avoid casting pointers or larger integer values down to smaller ints before
comparing to 0 or -1, and use NULL (a pointer) rather than 0.
Fix cases where the result of the library call is a pointer rather than an int
to use TIMEOUT0 instead of TIMEOUT, testing for NULL rather than -1
on timeout (errno == EINTR)
* Remove useless validity check of LASTVMEMFILEPAGE_word pointer
* Convert pointer arithmetic type in drawline from int to ptrdiff_t
* Add NOTE warning about a 32-bit vs 64-bit issue affecting currently unused GET_NATIVE_ADDR_FROM_LISP_PTR
No calls to make_atom() depend on the ability to parse the atom's
pname as a number. Additionally, the parse_number() implementation
used here was non-functional.
We remove parse_number() and adjust the parameter list of make_atom()
to remove the non_numericp flag.
As long as $(SHELL) names an executable that appears in /etc/shells (as determined
by the getusershell() function) use that. It used to always use /bin/csh, but some
modern distros do not ship with csh installed. Using the user's preferred shell
seems like a better choice, while allowing the choice from /etc/shells gives some
additional flexibility.
Adds a -noscroll option, parsed as an X option, also accessible via
resource ldex*noscroll, which avoids adding the bottom and side scroll
bars and the bit-gravity control buttons to the main Lisp display window.
Unless the geometry given for the X window in which the Lisp screen is
displayed is at least as big as the Lisp screen part of the Lisp screen
(bottom, right) will not be visible.
On macOS with XQuartz, maximizing the X window will bring it to
the size of the Lisp screen (or the size of the display, whichever is smaller)
cases for subrs UNCOLORIZE-BITMAP, COLORIZE-BITMAP, COLOR-8BPPDRAWLINE (which
are not compiled into current code) can have the numbers replaced by the
symbolic constants that are now defined in subrs.h
* Fix some warnings in main.c
main.c:678: narrowing conversion from 'unsigned long' to signed type 'int' is implementation-defined
main.c:493: The return value from the call to 'seteuid' is not checked.
* Fix some warnings in array operations
Instead of extracting typenumbers to an 'int', use the unsigned typenumber directly
array3.c:49: narrowing conversion from 'unsigned int' to signed type 'int' is implementation-defined
array4.c:61: narrowing conversion from 'unsigned int' to signed type 'int' is implementation-defined
array5.c:63: narrowing conversion from 'unsigned int' to signed type 'int' is implementation-defined
array6.c:50: narrowing conversion from 'unsigned int' to signed type 'int' is implementation-defined
* Resolve type mismatches for version numbers and propp flag
dir.c:1849: narrowing conversion from 'unsigned int' to signed type 'int'
dir.c:1850: narrowing conversion from 'unsigned int' to signed type 'int'
dir.c:2114: narrowing conversion from 'unsigned long' to signed type 'int'
dir.c:2207: narrowing conversion from 'unsigned int' to signed type 'int'
* Resolve type mismatches for version numbers and strlen result type
dsk.c:1072: narrowing conversion from 'unsigned long' to signed type 'int'
dsk.c:1108: narrowing conversion from 'unsigned long' to signed type 'int'
dsk.c:1549: narrowing conversion from 'unsigned long' to signed type 'int'
dsk.c:1712: narrowing conversion from 'unsigned long' to signed type 'int'
dsk.c:1751: narrowing conversion from 'unsigned long' to signed type 'int'
dsk.c:3426: narrowing conversion from 'unsigned int' to signed type 'int'
* Resolve type mismatches for strlen result type
ufs.c:213: narrowing conversion from 'unsigned long' to signed type 'int'
ufs.c:404: narrowing conversion from 'unsigned long' to signed type 'int'
* Resolve type error
uutils.c:117: 'signed char' to 'int' conversion [bugprone-signed-char-misuse,cert-str34-c]
* Add experimental SUBR to call nanosleep() for experiments in reducing CPU load
This adds a SUBR, sb_YIELD, value (octal) 0322 which takes a single number
0..999999999 which is the number of nanoseconds to pass to nanosleep().
The return value is T if the call to nanosleep() was executed or NIL
if it was not (argument out-of-range, or other error in getting the
number from the argument).
To use this experimental SUBR in a sysout you should:
(SETQ \INITSUBRS (CONS '(YIELD #o322) \INITSUBRS))
then you can define functions that use that SUBR:
(DEFINEQ (BACKGROUND-YIELD () (SUBRCALL YIELD 833333)))
(COMPILE 'BACKGROUND-YIELD)
(SETQ BACKGROUNDFNS (CONS 'BACKGROUND-YIELD BACKGROUNDFNS))
* Update to use subrs.h newly generated from LLSUBRS
The subrs.h include file is generated by WRITECALLSUBRS based on the \INITSUBRS
list. This update provides for the new YIELD subr in the generated file,
and makes some necessary updates to the C code implementations for some subr
names which have changed.
There is no reason to use sscanf() rather than strtol()/strtoul()
for parsing simple integer values from a string.
Resolves a number of cert-str34-c warnings from clang-tidy.
Until these are superceded by github actions, if the github CLI tool "gh"
is installed, a github release of the maiko code can be created by running
./start-release
from the maiko/bin directory, and then running
./release-one
for each combination of OS/architecture that should be included in the
release.
The scripts assume that the maiko code is checked out in a directory
named "maiko" (and may produce unexpected results if run from somewhere else)
Co-authored-by: Nick Briggs <nicholas.h.briggs@gmail.com>
As a side-effect of this change, we also resolve a a problem with
signed file version numbers, so that instead of version 2147483647
wrapping to -2147483648 we can go as far as 4294967296 before we
have issues. Various sprintf() formats get changed from %d to %u.
The DOS version code is left behind as int versions.
The only uses of bzero() in the maiko sources come about because it is used in the macOS
definition of the FD_ZERO() macro in sys/select.h. Suppress the warning by including
-clang-analyzer-security.insecureAPI.bzero
in the clang-tidy list of checks. This may well have been replaced by a memset()
call in more up-to-date macOS releases.
* Rewrite keyboard and async I/O handling to improve performance and reduce dependency on async I/O signals
Replaces the SIGIO handler, which used to process X events in the interrupt context, with
a stub routine that sets a flag to signal processing is required.
Actual event processing is moved to the main dispatch loop where Lisp periodic interrupts
are handled.
Removes the X connection file descriptor from the set of fds contributing to SIGIO events
and moves the processing of X events to where the Lisp periodic interrupt is handled in
the main dispatch loop. This code is already guarded by a check for XPending() so can
be called regardless of whether any file descriptors are known to be ready.
Actual processing of async I/O events and X events are handled by procedures
process_io_events() and process_Xevents() respectively. For the most part these are
a renaming of getsignaldata() and getXsignaldata().
The Lisp periodic timer (VTALRM) was set to operate with a 25000 us period (40 Hz),
but on modern hardware it is possible to run this timer with a period of 10000 us (100 Hz)
Incidentally, a bug was noted (and fixed) in the X event handling code for motion events:
Mouse motion without any keyboard activity should not add an entry to the keyboard event
ring buffer as these events do not represent a key state change.
Since the ring buffer is of limited size, when it is filled new events are ignored
until the buffered events are processed. This resulted in the loss of a key/mouse button
transition (up or down) if the mouse was moved about "too much" between keyboard events.
A few incidental cleanups were also made:
- KBDEventFlg initialization fixed (wrong semantic type)
- Event_Req renamed to IO_Signalled (more appropriate name)
- int_io_open() sets up process (self) to handle SIGIO generated by O_ASYNC operations
- LOCK_X_EVENTS turned off since X library calls can no longer happen in an interrupt context
* Use of O_ASYNC must depend on the symbol being defined (looking at you, Cygwin)
* Add SA_RESTART flag to sigaction for SIGVTALRM periodic interrupt
* LOCK_X_UPDATE is no longer needed and should not be defined by default for Solaris in version.h
@@ -4,7 +4,7 @@ Maiko is the implementation of the Medley Interlisp virtual machine, for a
byte-coded Lisp instruction set and some low-level functions for
connecting with Lisp for access to display (via X11) and disk etc.
For an overview, see [Medley Interlisp Introduction](https://github.com/Interlisp/medley/wiki/Medley-Interlisp-Introduction).
For an overview, see [Medley Interlisp Introduction](https://interlisp.org/medley/using/docs/medley/).
See [the Medley repository](https://github.com/Interlisp/medley) for
* [Issues](https://github.com/Interlisp/medley/issues) (note that maiko issues are there too)
@@ -15,7 +15,7 @@ Bug reports, feature requests, fixes and improvements, support for additional pl
## Development Platforms
We are developing on FreeBSD, Linux, MacOS, and Solaris currently
We are developing on FreeBSD, Linux, macOS, and Solaris currently
on arm7l, arm64, PowerPC, SPARC, i386, and x86_64 hardware.
@@ -25,7 +25,7 @@ Building requires `clang`, `make`, X11 client libraries (`libx11-dev`). For exam
``` sh
$ sudo apt update
$ sudo apt install clang make x11dev
$ sudo apt install clang make libx11-dev
```
```
@@ -33,14 +33,14 @@ $ cd maiko/bin
$ ./makeright x
```
* The build will (attempt to) detect the OS-type and cpu-type. It will build binaries `lde` and `ldex` in `../ostype.cputype` (with .o files in `..ostype.cputype-x`. For example, Linux on a 64-bit x86 will use `linux.x86_64`, while MacOS 11 on a (new M1) Mac will use `darwin.aarch64`.
* The build will (attempt to) detect the OS-type and cpu-type. It will build binaries `lde` and `ldex` in `../ostype.cputype` (with .o files in `..ostype.cputype-x`. For example, Linux on a 64-bit x86 will use `linux.x86_64`, while macOS 11 on a (new M1) Mac will use `darwin.aarch64`.
* If you prefer using `gcc` over `clang`, you will need to edit the makefile fragment for your configuration (`makefile-ostype.cputype-x`) and comment out the line (with a #) that defines `CC` for `clang` and uncomment the line (delete the #) for the line that defines `CC` for `gcc`.
* There is a cmake configuration (TBD To Be Described here).
### Building For MacOS
### Building For macOS
* Running on MacOS requires an X server, and building on a Mac requires X client libraries.
An X-server for MacOS (and X11 client libraries) can be freely obtained at https://www.xquartz.org/releases
* Running on macOS requires an X server, and building on a Mac requires X client libraries.
An X-server for macOS (and X11 client libraries) can be freely obtained at https://www.xquartz.org/releases
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.