Skip to content

Commit

Permalink
[compiler-rt] During profile flushing, setup SIGKILL mask earlier (ll…
Browse files Browse the repository at this point in the history
…vm#68622)

In multi threaded application, it is possible for one thread to
terminate the program while another is flushing profile information. We
setup a signal mask to delay SIGKILL so that we can safely flush the
profile.

This patch setups the mask earlier: it reduces the window during which a
SIGKILL can end the computation prematurely.

This fixes https://bugzilla.mozilla.org/show_bug.cgi?id=1850940, where a
profiled firefox was encountering several:

LLVM Profile Error: Failed to write file "default_*.profraw": Broken
pipe

Co-authored-by: serge-sans-paille <[email protected]>
  • Loading branch information
serge-sans-paille and serge-sans-paille authored Oct 10, 2023
1 parent 135f57d commit 97b989b
Showing 1 changed file with 16 additions and 8 deletions.
24 changes: 16 additions & 8 deletions compiler-rt/lib/profile/InstrProfilingFile.c
Original file line number Diff line number Diff line change
Expand Up @@ -1034,10 +1034,14 @@ int __llvm_profile_write_file(void) {
int rc, Length;
const char *Filename;
char *FilenameBuf;
int PDeathSig = 0;

// Temporarily suspend getting SIGKILL when the parent exits.
int PDeathSig = lprofSuspendSigKill();

if (lprofProfileDumped() || __llvm_profile_is_continuous_mode_enabled()) {
PROF_NOTE("Profile data not written to file: %s.\n", "already written");
if (PDeathSig == 1)
lprofRestoreSigKill();
return 0;
}

Expand All @@ -1048,6 +1052,8 @@ int __llvm_profile_write_file(void) {
/* Check the filename. */
if (!Filename) {
PROF_ERR("Failed to write file : %s\n", "Filename not set");
if (PDeathSig == 1)
lprofRestoreSigKill();
return -1;
}

Expand All @@ -1057,12 +1063,11 @@ int __llvm_profile_write_file(void) {
"expected %d, but get %d\n",
INSTR_PROF_RAW_VERSION,
(int)GET_VERSION(__llvm_profile_get_version()));
if (PDeathSig == 1)
lprofRestoreSigKill();
return -1;
}

// Temporarily suspend getting SIGKILL when the parent exits.
PDeathSig = lprofSuspendSigKill();

/* Write profile data to the file. */
rc = writeFile(Filename);
if (rc)
Expand Down Expand Up @@ -1095,7 +1100,9 @@ int __llvm_orderfile_write_file(void) {
int rc, Length, LengthBeforeAppend, SuffixLength;
const char *Filename;
char *FilenameBuf;
int PDeathSig = 0;

// Temporarily suspend getting SIGKILL when the parent exits.
int PDeathSig = lprofSuspendSigKill();

SuffixLength = strlen(OrderFileSuffix);
Length = getCurFilenameLength() + SuffixLength;
Expand All @@ -1105,6 +1112,8 @@ int __llvm_orderfile_write_file(void) {
/* Check the filename. */
if (!Filename) {
PROF_ERR("Failed to write file : %s\n", "Filename not set");
if (PDeathSig == 1)
lprofRestoreSigKill();
return -1;
}

Expand All @@ -1119,12 +1128,11 @@ int __llvm_orderfile_write_file(void) {
"expected %d, but get %d\n",
INSTR_PROF_RAW_VERSION,
(int)GET_VERSION(__llvm_profile_get_version()));
if (PDeathSig == 1)
lprofRestoreSigKill();
return -1;
}

// Temporarily suspend getting SIGKILL when the parent exits.
PDeathSig = lprofSuspendSigKill();

/* Write order data to the file. */
rc = writeOrderFile(Filename);
if (rc)
Expand Down

0 comments on commit 97b989b

Please sign in to comment.