)]}'
{
  "commit": "1f742045ed65fc0799422b2e186181d196193f14",
  "tree": "8d77bb459180e5fd821291f00d6334baa65dc855",
  "parents": [
    "2262488410e53e28e348b80fc672c3548691f2d0"
  ],
  "author": {
    "name": "LIU Hao",
    "email": "lh_mouse@126.com",
    "time": "Sat Oct 22 23:31:33 2022 +0800"
  },
  "committer": {
    "name": "LIU Hao",
    "email": "lh_mouse@126.com",
    "time": "Sun Dec 04 21:27:14 2022 +0800"
  },
  "message": "crt: Implement standard-conforming termination support with mcfgthread\n\nThis commit implements these functions in accordance with the ISO C\nstandard and the Itanium C++ ABI (except for `atexit()` which behaves\nin a per-module way like its old behavior, and also on Linux):\n\n  * `atexit()`, C89\n  * `exit()`, C89\n  * `__cxa_atexit()`, Itanium C++ ABI\n  * `_exit()`, POSIX\n  * `_Exit()`, C99\n  * `at_quick_exit()`, C99\n  * `quick_exit()`, C99\n  * `__cxa_at_quick_exit()`, GNU extension\n\nImplementation details:\n\n  1. An object with the name `__dso_handle` is defined for each\n     module (EXE or DLL).\n  2. Per-module cleanup callbacks should be registered with\n     `__MCF_cxa_atexit()` or `__MCF_cxa_at_quick_exit()`, passing\n     `\u0026__dso_handle` as its third argument.\n  3. When a process calls `exit()` or returns from `main()`,\n     `__MCF_cxa_finalize(NULL)` is called, which executes all\n     callbacks registered with `__MCF_cxa_atexit()` in reverse\n     order.\n  4. When a DLL is unloaded neither by calling `exit()` nor by\n     returning from `main()` (in other words, by `FreeLibrary()`),\n     `__MCF_cxa_finalize(\u0026__dso_handle)`, which executes all\n     callbacks registered with `__MCF_cxa_atexit()` with the same\n     DSO handle in reverse order. Callbacks that have been\n     registered with `__MCF_cxa_at_quick_exit()` are deleted.\n  5. All standard I/O streams are flushed before the process\n     terminates.\n\nSigned-off-by: LIU Hao \u003clh_mouse@126.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "08cd5922a8497cba5ae220b26bea5b00061ff1f5",
      "old_mode": 33188,
      "old_path": "mingw-w64-crt/crt/crtdll.c",
      "new_id": "a90a7f5ff5443fb48814d32c72430195744088ca",
      "new_mode": 33188,
      "new_path": "mingw-w64-crt/crt/crtdll.c"
    },
    {
      "type": "modify",
      "old_id": "1656b0ee00062c835356af9c901891158bdb8d6a",
      "old_mode": 33188,
      "old_path": "mingw-w64-crt/crt/crtexe.c",
      "new_id": "e0b02a870578825ec79719baee713b040766e5c0",
      "new_mode": 33188,
      "new_path": "mingw-w64-crt/crt/crtexe.c"
    },
    {
      "type": "modify",
      "old_id": "256c26d07611338bb1cf71301aa33a6d0c3d170c",
      "old_mode": 33188,
      "old_path": "mingw-w64-crt/crt/exit_wrappers.c",
      "new_id": "ab6896f964df010ea75dd97541dd5aeed94e5d62",
      "new_mode": 33188,
      "new_path": "mingw-w64-crt/crt/exit_wrappers.c"
    },
    {
      "type": "modify",
      "old_id": "f39731ad76f3a07be34432132d9139702e844cca",
      "old_mode": 33188,
      "old_path": "mingw-w64-crt/crt/tls_atexit.c",
      "new_id": "0b8f83a4cfb19bd960469b4f689c3460bf45203c",
      "new_mode": 33188,
      "new_path": "mingw-w64-crt/crt/tls_atexit.c"
    },
    {
      "type": "modify",
      "old_id": "112d8e3c7de69bab39f200bd401a50d9c1262944",
      "old_mode": 33188,
      "old_path": "mingw-w64-crt/crt/ucrt_exit_wrappers.c",
      "new_id": "4ef52a68733e030d3d17e0905ce6f601fa961823",
      "new_mode": 33188,
      "new_path": "mingw-w64-crt/crt/ucrt_exit_wrappers.c"
    },
    {
      "type": "modify",
      "old_id": "02910ff2f4d8ff737bbac197328af0179191ce6d",
      "old_mode": 33188,
      "old_path": "mingw-w64-crt/crt/ucrtbase_compat.c",
      "new_id": "52c22d62ec10dbf39c86f97c044464e8689d9aa5",
      "new_mode": 33188,
      "new_path": "mingw-w64-crt/crt/ucrtbase_compat.c"
    }
  ]
}
