Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes deadloop when abort is called in CI #5197

Merged
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
7 changes: 7 additions & 0 deletions docs/05.PORT-API.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,13 @@

It is questionable whether a library should be able to terminate an application. Any API function can signal an error (ex.: cannot allocate memory), so the engine use the termination approach with this port function.

```c
/**
* Init the program
*/
void jerry_port_init (void);
```

```c
/**
* Signal the port that jerry experienced a fatal failure from which it cannot
Expand Down
1 change: 1 addition & 0 deletions jerry-core/api/jerryscript.c
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ jerry_return (const jerry_value_t value) /**< return value */
void
jerry_init (jerry_init_flag_t flags) /**< combination of Jerry flags */
{
jerry_port_init ();
#if JERRY_EXTERNAL_CONTEXT
size_t total_size = jerry_port_context_alloc (sizeof (jerry_context_t));
JERRY_UNUSED (total_size);
Expand Down
5 changes: 5 additions & 0 deletions jerry-core/include/jerryscript-port.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ typedef enum
JERRY_FATAL_FAILED_ASSERTION = 120 /**< Assertion failed */
} jerry_fatal_code_t;

/**
* Init the program
*/
void jerry_port_init (void);

/**
* Signal the port that the process experienced a fatal failure from which it cannot
* recover.
Expand Down
12 changes: 12 additions & 0 deletions jerry-port/common/jerry-port-process.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,18 @@

#include "jerryscript-port.h"

#if !defined(_WIN32)

/**
* Default implementation of jerry_port_init. Do nothing.
*/
void JERRY_ATTR_WEAK
jerry_port_init (void)
{
} /* jerry_port_init */

#endif /* !defined(_WIN32) */

/**
* Default implementation of jerry_port_fatal. Calls 'abort' if exit code is
* non-zero, 'exit' otherwise.
Expand Down
62 changes: 62 additions & 0 deletions jerry-port/win/jerry-port-win-process.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,68 @@

#include <windows.h>

#include <crtdbg.h>
#include <stdio.h>

void
jerry_port_init (void)
{
if (!IsDebuggerPresent ())
{
/* Make output streams unbuffered by default */
setvbuf (stdout, NULL, _IONBF, 0);
setvbuf (stderr, NULL, _IONBF, 0);

/*
* By default abort() only generates a crash-dump in *non* debug
* builds. As our Assert() / ExceptionalCondition() uses abort(),
* leaving the default in place would make debugging harder.
*
* MINGW's own C runtime doesn't have _set_abort_behavior(). When
* targeting Microsoft's UCRT with mingw, it never links to the debug
* version of the library and thus doesn't need the call to
* _set_abort_behavior() either.
*/
#if !defined(__MINGW32__) && !defined(__MINGW64__)
_set_abort_behavior (_CALL_REPORTFAULT | _WRITE_ABORT_MSG, _CALL_REPORTFAULT | _WRITE_ABORT_MSG);
#endif /* !defined(__MINGW32__) && !defined(__MINGW64__) */

/*
* SEM_FAILCRITICALERRORS causes more errors to be reported to
* callers.
*
* We used to also specify SEM_NOGPFAULTERRORBOX, but that prevents
* windows crash reporting from working. Which includes registered
* just-in-time debuggers, making it unnecessarily hard to debug
* problems on windows. Now we try to disable sources of popups
* separately below (note that SEM_NOGPFAULTERRORBOX did not actually
* prevent all sources of such popups).
*/
SetErrorMode (SEM_FAILCRITICALERRORS);

/*
* Show errors on stderr instead of popup box (note this doesn't
* affect errors originating in the C runtime, see below).
*/
_set_error_mode (_OUT_TO_STDERR);

/*
* In DEBUG builds, errors, including assertions, C runtime errors are
* reported via _CrtDbgReport. By default such errors are displayed
* with a popup (even with NOGPFAULTERRORBOX), preventing forward
* progress. Instead report such errors stderr (and the debugger).
* This is C runtime specific and thus the above incantations aren't
* sufficient to suppress these popups.
*/
_CrtSetReportMode (_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
_CrtSetReportFile (_CRT_ERROR, _CRTDBG_FILE_STDERR);
_CrtSetReportMode (_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
_CrtSetReportFile (_CRT_ASSERT, _CRTDBG_FILE_STDERR);
_CrtSetReportMode (_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
_CrtSetReportFile (_CRT_WARN, _CRTDBG_FILE_STDERR);
}
} /* jerry_port_init */

/**
* Default implementation of jerry_port_sleep, uses 'Sleep'.
*/
Expand Down
Loading