aboutsummaryrefslogtreecommitdiffstats
path: root/utils/astcanary.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/astcanary.c')
-rw-r--r--utils/astcanary.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/utils/astcanary.c b/utils/astcanary.c
index 785ec14c4..a0a295ca3 100644
--- a/utils/astcanary.c
+++ b/utils/astcanary.c
@@ -24,6 +24,7 @@
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
+#include <string.h>
/*!\brief
* At one time, canaries were carried along with coal miners down
@@ -58,6 +59,19 @@
* Asterisk itself.
*/
+const char explanation[] =
+"This file is created when Asterisk is run with a realtime priority (-p). It\n"
+"must continue to exist, and the astcanary process must be allowed to continue\n"
+"running, or else the Asterisk process will, within a short period of time,\n"
+"slow itself down to regular priority.\n\n"
+"The technical explanation for this file is to provide an assurance to Asterisk\n"
+"that there are no threads that have gone into runaway mode, thus hogging the\n"
+"CPU, and making the Asterisk machine seem to be unresponsive. When that\n"
+"happens, the astcanary process will be unable to update the timestamp on this\n"
+"file, and Asterisk will notice within 120 seconds and react. Slowing the\n"
+"Asterisk process down to regular priority will permit an administrator to\n"
+"intervene, thus avoiding a need to reboot the entire machine.\n";
+
int main(int argc, char *argv[])
{
int fd;
@@ -67,10 +81,12 @@ int main(int argc, char *argv[])
/* Update the modification times (checked from Asterisk) */
if (utime(argv[1], NULL)) {
/* Recreate the file if it doesn't exist */
- if ((fd = open(argv[1], O_RDWR | O_TRUNC | O_CREAT, 0777)) > -1)
+ if ((fd = open(argv[1], O_RDWR | O_TRUNC | O_CREAT, 0777)) > -1) {
+ write(fd, explanation, strlen(explanation));
close(fd);
- else
+ } else {
exit(1);
+ }
continue;
}