From 789dec5e21004d3f2f9c5fedb5f05221b4eefec7 Mon Sep 17 00:00:00 2001 From: Urban Wallasch Date: Tue, 20 Aug 2019 17:18:28 +0200 Subject: [PATCH] * Split unmapping and unlinking shared memory into two separate functions. * Renamed 'key' parameter to 'name' in function signatures in shmget.[ch]. --- shmget.c | 28 +++++++++++++++++----------- shmget.h | 7 ++++--- telehttpd.c | 4 ++-- telelogger.c | 4 ++-- teleshmem.cpp | 6 ++++-- 5 files changed, 29 insertions(+), 20 deletions(-) diff --git a/shmget.c b/shmget.c index 8c2ebe1..46cfdd7 100644 --- a/shmget.c +++ b/shmget.c @@ -18,11 +18,11 @@ #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; } @@ -42,24 +42,30 @@ static void *init_shm_( const char *key, size_t size, int oflag, int mode, int p // 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; } diff --git a/shmget.h b/shmget.h index 4003129..b6fd1e1 100644 --- a/shmget.h +++ b/shmget.h @@ -5,9 +5,10 @@ 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 } diff --git a/telehttpd.c b/telehttpd.c index 9e80d69..e060eaa 100644 --- a/telehttpd.c +++ b/telehttpd.c @@ -71,7 +71,7 @@ static int init_shm( bool retry ) { 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; @@ -88,7 +88,7 @@ static int check_shm( bool retry ) { 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 ); } diff --git a/telelogger.c b/telelogger.c index f2ee8e7..4b65077 100644 --- a/telelogger.c +++ b/telelogger.c @@ -54,7 +54,7 @@ static int init_shm( bool 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); } @@ -69,7 +69,7 @@ static int check_shm( bool retry ) { 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 ); } diff --git a/teleshmem.cpp b/teleshmem.cpp index 12f759f..ba49a7f 100644 --- a/teleshmem.cpp +++ b/teleshmem.cpp @@ -219,8 +219,9 @@ static bool init_shm(void) 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; } } @@ -234,8 +235,9 @@ static void drop_shm(void) 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 ); } } -- 2.30.2