common/recipes-lib/ras/files/obmc-ras.c (56 lines of code) (raw):
#include "obmc-ras.h"
#include <assert.h>
#include <pthread.h>
#include <syslog.h>
struct delayed_log {
useconds_t usec;
char msg[1024];
};
// Thread for delay event
static void *
delay_log(void *arg)
{
struct delayed_log* log = (struct delayed_log*)arg;
pthread_detach(pthread_self());
if (arg) {
usleep(log->usec);
syslog(LOG_CRIT, "%s", log->msg);
free(arg);
}
pthread_exit(NULL);
}
void __attribute__((weak))
log_gpio_change(gpiopoll_pin_t *gp, gpio_value_t value, useconds_t log_delay, bool active_low)
{
const struct gpiopoll_config *cfg = gpio_poll_get_config(gp);
assert(cfg);
if (log_delay == 0) {
if (active_low)
syslog(LOG_CRIT, "%s: %s - %s\n", value ? "DEASSERT": "ASSERT", cfg->description, cfg->shadow);
else
syslog(LOG_CRIT, "%s: %s - %s\n", value ? "ASSERT": "DEASSERT", cfg->description, cfg->shadow);
} else {
pthread_t tid_delay_log;
struct delayed_log *log = (struct delayed_log *)malloc(sizeof(struct delayed_log));
if (log) {
log->usec = log_delay;
snprintf(log->msg, 1024, "%s: %s - %s\n", value ? "DEASSERT" : "ASSERT", cfg->description, cfg->shadow);
if (pthread_create(&tid_delay_log, NULL, delay_log, (void *)log)) {
free(log);
log = NULL;
}
}
if (!log) {
syslog(LOG_CRIT, "%s: %s - %s\n", value ? "DEASSERT": "ASSERT", cfg->description, cfg->shadow);
}
}
}
void __attribute__((weak))
fast_prochot_hndlr(gpiopoll_pin_t *gp, gpio_value_t last, gpio_value_t curr) {
log_gpio_change(gp, curr, 0, true);
}
void __attribute__((weak))
fast_prochot_init(gpiopoll_pin_t *gp, gpio_value_t value)
{
if (value == GPIO_VALUE_LOW)
log_gpio_change(gp, value, 0, true);
}