#include "log.h"
-static void *init_shm_( const char *key, size_t size, int oflag, int mode, int prot, int flags ) {
+static void *init_shm_( const char *name, size_t size, int oflag, int mode, int prot, int flags ) {
int fd;
void *addr = NULL;
- if ( 0 > ( fd = shm_open( key, oflag, mode ) ) ) {
+ if ( 0 > ( fd = shm_open( name, oflag, mode ) ) ) {
EPRINT( "shm_open: %s\n", strerror( errno ) );
goto ERR_1;
}
// Called by plugin to create the shared memory segment:
-void *init_shmput( const char *key, size_t size ) {
- return init_shm_( key, size, O_RDWR | O_CREAT | O_EXCL, 0600,
+void *init_shmput( const char *name, size_t size ) {
+ return init_shm_( name, size, O_RDWR | O_CREAT | O_EXCL, 0600,
PROT_READ | PROT_WRITE, MAP_SHARED );
}
// Called by clients to attach to existing shared memory segment:
-void *init_shmget( const char *key, size_t size ) {
- return init_shm_( key, size, O_RDWR, 0, PROT_READ | PROT_WRITE, MAP_SHARED );
+void *init_shmget( const char *name, size_t size ) {
+ return init_shm_( name, size, O_RDWR, 0, PROT_READ | PROT_WRITE, MAP_SHARED );
}
-int release_shm( const char *key, void *addr, size_t size ) {
+// Unmap shared memory segment, called by plugin and clients:
+int release_shm( void *addr, size_t size ) {
int res;
- if ( 0 != munmap( addr, size ) ) {
+ if ( 0 != ( res = munmap( addr, size ) ) )
EPRINT( "munmap: %s\n", strerror( errno ) );
- }
- if ( 0 != ( res = shm_unlink( key ) ) ) {
+ return res;
+}
+
+// Delete shared memory segment, called by plugin only:
+int unlink_shm( const char *name ) {
+ int res;
+
+ if ( 0 != ( res = shm_unlink( name ) ) )
EPRINT( "shm_unlink: %s\n", strerror( errno ) );
- }
return res;
}
extern "C" {
#endif
-extern void *init_shmput( const char *key, size_t size );
-extern void *init_shmget( const char *key, size_t size );
-extern int release_shm( const char *key, void *addr, size_t size );
+extern void *init_shmput( const char *name, size_t size );
+extern void *init_shmget( const char *name, size_t size );
+extern int release_shm( void *addr, size_t size );
+extern int unlink_shm( const char *name );
#ifdef __cplusplus
}
else if ( TELE_VERSION != ( ver = tele_version( telemetry ) ) ) {
EPRINT( "telemetry version mismatch: got %u, want %u\n",
(unsigned)ver, TELE_VERSION );
- release_shm( TELE_SHM_NAME, (void *)telemetry, sizeof *telemetry );
+ release_shm( (void *)telemetry, sizeof *telemetry );
telemetry = NULL;
if ( !retry )
return -1;
if ( NULL == telemetry )
return init_shm( retry );
if ( !( tele_flags( telemetry ) & TELE_FLAG_ALIVE ) ) {
- release_shm( TELE_SHM_NAME, (void *)telemetry, sizeof *telemetry );
+ release_shm( (void *)telemetry, sizeof *telemetry );
telemetry = NULL;
return init_shm( retry );
}
(unsigned)ver, TELE_VERSION );
if ( !retry )
return -1;
- release_shm( TELE_SHM_NAME, (void *)telemetry, sizeof *telemetry );
+ release_shm( (void *)telemetry, sizeof *telemetry );
telemetry = NULL;
sleep(1);
}
if ( NULL == telemetry )
return init_shm( retry );
if ( !( tele_flags( telemetry ) & TELE_FLAG_ALIVE ) ) {
- release_shm( TELE_SHM_NAME, (void *)telemetry, sizeof *telemetry );
+ release_shm( (void *)telemetry, sizeof *telemetry );
telemetry = NULL;
return init_shm( retry );
}
if ( 0 != e ) {
log_print( "ERROR: pthread_rwlock_init: %s\n", strerror(e) );
RWLOCK_ERR:
- release_shm( TELE_SHM_NAME, telemetry, sizeof *telemetry );
+ release_shm( telemetry, sizeof *telemetry );
telemetry = NULL;
+ unlink_shm( TELE_SHM_NAME );
return false;
}
}
lock_shm();
telemetry->flags &= ~TELE_FLAG_ALIVE;
unlock_shm();
- release_shm( TELE_SHM_NAME, telemetry, sizeof *telemetry );
+ release_shm( telemetry, sizeof *telemetry );
telemetry = NULL;
+ unlink_shm( TELE_SHM_NAME );
}
}