* Split unmapping and unlinking shared memory into two separate functions.
authorUrban Wallasch <urban.wallasch@freenet.de>
Tue, 20 Aug 2019 15:18:28 +0000 (17:18 +0200)
committerUrban Wallasch <urban.wallasch@freenet.de>
Tue, 20 Aug 2019 15:18:28 +0000 (17:18 +0200)
* Renamed 'key' parameter to 'name' in function signatures in shmget.[ch].

shmget.c
shmget.h
telehttpd.c
telelogger.c
teleshmem.cpp

index 8c2ebe1bcd4ac1079b963de2d69ed475b3b6a158..46cfdd7c12fdcbe88643a03d8cc732cb225c8021 100644 (file)
--- a/shmget.c
+++ b/shmget.c
 #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;
 }
index 4003129f1029ed3932e0afb311f062137213e814..b6fd1e1454bade79bed3eeae0604c29ff0371099 100644 (file)
--- 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
 }
index 9e80d6964107c02491055358182a6dbac440e7a5..e060eaa4112a9bcc34e307225dd3ab832588658e 100644 (file)
@@ -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 );
     }
index f2ee8e7756c649d6af0e35054813d4fe6672e020..4b6507799277b4524cbdf580fac2fa04760d83d3 100644 (file)
@@ -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 );
     }
index 12f759fc0e408a31658d8391dce71c9328856101..ba49a7fbee00812f739889c8a1b39deeb06784f1 100644 (file)
@@ -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 );
     }
 }