Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ name: CI
on:
push:
branches:
- boilerplate
- master
- dev
- boilerplate
- idiomatic
- master
- rc1
- rc2
- rc3
Expand Down
70 changes: 70 additions & 0 deletions .vimrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
" Synesis C/C++ project .vimrc — aligned with .sis/.vscode/c_cxx/settings.json

set nocompatible
filetype indent plugin on
syntax enable
set autoindent
set backspace=indent,eol,start
set hlsearch
set incsearch
set number

" files.insertFinalNewline
set eol
set fixeol

" editor.renderWhitespace: all
set list
set listchars=tab:->,trail:-,extends:>,precedes:<,nbsp:+

" editor.detectIndentation: false — global defaults (editor.tabSize: 4, insertSpaces: true)
set colorcolumn=76
set expandtab
set shiftwidth=4
set softtabstop=4
set tabstop=4

" colorcolumn draws a full-column tint in Vim (not a VS Code-style 1px line).
" Keep it subtle via the ColorColumn highlight group; reapply after colorscheme changes.
if has('termguicolors')
" set termguicolors
endif

function! s:ConfigureColorColumn() abort
highlight ColorColumn ctermbg=236 guibg=#2a2a2a cterm=NONE gui=NONE
endfunction

call s:ConfigureColorColumn()
autocmd ColorScheme * call s:ConfigureColorColumn()

" files.trimTrailingWhitespace
autocmd BufWritePre * %s/\s\+$//e

augroup sis_c_cxx
autocmd!

" [c] / [cpp]
autocmd FileType c,cpp setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4 colorcolumn=60,64,68,72,76

" [rust]
autocmd FileType rs setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4 colorcolumn=76

" [cmake]
autocmd FileType cmake setlocal noexpandtab tabstop=4 shiftwidth=4 softtabstop=4

" [shellscript]
autocmd FileType sh,bash,zsh setlocal expandtab tabstop=2 shiftwidth=2 softtabstop=2 colorcolumn=60,76

" [bat]
autocmd FileType bat,dosbatch setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4 colorcolumn=60,76

" [json] / [markdown] / [yaml] / [ruby]
autocmd FileType json,markdown,yaml,ruby setlocal expandtab tabstop=2 shiftwidth=2 softtabstop=2

" [python]
autocmd FileType python setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4 colorcolumn=60,76

" [toml]
autocmd FileType toml setlocal noexpandtab tabstop=2 shiftwidth=2 softtabstop=2
augroup END

9 changes: 9 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
# Pantheios.Extras.AtExit - Changes <!-- omit in toc -->


## 0.1.2-alpha1 - 21st August 2026

* Modernised library version macros to computed `PANTHEIOS_EXTRAS_ATEXIT_VER` (`VER_MAJOR` / `VER_MINOR` / `VER_PATCH` / `VER_ALPHABETA`, with `VER_REVISION` alias) targeting **0.1.2-alpha1**;
* Added **ctest_cmake.sh** and **run_all_unit_tests.cmd**;
* Ensured C/C++ sources end with a blank line after the end-of-file marker, and used `char* argv[]` in the unit-test `main`;
* Renamed the scratch program implementation to **main.c**;
* Recorded functionality-review items in **TODO.md**; deferred applying them, and deferred the helper **MSYSTEM**/MinGW rewrite until the **HELPER-SCRIPTS-C-CXX.md** contract is frozen;


## 0.1.1 - 16th August 2026

* Recovered **Pantheios.Extras.AtExit** from Hautacam (`pantheios/extras/AtExit/0.1`, Created 30th December 2011) as a nested compiled C library;
Expand Down
1 change: 1 addition & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

| Date | News Item |
| ---------------- | -------------------------------------------------------------------------------- |
| 21st August 2026 | Pantheios.Extras.AtExit 0.1.2-alpha1 |
| 16th August 2026 | Pantheios.Extras.AtExit 0.1.1 recovered and released |


Expand Down
27 changes: 26 additions & 1 deletion TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,30 @@

## Functional improvements


### High

* [ ] Document (and optionally enforce) **`add` after `uninit`**: the libc `atexit` hook stays registered, so later **`add`** callbacks still run at process exit; docs currently imply the hook is a permanent no-op after drain;
* [ ] Document (or change) drain-while-locked: callbacks run under the spinlock, so a callback that calls **`add`** / **`uninit`** deadlocks; either forbid re-entrancy or copy the list, unlock, then invoke;


### Medium

* [ ] Serialise **`init`**: `s_initialised` is a plain `int` and `init` is not under the lock, so two threads can register two `atexit` hooks;
* [ ] Align **`reserved0`** / **`reserved1`**: header says they must be `NULL` / `0`, but the implementation ignores them — `assert` or drop the requirement;
* [ ] Stop treating **`atexit()`** failure as an `errno` / **`strerror()`** code; `EBUSY` / `ENOMEM` are errno values, `atexit` failure often is not;


### Low

* [ ] Document **`add` without `init`**: the list grows, but process exit will not drain it unless **`uninit`** is called;
* [ ] Initialise C11 `atomic_int s_mx` with **`ATOMIC_VAR_INIT(0)`** if compilers warn on `= 0`;
* [ ] Tests: **`add`** without **`init`** then **`uninit`**; **`add`** after **`uninit`**; version-macro unit test; keep process-exit coverage as scratch (or one automated case);
* [ ] Example: check **`add`** return values;


### Enhancements

* [ ] C++ RAII / `scope` wrapper;
* [ ] Unix-only pthread synchronisation scratch (with a Windows equivalent if revived);

Expand All @@ -14,7 +38,8 @@

## Packaging improvements

* \<none>
* [ ] Defer rewriting helper `MSYSTEM` → `mingw32-make` / MinGW-generator detection until the **HELPER-SCRIPTS-C-CXX.md** contract is frozen (same defect class as other Synesis C/C++ helpers);
* [ ] Split the unit-test implementation from its entry TU (then name the entry **entry.c**); until then keep the single-file **test.unit.atexit.api.c**;


<!-- ########################### end of file ########################### -->
108 changes: 108 additions & 0 deletions ctest_cmake.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
#! /bin/bash

ScriptPath=$0
Dir=$(cd $(dirname "$ScriptPath"); pwd)
Basename=$(basename "$ScriptPath")
CMakeDir=${SIS_CMAKE_BUILD_DIR:-$Dir/_build}
[[ -n "$MSYSTEM" ]] && DefaultMakeCmd=mingw32-make.exe || DefaultMakeCmd=make
MakeCmd=${SIS_CMAKE_MAKE_COMMAND:-${SIS_CMAKE_COMMAND:-$DefaultMakeCmd}}
ProjectNameFile="$Dir/.sis/project_name.txt"
ProjectName=$(tr -d '[:space:]' < "$ProjectNameFile")

CMakeVerbose=
RunMake=1


# ##########################################################
# command-line handling

while [[ $# -gt 0 ]]; do

case $1 in
--no-make|-M)

RunMake=0
;;
--verbose|-V)

CMakeVerbose=--verbose
;;
--help)

[ -f "$Dir/.sis/script_info_lines.txt" ] && cat "$Dir/.sis/script_info_lines.txt"
cat << EOF
Runs CMake's CTest test program(s)

$ScriptPath [ ... flags/options ... ]

Flags/options:

behaviour:

-M
--no-make
does not execute CMake and make before running tests

-V
--verbose
verbose test output


standard flags:

--help
displays this help and terminates

EOF

exit 0
;;
*)

>&2 echo "$ScriptPath: unrecognised argument '$1'; use --help for usage"

exit 1
;;
esac

shift
done


# ##########################################################
# main()

status=0

if [ $RunMake -ne 0 ]; then

echo "Executing build for ${ProjectName} (via command \`$MakeCmd\`) and then running all component and unit test programs"

mkdir -p $CMakeDir || exit 1

cd $CMakeDir

$MakeCmd
status=$?

cd ->/dev/null
else

if [ ! -d "$CMakeDir" ] || [ ! -f "$CMakeDir/CMakeCache.txt" ] || [ ! -d "$CMakeDir/CMakeFiles" ]; then

>&2 echo "$ScriptPath: cannot run in '--no-make' mode without a previous successful build step"
fi
fi

if [ $status -eq 0 ]; then

echo "Running CMake tests"

ctest --test-dir $CMakeDir $CMakeVerbose
status=$?
fi

exit $status


# ############################## end of file ############################# #
11 changes: 10 additions & 1 deletion examples/c/example.c.1/example.c.1.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,18 @@ main(void)

if (0 != r)
{
#ifdef _MSC_VER
char error_message[256];

strerror_s(error_message, sizeof(error_message), r);
#else
char const* error_message = strerror(r);
#endif

fprintf(
stderr
, "failed to initialise Pantheios.Extras.AtExit : %s (%d)\n"
, strerror(r)
, error_message
, r
);

Expand All @@ -60,3 +68,4 @@ main(void)


/* ///////////////////////////// end of file //////////////////////////// */

7 changes: 4 additions & 3 deletions include/pantheios/extras/atexit.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* Purpose: Main C header for the Pantheios.Extras.AtExit library.
*
* Created: 30th December 2011
* Updated: 16th August 2026
* Updated: 21st August 2026
*
* Home: http://www.pantheios.org/
*
Expand Down Expand Up @@ -55,8 +55,8 @@
#ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
# define PANTHEIOS_EXTRAS_ATEXIT_VER_PANTHEIOS_EXTRAS_H_ATEXIT_MAJOR 1
# define PANTHEIOS_EXTRAS_ATEXIT_VER_PANTHEIOS_EXTRAS_H_ATEXIT_MINOR 0
# define PANTHEIOS_EXTRAS_ATEXIT_VER_PANTHEIOS_EXTRAS_H_ATEXIT_REVISION 3
# define PANTHEIOS_EXTRAS_ATEXIT_VER_PANTHEIOS_EXTRAS_H_ATEXIT_EDIT 4
# define PANTHEIOS_EXTRAS_ATEXIT_VER_PANTHEIOS_EXTRAS_H_ATEXIT_REVISION 4
# define PANTHEIOS_EXTRAS_ATEXIT_VER_PANTHEIOS_EXTRAS_H_ATEXIT_EDIT 5
#endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */

/* /////////////////////////////////////////////////////////////////////////
Expand All @@ -76,3 +76,4 @@
#endif /* !PANTHEIOS_EXTRAS_ATEXIT_INCL_PANTHEIOS_EXTRAS_H_ATEXIT */

/* ///////////////////////////// end of file //////////////////////////// */

37 changes: 29 additions & 8 deletions include/pantheios/extras/atexit/atexit.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* Purpose: Header file for Pantheios.Extras.AtExit.
*
* Created: 30th December 2011
* Updated: 16th August 2026
* Updated: 21st August 2026
*
* Home: http://www.pantheios.org/
*
Expand Down Expand Up @@ -54,9 +54,9 @@

#ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
# define PANTHEIOS_EXTRAS_ATEXIT_VER_PANTHEIOS_EXTRAS_ATEXIT_H_ATEXIT_MAJOR 1
# define PANTHEIOS_EXTRAS_ATEXIT_VER_PANTHEIOS_EXTRAS_ATEXIT_H_ATEXIT_MINOR 1
# define PANTHEIOS_EXTRAS_ATEXIT_VER_PANTHEIOS_EXTRAS_ATEXIT_H_ATEXIT_REVISION 1
# define PANTHEIOS_EXTRAS_ATEXIT_VER_PANTHEIOS_EXTRAS_ATEXIT_H_ATEXIT_EDIT 5
# define PANTHEIOS_EXTRAS_ATEXIT_VER_PANTHEIOS_EXTRAS_ATEXIT_H_ATEXIT_MINOR 2
# define PANTHEIOS_EXTRAS_ATEXIT_VER_PANTHEIOS_EXTRAS_ATEXIT_H_ATEXIT_REVISION 0
# define PANTHEIOS_EXTRAS_ATEXIT_VER_PANTHEIOS_EXTRAS_ATEXIT_H_ATEXIT_EDIT 6
#endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */

/** \def PANTHEIOS_EXTRAS_ATEXIT_VER_MAJOR
Expand All @@ -67,23 +67,43 @@
* The minor version number of Pantheios.Extras.AtExit
*/

/** \def PANTHEIOS_EXTRAS_ATEXIT_VER_REVISION
* The revision version number of Pantheios.Extras.AtExit
/** \def PANTHEIOS_EXTRAS_ATEXIT_VER_PATCH
* The patch version number of Pantheios.Extras.AtExit
*/

/** \def PANTHEIOS_EXTRAS_ATEXIT_VER_ALPHABETA
* The alpha/beta designator of Pantheios.Extras.AtExit, or 0xFF for a
* non-prerelease
*/

/** \def PANTHEIOS_EXTRAS_ATEXIT_VER
* The current composite version number of Pantheios.Extras.AtExit
*/

/** \def PANTHEIOS_EXTRAS_ATEXIT_VER_REVISION
* Alias of PANTHEIOS_EXTRAS_ATEXIT_VER_PATCH (for CMake scrapers / older
* consumers)
*/

#ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION
# define PANTHEIOS_EXTRAS_ATEXIT_VER_0_1_1 0x000101ff
# define PANTHEIOS_EXTRAS_ATEXIT_VER_0_1_2_ALPHA_1 0x00010241
#endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */

#define PANTHEIOS_EXTRAS_ATEXIT_VER_MAJOR 0
#define PANTHEIOS_EXTRAS_ATEXIT_VER_MINOR 1
#define PANTHEIOS_EXTRAS_ATEXIT_VER_REVISION 1
#define PANTHEIOS_EXTRAS_ATEXIT_VER_PATCH 2
#define PANTHEIOS_EXTRAS_ATEXIT_VER_ALPHABETA 0x41

#define PANTHEIOS_EXTRAS_ATEXIT_VER PANTHEIOS_EXTRAS_ATEXIT_VER_0_1_1
#define PANTHEIOS_EXTRAS_ATEXIT_VER \
(0\
| ( PANTHEIOS_EXTRAS_ATEXIT_VER_MAJOR << 24 ) \
| ( PANTHEIOS_EXTRAS_ATEXIT_VER_MINOR << 16 ) \
| ( PANTHEIOS_EXTRAS_ATEXIT_VER_PATCH << 8 ) \
| ( PANTHEIOS_EXTRAS_ATEXIT_VER_ALPHABETA << 0 ) \
)

#define PANTHEIOS_EXTRAS_ATEXIT_VER_REVISION PANTHEIOS_EXTRAS_ATEXIT_VER_PATCH

#ifdef __cplusplus
extern "C" {
Expand Down Expand Up @@ -165,3 +185,4 @@ pantheios_extras_atexit_add(
#endif /* !PANTHEIOS_EXTRAS_ATEXIT_INCL_PANTHEIOS_EXTRAS_ATEXIT_H_ATEXIT */

/* ///////////////////////////// end of file //////////////////////////// */

Loading
Loading