osaf/libs/core/leap/os_defs.c |  20 ++++++++++++++++++--
 1 files changed, 18 insertions(+), 2 deletions(-)


Issue :

If OSAF_CKPT_SHM_ALLOC_GUARANTEE is NOT set and  SHM is 100% used in system ,
pnd Segmentation fault (core dumped) at LEAP memcpy().

Fix :

Now LEAP library ensures  shm free space before writing
This may degrade some performance of cpsv , if  OSAF_CKPT_SHM_ALLOC_GUARANTEE   
is set,
cpsv give natural performance.

diff --git a/osaf/libs/core/leap/os_defs.c b/osaf/libs/core/leap/os_defs.c
--- a/osaf/libs/core/leap/os_defs.c
+++ b/osaf/libs/core/leap/os_defs.c
@@ -38,6 +38,7 @@
 #include <sys/types.h>
 #include <sys/mman.h>
 #include <sys/stat.h>
+#include <sys/statvfs.h>
 #include <time.h>
 #include <fcntl.h>
 #include <errno.h>
@@ -771,6 +772,7 @@ uint32_t ncs_os_posix_shm(NCS_OS_POSIX_S
        int32_t ret_flag;
        uint64_t shm_size;
        char shm_name[PATH_MAX];
+       struct statvfs statsvfs;
 
        switch (req->type) {
        case NCS_OS_POSIX_SHM_REQ_OPEN: /* opens and mmaps */
@@ -792,7 +794,7 @@ uint32_t ncs_os_posix_shm(NCS_OS_POSIX_S
                if (req->info.open.o_fd < 0) {
                        return NCSCC_RC_FAILURE;
                } else {
-                       if (req->info.open.ensures_space == true) {
+                       if (req->ensures_space == true) {
                                if (posix_fallocate(req->info.open.o_fd, 0, 
shm_size) != 0) {
                                        LOG_ER("posix_shm:posix_fallocate 
failed() with errno: %d \n", errno);
                                        return NCSCC_RC_FAILURE;
@@ -855,8 +857,22 @@ uint32_t ncs_os_posix_shm(NCS_OS_POSIX_S
                break;
 
        case NCS_OS_POSIX_SHM_REQ_WRITE:
+               if (req->ensures_space == false) {
+                       /* Check for the available shared memory space */
+                       if (statvfs("/dev/shm", &statsvfs) != 0) {
+                               syslog(LOG_ERR, "statvfs failed to get file 
system statistics with errno value %d\n", errno);
+                               return NCSCC_RC_FAILURE;
+                       }
+
+                       /* Checking whether sufficient shared memory is 
available to write the data, to be safer side ffree reduced to 1 block size */
+                       if (req->info.write.i_write_size > (statsvfs.f_bfree * 
statsvfs.f_frsize)) {
+                               syslog(LOG_ERR, "Insufficient shared memory 
space (%ld) available to write the data of size: %ld \n",
+                                               (statsvfs.f_bfree * 
statsvfs.f_frsize), req->info.write.i_write_size);
+                               return NCSCC_RC_FAILURE;
+                       }
+               }
                memcpy((void *)((char *)req->info.write.i_addr + 
req->info.write.i_offset), req->info.write.i_from_buff,
-                      req->info.write.i_write_size);
+                               req->info.write.i_write_size);
                break;
 
        default:

------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to