X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fipc.c;h=b164cdf72b517da03de6847a4e7c68f4f6e5608e;hb=4d370741101aeb037ae52f3529a4a0869e0dc08a;hp=2d2db2abb0ac7727aaecbe97cdcdc0e40397f3d3;hpb=8395c8dbb8f5a872c5cde8db4c47a34cdb5f7c2f;p=collectd.git diff --git a/src/ipc.c b/src/ipc.c index 2d2db2ab..b164cdf7 100644 --- a/src/ipc.c +++ b/src/ipc.c @@ -27,11 +27,14 @@ */ #include "collectd.h" + #include "common.h" #include "plugin.h" -#include "configfile.h" #if KERNEL_LINUX + /* _GNU_SOURCE is needed for struct shm_info.used_ids on musl libc */ +# define _GNU_SOURCE + /* X/OPEN tells us to use for semctl() */ /* X/OPEN tells us to use for msgctl() */ /* X/OPEN tells us to use for shmctl() */ @@ -111,7 +114,80 @@ static void ipc_submit_g (const char *plugin_instance, plugin_dispatch_values (&vl); } /* }}} */ -#if KERNEL_AIX +#if KERNEL_LINUX +static int ipc_read_sem (void) /* {{{ */ +{ + struct seminfo seminfo; + union semun arg; + int status; + + arg.array = (void *) &seminfo; + + status = semctl (/* id = */ 0, /* num = */ 0, SEM_INFO, arg); + if (status == -1) + { + char errbuf[1024]; + ERROR("ipc plugin: semctl(2) failed: %s. " + "Maybe the kernel is not configured for semaphores?", + sstrerror (errno, errbuf, sizeof (errbuf))); + return (-1); + } + + ipc_submit_g("sem", "count", "arrays", seminfo.semusz); + ipc_submit_g("sem", "count", "total", seminfo.semaem); + + return (0); +} /* }}} int ipc_read_sem */ + +static int ipc_read_shm (void) /* {{{ */ +{ + struct shm_info shm_info; + int status; + + status = shmctl (/* id = */ 0, SHM_INFO, (void *) &shm_info); + if (status == -1) + { + char errbuf[1024]; + ERROR("ipc plugin: shmctl(2) failed: %s. " + "Maybe the kernel is not configured for shared memory?", + sstrerror (errno, errbuf, sizeof (errbuf))); + return (-1); + } + + ipc_submit_g("shm", "segments", NULL, shm_info.used_ids); + ipc_submit_g("shm", "bytes", "total", shm_info.shm_tot * pagesize_g); + ipc_submit_g("shm", "bytes", "rss", shm_info.shm_rss * pagesize_g); + ipc_submit_g("shm", "bytes", "swapped", shm_info.shm_swp * pagesize_g); + return (0); +} +/* }}} int ipc_read_shm */ + +static int ipc_read_msg (void) /* {{{ */ +{ + struct msginfo msginfo; + + if ( msgctl(0, MSG_INFO, (struct msqid_ds *) (void *) &msginfo) < 0 ) + { + ERROR("Kernel is not configured for message queues"); + return (-1); + } + ipc_submit_g("msg", "count", "queues", msginfo.msgmni); + ipc_submit_g("msg", "count", "headers", msginfo.msgmap); + ipc_submit_g("msg", "count", "space", msginfo.msgtql); + + return (0); +} +/* }}} int ipc_read_msg */ + +static int ipc_init (void) /* {{{ */ +{ + pagesize_g = sysconf(_SC_PAGESIZE); + return (0); +} +/* }}} */ +/* #endif KERNEL_LINUX */ + +#elif KERNEL_AIX static caddr_t ipc_get_info (cid_t cid, int cmd, int version, int stsize, int *nmemb) /* {{{ */ { int size = 0; @@ -137,7 +213,7 @@ static caddr_t ipc_get_info (cid_t cid, int cmd, int version, int stsize, int *n *nmemb = size / stsize; - buff = (caddr_t)malloc (size); + buff = malloc (size); if (buff == NULL) { ERROR ("ipc plugin: ipc_get_info malloc failed."); return (NULL); @@ -154,38 +230,20 @@ static caddr_t ipc_get_info (cid_t cid, int cmd, int version, int stsize, int *n return buff; } /* }}} */ -#endif /* KERNEL_AIX */ static int ipc_read_sem (void) /* {{{ */ { -#if KERNEL_LINUX - struct seminfo seminfo; - union semun arg; - - arg.array = (ushort *) (void *) &seminfo; - - if ( semctl(0, 0, SEM_INFO, arg) < 0 ) - { - ERROR("Kernel is not configured for semaphores"); - return (-1); - } - - ipc_submit_g("sem", "count", "arrays", seminfo.semusz); - ipc_submit_g("sem", "count", "total", seminfo.semaem); - -/* #endif KERNEL_LINUX */ -#elif KERNEL_AIX ipcinfo_sem_t *ipcinfo_sem; unsigned short sem_nsems=0; unsigned short sems=0; - int i,n; + int n; ipcinfo_sem = (ipcinfo_sem_t *)ipc_get_info(0, GET_IPCINFO_SEM_ALL, IPCINFO_SEM_VERSION, sizeof(ipcinfo_sem_t), &n); if (ipcinfo_sem == NULL) return -1; - for (i=0; ishm_segsz; } @@ -235,38 +277,24 @@ static int ipc_read_shm (void) /* {{{ */ ipc_submit_g("shm", "segments", NULL, shm_segments); ipc_submit_g("shm", "bytes", "total", shm_bytes); -#endif /* KERNEL_AIX */ return (0); } -/* }}} */ +/* }}} int ipc_read_shm */ static int ipc_read_msg (void) /* {{{ */ { -#if KERNEL_LINUX - struct msginfo msginfo; - - if ( msgctl(0, MSG_INFO, (struct msqid_ds *) (void *) &msginfo) < 0 ) - { - ERROR("Kernel is not configured for message queues"); - return (-1); - } - ipc_submit_g("msg", "count", "queues", msginfo.msgmni); - ipc_submit_g("msg", "count", "headers", msginfo.msgmap); - ipc_submit_g("msg", "count", "space", msginfo.msgtql); -/* #endif KERNEL_LINUX */ -#elif KERNEL_AIX ipcinfo_msg_t *ipcinfo_msg; uint32_t msg_used_space=0; uint32_t msg_alloc_queues=0; msgqnum32_t msg_qnum=0; - int i,n; + int n; ipcinfo_msg = (ipcinfo_msg_t *)ipc_get_info(0, GET_IPCINFO_MSG_ALL, IPCINFO_MSG_VERSION, sizeof(ipcinfo_msg_t), &n); if (ipcinfo_msg == NULL) return -1; - for (i=0; i