X-Git-Url: https://git.octo.it/?p=collectd.git;a=blobdiff_plain;f=src%2Fmcelog.c;h=4e514004a6261995a3285810b76ce923a74555b1;hp=928db1cb6d5cd7546dd3e34e51195ba91e1eaeea;hb=06a86a60a7dabc685bdbd81ce3d36ea5f7e2c2d4;hpb=49d05d53d4c88895a1ff454000d65b6acabdbb99 diff --git a/src/mcelog.c b/src/mcelog.c index 928db1cb..4e514004 100644 --- a/src/mcelog.c +++ b/src/mcelog.c @@ -2,7 +2,7 @@ * collectd - src/mcelog.c * MIT License * - * Copyright(c) 2016 Intel Corporation. All rights reserved. + * Copyright(c) 2016-2017 Intel Corporation. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -46,15 +46,17 @@ #define MCELOG_DIMM_NAME "DMI_NAME" #define MCELOG_CORRECTED_ERR "corrected memory errors" #define MCELOG_UNCORRECTED_ERR "uncorrected memory errors" +#define MCELOG_CORRECTED_ERR_TIMED "corrected memory timed errors" +#define MCELOG_UNCORRECTED_ERR_TIMED "uncorrected memory timed errors" #define MCELOG_CORRECTED_ERR_TYPE_INS "corrected_memory_errors" #define MCELOG_UNCORRECTED_ERR_TYPE_INS "uncorrected_memory_errors" typedef struct mcelog_config_s { - char logfile[PATH_MAX]; /* mcelog logfile */ - pthread_t tid; /* poll thread id */ - llist_t *dimms_list; /* DIMMs list */ - /* lock for dimms cache */ - pthread_mutex_t dimms_lock; + char logfile[PATH_MAX]; /* mcelog logfile */ + pthread_t tid; /* poll thread id */ + llist_t *dimms_list; /* DIMMs list */ + pthread_mutex_t dimms_lock; /* lock for dimms cache */ + bool persist; } mcelog_config_t; typedef struct socket_adapter_s socket_adapter_t; @@ -73,12 +75,12 @@ struct socket_adapter_s { typedef struct mcelog_memory_rec_s { int corrected_err_total; /* x total*/ int corrected_err_timed; /* x in 24h*/ - char corrected_err_timed_period[DATA_MAX_NAME_LEN]; + char corrected_err_timed_period[DATA_MAX_NAME_LEN / 2]; int uncorrected_err_total; /* x total*/ int uncorrected_err_timed; /* x in 24h*/ - char uncorrected_err_timed_period[DATA_MAX_NAME_LEN]; - char location[DATA_MAX_NAME_LEN]; /* SOCKET x CHANNEL x DIMM x*/ - char dimm_name[DATA_MAX_NAME_LEN]; /* DMI_NAME "DIMM_F1" */ + char uncorrected_err_timed_period[DATA_MAX_NAME_LEN / 2]; + char location[DATA_MAX_NAME_LEN / 2]; /* SOCKET x CHANNEL x DIMM x*/ + char dimm_name[DATA_MAX_NAME_LEN / 2]; /* DMI_NAME "DIMM_F1" */ } mcelog_memory_rec_t; static int socket_close(socket_adapter_t *self); @@ -88,7 +90,7 @@ static int socket_reinit(socket_adapter_t *self); static int socket_receive(socket_adapter_t *self, FILE **p_file); static mcelog_config_t g_mcelog_config = { - .logfile = "/var/log/mcelog", + .logfile = "/var/log/mcelog", .persist = false, }; static socket_adapter_t socket_adapter = { @@ -104,7 +106,8 @@ static socket_adapter_t socket_adapter = { .receive = socket_receive, }; -static _Bool mcelog_thread_running; +static bool mcelog_thread_running; +static bool mcelog_apply_defaults; static void mcelog_free_dimms_list_records(llist_t *dimms_list) { @@ -112,18 +115,6 @@ static void mcelog_free_dimms_list_records(llist_t *dimms_list) { sfree(e->key); sfree(e->value); } - -} - -static llentry_t *mcelog_get_dimm(const char *name, llist_t *dimms_list) { - if (dimms_list == NULL) - return NULL; - - llentry_t *le = llist_search(g_mcelog_config.dimms_list, name); - if (le != NULL) - return le; - - return NULL; } /* Create or get dimm by dimm name/location */ @@ -133,36 +124,40 @@ static llentry_t *mcelog_dimm(const mcelog_memory_rec_t *rec, char dimm_name[DATA_MAX_NAME_LEN]; if (strlen(rec->dimm_name) > 0) { - ssnprintf(dimm_name, sizeof(dimm_name), "%s_%s", rec->location, - rec->dimm_name); + snprintf(dimm_name, sizeof(dimm_name), "%s_%s", rec->location, + rec->dimm_name); } else sstrncpy(dimm_name, rec->location, sizeof(dimm_name)); - llentry_t *dimm_le = mcelog_get_dimm(dimm_name, dimms_list); + llentry_t *dimm_le = llist_search(g_mcelog_config.dimms_list, dimm_name); - if (dimm_le == NULL) { - mcelog_memory_rec_t *dimm_mr = - (mcelog_memory_rec_t *)calloc(1, sizeof(mcelog_memory_rec_t)); - if (!dimm_mr) { - ERROR(MCELOG_PLUGIN ": Error allocating dimm memory item"); - return NULL; - } - char *p_name = strdup(dimm_name); - if (p_name == NULL) { - ERROR(MCELOG_PLUGIN ": strdup: error"); - return NULL; - } + if (dimm_le != NULL) + return dimm_le; - /* add new dimm */ - dimm_le = llentry_create(p_name, dimm_mr); - if (dimm_le == NULL) { - ERROR(MCELOG_PLUGIN ": llentry_create(): error"); - return NULL; - } - pthread_mutex_lock(&g_mcelog_config.dimms_lock); - llist_append(g_mcelog_config.dimms_list, dimm_le); - pthread_mutex_unlock(&g_mcelog_config.dimms_lock); + /* allocate new linked list entry */ + mcelog_memory_rec_t *dimm_mr = calloc(1, sizeof(*dimm_mr)); + if (dimm_mr == NULL) { + ERROR(MCELOG_PLUGIN ": Error allocating dimm memory item"); + return NULL; } + char *p_name = strdup(dimm_name); + if (p_name == NULL) { + ERROR(MCELOG_PLUGIN ": strdup: error"); + free(dimm_mr); + return NULL; + } + + /* add new dimm */ + dimm_le = llentry_create(p_name, dimm_mr); + if (dimm_le == NULL) { + ERROR(MCELOG_PLUGIN ": llentry_create(): error"); + free(dimm_mr); + free(p_name); + return NULL; + } + pthread_mutex_lock(&g_mcelog_config.dimms_lock); + llist_append(g_mcelog_config.dimms_list, dimm_le); + pthread_mutex_unlock(&g_mcelog_config.dimms_lock); return dimm_le; } @@ -172,64 +167,97 @@ static void mcelog_update_dimm_stats(llentry_t *dimm, pthread_mutex_lock(&g_mcelog_config.dimms_lock); memcpy(dimm->value, rec, sizeof(mcelog_memory_rec_t)); pthread_mutex_unlock(&g_mcelog_config.dimms_lock); - } static int mcelog_config(oconfig_item_t *ci) { + int use_logfile = 0, use_memory = 0; for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; - if (strcasecmp("McelogClientSocket", child->key) == 0) { - if (cf_util_get_string_buffer(child, socket_adapter.unix_sock.sun_path, - sizeof(socket_adapter.unix_sock.sun_path)) < - 0) { - ERROR(MCELOG_PLUGIN ": Invalid configuration option: \"%s\".", + if (strcasecmp("McelogLogfile", child->key) == 0) { + use_logfile = 1; + if (use_memory) { + ERROR(MCELOG_PLUGIN ": Invalid configuration option: \"%s\", Memory " + "option is already configured.", child->key); - return (-1); + return -1; } - } else if (strcasecmp("McelogLogfile", child->key) == 0) { if (cf_util_get_string_buffer(child, g_mcelog_config.logfile, sizeof(g_mcelog_config.logfile)) < 0) { ERROR(MCELOG_PLUGIN ": Invalid configuration option: \"%s\".", child->key); - return (-1); + return -1; } + memset(socket_adapter.unix_sock.sun_path, 0, + sizeof(socket_adapter.unix_sock.sun_path)); + } else if (strcasecmp("Memory", child->key) == 0) { + if (use_logfile) { + ERROR(MCELOG_PLUGIN ": Invalid configuration option: \"%s\", Logfile " + "option is already configured.", + child->key); + return -1; + } + use_memory = 1; + for (int j = 0; j < child->children_num; j++) { + oconfig_item_t *mem_child = child->children + j; + if (strcasecmp("McelogClientSocket", mem_child->key) == 0) { + if (cf_util_get_string_buffer( + mem_child, socket_adapter.unix_sock.sun_path, + sizeof(socket_adapter.unix_sock.sun_path)) < 0) { + ERROR(MCELOG_PLUGIN ": Invalid configuration option: \"%s\".", + mem_child->key); + return -1; + } + } else if (strcasecmp("PersistentNotification", mem_child->key) == 0) { + if (cf_util_get_boolean(mem_child, &g_mcelog_config.persist) < 0) { + ERROR(MCELOG_PLUGIN ": Invalid configuration option: \"%s\".", + mem_child->key); + return -1; + } + } else { + ERROR(MCELOG_PLUGIN ": Invalid Memory configuration option: \"%s\".", + mem_child->key); + return -1; + } + } + memset(g_mcelog_config.logfile, 0, sizeof(g_mcelog_config.logfile)); } else { ERROR(MCELOG_PLUGIN ": Invalid configuration option: \"%s\".", child->key); - return (-1); + return -1; } } - return (0); + + if (!use_logfile && !use_memory) + mcelog_apply_defaults = 1; + + return 0; } static int socket_close(socket_adapter_t *self) { int ret = 0; pthread_rwlock_rdlock(&self->lock); if (fcntl(self->sock_fd, F_GETFL) != -1) { - char errbuf[MCELOG_BUFF_SIZE]; if (shutdown(self->sock_fd, SHUT_RDWR) != 0) { - ERROR(MCELOG_PLUGIN ": Socket shutdown failed: %s", - sstrerror(errno, errbuf, sizeof(errbuf))); + ERROR(MCELOG_PLUGIN ": Socket shutdown failed: %s", STRERRNO); ret = -1; } if (close(self->sock_fd) != 0) { - ERROR(MCELOG_PLUGIN ": Socket close failed: %s", - sstrerror(errno, errbuf, sizeof(errbuf))); + ERROR(MCELOG_PLUGIN ": Socket close failed: %s", STRERRNO); ret = -1; } } pthread_rwlock_unlock(&self->lock); - return (ret); + return ret; } static int socket_write(socket_adapter_t *self, const char *msg, const size_t len) { int ret = 0; pthread_rwlock_rdlock(&self->lock); - if (swrite(self->sock_fd, msg, len) < 0) + if (swrite(self->sock_fd, msg, len) != 0) ret = -1; pthread_rwlock_unlock(&self->lock); - return (ret); + return ret; } static void mcelog_dispatch_notification(notification_t *n) { @@ -246,7 +274,6 @@ static void mcelog_dispatch_notification(notification_t *n) { } static int socket_reinit(socket_adapter_t *self) { - char errbuff[MCELOG_BUFF_SIZE]; int ret = -1; cdtime_t interval = plugin_get_interval(); struct timeval socket_timeout = CDTIME_T_TO_TIMEVAL(interval); @@ -256,10 +283,9 @@ static int socket_reinit(socket_adapter_t *self) { self->sock_fd = socket(PF_UNIX, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0); if (self->sock_fd < 0) { - ERROR(MCELOG_PLUGIN ": Could not create a socket. %s", - sstrerror(errno, errbuff, sizeof(errbuff))); + ERROR(MCELOG_PLUGIN ": Could not create a socket. %s", STRERRNO); pthread_rwlock_unlock(&self->lock); - return (ret); + return ret; } /* Set socket timeout option */ @@ -273,8 +299,7 @@ static int socket_reinit(socket_adapter_t *self) { pthread_rwlock_rdlock(&self->lock); if (connect(self->sock_fd, (struct sockaddr *)&(self->unix_sock), sizeof(self->unix_sock)) < 0) { - ERROR(MCELOG_PLUGIN ": Failed to connect to mcelog server. %s", - sstrerror(errno, errbuff, sizeof(errbuff))); + ERROR(MCELOG_PLUGIN ": Failed to connect to mcelog server. %s", STRERRNO); self->close(self); ret = -1; } else { @@ -287,7 +312,7 @@ static int socket_reinit(socket_adapter_t *self) { .type_instance = "mcelog_status"}); } pthread_rwlock_unlock(&self->lock); - return (ret); + return ret; } static int mcelog_dispatch_mem_notifications(const mcelog_memory_rec_t *mr) { @@ -299,104 +324,90 @@ static int mcelog_dispatch_mem_notifications(const mcelog_memory_rec_t *mr) { int dispatch_corrected_notifs = 0, dispatch_uncorrected_notifs = 0; if (mr == NULL) - return (-1); + return -1; llentry_t *dimm = mcelog_dimm(mr, g_mcelog_config.dimms_list); - if (!dimm) { - ERROR(MCELOG_PLUGIN ": Error adding/getting dimm memory item to/from cache"); - return -1; + if (dimm == NULL) { + ERROR(MCELOG_PLUGIN + ": Error adding/getting dimm memory item to/from cache"); + return -1; } + mcelog_memory_rec_t *mr_old = dimm->value; + if (!g_mcelog_config.persist) { - mcelog_memory_rec_t *mr_old = (mcelog_memory_rec_t *)dimm->value; + if (mr_old->corrected_err_total != mr->corrected_err_total || + mr_old->corrected_err_timed != mr->corrected_err_timed) + dispatch_corrected_notifs = 1; - if (mr_old->corrected_err_total != mr->corrected_err_total || - mr_old->corrected_err_timed != mr->corrected_err_timed) - dispatch_corrected_notifs = 1; + if (mr_old->uncorrected_err_total != mr->uncorrected_err_total || + mr_old->uncorrected_err_timed != mr->uncorrected_err_timed) + dispatch_uncorrected_notifs = 1; - if (mr_old->uncorrected_err_total != mr->uncorrected_err_total || - mr_old->uncorrected_err_timed != mr->uncorrected_err_timed) + if (!dispatch_corrected_notifs && !dispatch_uncorrected_notifs) { + DEBUG("%s: No new notifications to dispatch", MCELOG_PLUGIN); + return 0; + } + } else { + dispatch_corrected_notifs = 1; dispatch_uncorrected_notifs = 1; - - if (!dispatch_corrected_notifs && !dispatch_uncorrected_notifs) { - DEBUG("%s: No new notifications to dispatch", MCELOG_PLUGIN); - return (0); } sstrncpy(n.host, hostname_g, sizeof(n.host)); if (mr->dimm_name[0] != '\0') - ssnprintf(n.plugin_instance, sizeof(n.plugin_instance), "%s_%s", - mr->location, mr->dimm_name); + snprintf(n.plugin_instance, sizeof(n.plugin_instance), "%s_%s", + mr->location, mr->dimm_name); else sstrncpy(n.plugin_instance, mr->location, sizeof(n.plugin_instance)); - if (dispatch_corrected_notifs) { + if (dispatch_corrected_notifs && + (mr->corrected_err_total > 0 || mr->corrected_err_timed > 0)) { /* Corrected Error Notifications */ - if (mr->corrected_err_total > 0 || mr->corrected_err_timed > 0) { - if (plugin_notification_meta_add_signed_int( - &n, MCELOG_CORRECTED_ERR, mr->corrected_err_total) < 0) { - ERROR(MCELOG_PLUGIN ": add corrected errors meta data failed"); - plugin_notification_meta_free(n.meta); - return (-1); - } - if (plugin_notification_meta_add_signed_int( - &n, "corrected memory timed errors", mr->corrected_err_timed) < - 0) { - ERROR(MCELOG_PLUGIN ": add corrected timed errors meta data failed"); - plugin_notification_meta_free(n.meta); - return (-1); - } - ssnprintf(n.message, sizeof(n.message), "Corrected Memory Errors"); - sstrncpy(n.type_instance, MCELOG_CORRECTED_ERR_TYPE_INS, - sizeof(n.type_instance)); - plugin_dispatch_notification(&n); - - if (n.meta) - plugin_notification_meta_free(n.meta); - } + plugin_notification_meta_add_signed_int(&n, MCELOG_CORRECTED_ERR, + mr->corrected_err_total); + plugin_notification_meta_add_signed_int(&n, MCELOG_CORRECTED_ERR_TIMED, + mr->corrected_err_timed); + snprintf(n.message, sizeof(n.message), MCELOG_CORRECTED_ERR); + sstrncpy(n.type_instance, MCELOG_CORRECTED_ERR_TYPE_INS, + sizeof(n.type_instance)); + plugin_dispatch_notification(&n); + if (n.meta) + plugin_notification_meta_free(n.meta); + n.meta = NULL; } - if (dispatch_uncorrected_notifs) { + if (dispatch_uncorrected_notifs && + (mr->uncorrected_err_total > 0 || mr->uncorrected_err_timed > 0)) { /* Uncorrected Error Notifications */ - if (mr->uncorrected_err_total > 0 || mr->uncorrected_err_timed > 0) { - if (plugin_notification_meta_add_signed_int( - &n, MCELOG_UNCORRECTED_ERR, mr->uncorrected_err_total) < 0) { - ERROR(MCELOG_PLUGIN ": add uncorrected errors meta data failed"); - plugin_notification_meta_free(n.meta); - return (-1); - } - if (plugin_notification_meta_add_signed_int( - &n, "uncorrected memory timed errors", - mr->uncorrected_err_timed) < 0) { - ERROR(MCELOG_PLUGIN ": add uncorrected timed errors meta data failed"); - plugin_notification_meta_free(n.meta); - return (-1); - } - ssnprintf(n.message, sizeof(n.message), "Uncorrected Memory Errors"); - sstrncpy(n.type_instance, MCELOG_UNCORRECTED_ERR_TYPE_INS, - sizeof(n.type_instance)); - n.severity = NOTIF_FAILURE; - plugin_dispatch_notification(&n); - - if (n.meta) - plugin_notification_meta_free(n.meta); - } + plugin_notification_meta_add_signed_int(&n, MCELOG_UNCORRECTED_ERR, + mr->uncorrected_err_total); + plugin_notification_meta_add_signed_int(&n, MCELOG_UNCORRECTED_ERR_TIMED, + mr->uncorrected_err_timed); + snprintf(n.message, sizeof(n.message), MCELOG_UNCORRECTED_ERR); + sstrncpy(n.type_instance, MCELOG_UNCORRECTED_ERR_TYPE_INS, + sizeof(n.type_instance)); + n.severity = NOTIF_FAILURE; + plugin_dispatch_notification(&n); + if (n.meta) + plugin_notification_meta_free(n.meta); + n.meta = NULL; } - return (0); + return 0; } static int mcelog_submit(const mcelog_memory_rec_t *mr) { if (!mr) { ERROR(MCELOG_PLUGIN ": %s: NULL pointer", __FUNCTION__); - return (-1); + return -1; } llentry_t *dimm = mcelog_dimm(mr, g_mcelog_config.dimms_list); - if (!dimm) { - ERROR(MCELOG_PLUGIN ": Error adding/getting dimm memory item to/from cache"); - return -1; + if (dimm == NULL) { + ERROR(MCELOG_PLUGIN + ": Error adding/getting dimm memory item to/from cache"); + return -1; } value_list_t vl = { @@ -410,15 +421,15 @@ static int mcelog_submit(const mcelog_memory_rec_t *mr) { mcelog_update_dimm_stats(dimm, mr); if (mr->dimm_name[0] != '\0') - ssnprintf(vl.plugin_instance, sizeof(vl.plugin_instance), "%s_%s", - mr->location, mr->dimm_name); + snprintf(vl.plugin_instance, sizeof(vl.plugin_instance), "%s_%s", + mr->location, mr->dimm_name); else sstrncpy(vl.plugin_instance, mr->location, sizeof(vl.plugin_instance)); plugin_dispatch_values(&vl); - ssnprintf(vl.type_instance, sizeof(vl.type_instance), - "corrected_memory_errors_in_%s", mr->corrected_err_timed_period); + snprintf(vl.type_instance, sizeof(vl.type_instance), + "corrected_memory_errors_in_%s", mr->corrected_err_timed_period); vl.values = &(value_t){.derive = (derive_t)mr->corrected_err_timed}; plugin_dispatch_values(&vl); @@ -427,13 +438,12 @@ static int mcelog_submit(const mcelog_memory_rec_t *mr) { vl.values = &(value_t){.derive = (derive_t)mr->uncorrected_err_total}; plugin_dispatch_values(&vl); - ssnprintf(vl.type_instance, sizeof(vl.type_instance), - "uncorrected_memory_errors_in_%s", - mr->uncorrected_err_timed_period); + snprintf(vl.type_instance, sizeof(vl.type_instance), + "uncorrected_memory_errors_in_%s", mr->uncorrected_err_timed_period); vl.values = &(value_t){.derive = (derive_t)mr->uncorrected_err_timed}; plugin_dispatch_values(&vl); - return (0); + return 0; } static int parse_memory_info(FILE *p_file, mcelog_memory_rec_t *memory_record) { @@ -442,7 +452,7 @@ static int parse_memory_info(FILE *p_file, mcelog_memory_rec_t *memory_record) { /* Got empty line or "done" */ if ((!strncmp("\n", buf, strlen(buf))) || (!strncmp(buf, "done\n", strlen(buf)))) - return (1); + return 1; if (strlen(buf) < 5) continue; if (!strncmp(buf, MCELOG_SOCKET_STR, strlen(MCELOG_SOCKET_STR))) { @@ -498,7 +508,7 @@ static int parse_memory_info(FILE *p_file, mcelog_memory_rec_t *memory_record) { memset(buf, 0, sizeof(buf)); } /* parsing definitely finished */ - return (0); + return 0; } static void poll_worker_cleanup(void *arg) { @@ -518,12 +528,10 @@ static int socket_receive(socket_adapter_t *self, FILE **pp_file) { if ((res = poll(&poll_fd, 1, MCELOG_POLL_TIMEOUT)) <= 0) { if (res != 0 && errno != EINTR) { - char errbuf[MCELOG_BUFF_SIZE]; - ERROR("mcelog: poll failed: %s", - sstrerror(errno, errbuf, sizeof(errbuf))); + ERROR("mcelog: poll failed: %s", STRERRNO); } pthread_rwlock_unlock(&self->lock); - return (res); + return res; } if (poll_fd.revents & (POLLERR | POLLHUP | POLLNVAL)) { @@ -538,29 +546,27 @@ static int socket_receive(socket_adapter_t *self, FILE **pp_file) { .type_instance = "mcelog_status"}); } pthread_rwlock_unlock(&self->lock); - return (-1); + return -1; } if (!(poll_fd.revents & (POLLIN | POLLPRI))) { INFO(MCELOG_PLUGIN ": No data to read"); pthread_rwlock_unlock(&self->lock); - return (0); + return 0; } if ((*pp_file = fdopen(dup(self->sock_fd), "r")) == NULL) res = -1; pthread_rwlock_unlock(&self->lock); - return (res); + return res; } static void *poll_worker(__attribute__((unused)) void *arg) { - char errbuf[MCELOG_BUFF_SIZE]; mcelog_thread_running = 1; FILE **pp_file = calloc(1, sizeof(*pp_file)); if (pp_file == NULL) { - ERROR("mcelog: memory allocation failed: %s", - sstrerror(errno, errbuf, sizeof(errbuf))); + ERROR("mcelog: memory allocation failed: %s", STRERRNO); pthread_exit((void *)1); } @@ -605,28 +611,35 @@ static void *poll_worker(__attribute__((unused)) void *arg) { mcelog_thread_running = 0; pthread_cleanup_pop(1); - return (NULL); + return NULL; } static int mcelog_init(void) { + if (mcelog_apply_defaults) { + INFO(MCELOG_PLUGIN + ": No configuration selected defaulting to memory errors."); + memset(g_mcelog_config.logfile, 0, sizeof(g_mcelog_config.logfile)); + } g_mcelog_config.dimms_list = llist_create(); int err = pthread_mutex_init(&g_mcelog_config.dimms_lock, NULL); if (err < 0) { ERROR(MCELOG_PLUGIN ": plugin: failed to initialize cache lock"); - return (-1); + return -1; } if (socket_adapter.reinit(&socket_adapter) != 0) { ERROR(MCELOG_PLUGIN ": Cannot connect to client socket"); - return (-1); + return -1; } - if (plugin_thread_create(&g_mcelog_config.tid, NULL, poll_worker, NULL, - NULL) != 0) { - ERROR(MCELOG_PLUGIN ": Error creating poll thread."); - return (-1); + if (strlen(socket_adapter.unix_sock.sun_path)) { + if (plugin_thread_create(&g_mcelog_config.tid, NULL, poll_worker, NULL, + NULL) != 0) { + ERROR(MCELOG_PLUGIN ": Error creating poll thread."); + return -1; + } } - return (0); + return 0; } static int get_memory_machine_checks(void) { @@ -636,7 +649,7 @@ static int get_memory_machine_checks(void) { ERROR(MCELOG_PLUGIN ": SENT DUMP REQUEST FAILED"); else DEBUG(MCELOG_PLUGIN ": SENT DUMP REQUEST OK"); - return (ret); + return ret; } static int mcelog_read(__attribute__((unused)) user_data_t *ud) { @@ -645,7 +658,7 @@ static int mcelog_read(__attribute__((unused)) user_data_t *ud) { if (get_memory_machine_checks() != 0) ERROR(MCELOG_PLUGIN ": MACHINE CHECK INFO NOT AVAILABLE"); - return (0); + return 0; } static int mcelog_shutdown(void) { @@ -660,12 +673,12 @@ static int mcelog_shutdown(void) { pthread_mutex_lock(&g_mcelog_config.dimms_lock); mcelog_free_dimms_list_records(g_mcelog_config.dimms_list); llist_destroy(g_mcelog_config.dimms_list); + g_mcelog_config.dimms_list = NULL; pthread_mutex_unlock(&g_mcelog_config.dimms_lock); pthread_mutex_destroy(&g_mcelog_config.dimms_lock); - g_mcelog_config.dimms_list = NULL; ret = socket_adapter.close(&socket_adapter) || ret; pthread_rwlock_destroy(&(socket_adapter.lock)); - return (-ret); + return -ret; } void module_register(void) {