pespin has submitted this change. ( 
https://gerrit.osmocom.org/c/osmo-trx/+/42199?usp=email )

Change subject: fix(threads): centralize portable strerror handling
......................................................................

fix(threads): centralize portable strerror handling

- Move strerror_r portability logic to Utils
- Add strerror_buf() helper
- Simplify thread error logging in Threads.cpp

Change-Id: I642aff8a9f98823e117c4debd19384ddf5975039
---
M CommonLibs/Threads.cpp
M CommonLibs/Utils.cpp
M CommonLibs/Utils.h
M CommonLibs/trx_rate_ctr.cpp
M Transceiver52M/device/ipc/IPCDevice.cpp
5 files changed, 31 insertions(+), 9 deletions(-)

Approvals:
  laforge: Looks good to me, but someone else must approve
  pespin: Looks good to me, but someone else must approve
  fixeria: Looks good to me, approved
  Jenkins Builder: Verified




diff --git a/CommonLibs/Threads.cpp b/CommonLibs/Threads.cpp
index 377a1b0..91e78d7 100644
--- a/CommonLibs/Threads.cpp
+++ b/CommonLibs/Threads.cpp
@@ -31,6 +31,7 @@
 #include "Threads.h"
 #include "Timeval.h"
 #include "Logger.h"
+#include "Utils.h"

 extern "C" {
 #include <osmocom/core/thread.h>
@@ -51,10 +52,10 @@
        if (pthread_setname_np(selfid, name) == 0) {
                LOG(INFO) << "Thread "<< selfid << " (task " << tid << ") set 
name: " << name;
        } else {
-               char buf[256];
+               char err_buf[256];
                int err = errno;
-               char* err_str = strerror_r(err, buf, sizeof(buf));
-               LOG(NOTICE) << "Thread "<< selfid << " (task " << tid << ") set 
name \"" << name << "\" failed: (" << err << ") " << err_str;
+               LOG(NOTICE) << "Thread "<< selfid << " (task " << tid << ") set 
name \"" << name << "\" failed: (" << err
+                       << ") " << strerror_buf(err, err_buf, sizeof(err_buf));
        }
 }

diff --git a/CommonLibs/Utils.cpp b/CommonLibs/Utils.cpp
index 6703531..b07120d 100644
--- a/CommonLibs/Utils.cpp
+++ b/CommonLibs/Utils.cpp
@@ -17,6 +17,7 @@
 #include <vector>
 #include <string>
 #include <sstream>
+#include <cstring>

 std::vector<std::string> comma_delimited_to_vector(const char* opt)
 {
@@ -32,3 +33,19 @@
        }
        return result;
 }
+
+char *strerror_buf(int err, char *buf, size_t buf_size)
+{
+       if (buf == nullptr || buf_size == 0)
+               return nullptr;
+
+       char *err_str = buf;
+#if defined(__GLIBC__) && defined(_GNU_SOURCE)
+       err_str = strerror_r(err, buf, buf_size);
+#else
+       if (!strerror_r(err, buf, buf_size)) {
+               snprintf(buf, buf_size, "Unknown error %d", err);
+       }
+#endif
+       return err_str;
+}
diff --git a/CommonLibs/Utils.h b/CommonLibs/Utils.h
index 8e61a9f..b032eac 100644
--- a/CommonLibs/Utils.h
+++ b/CommonLibs/Utils.h
@@ -20,3 +20,5 @@
 #include <string>

 std::vector<std::string> comma_delimited_to_vector(const char* opt);
+
+char *strerror_buf(int err, char *buf, size_t buf_size);
diff --git a/CommonLibs/trx_rate_ctr.cpp b/CommonLibs/trx_rate_ctr.cpp
index 3806268..b722a84 100644
--- a/CommonLibs/trx_rate_ctr.cpp
+++ b/CommonLibs/trx_rate_ctr.cpp
@@ -66,6 +66,7 @@
 }
 #include "Threads.h"
 #include "Logger.h"
+#include "Utils.h"

 /* Used in dev_ctrs_pending, when set it means that channel slot contains 
unused
    (non-pending) counter data */
@@ -224,7 +225,7 @@
                dev_ctrs_pending[dev_ctr->chan] = *dev_ctr;
                if (osmo_timerfd_schedule(&dev_rate_ctr_timerfd, &next_sched, 
&intv_sched) < 0) {
                        LOGC(DCTR, ERROR) << "Failed to schedule timerfd: " << 
errno
-                                         << " = "<< strerror_r(errno, err_buf, 
sizeof(err_buf));
+                                         << " = "<< strerror_buf(errno, 
err_buf, sizeof(err_buf));
                }
                dev_rate_ctr_mutex.unlock();
                break;
@@ -235,7 +236,7 @@
                trx_ctrs_pending[trx_ctr->chan] = *trx_ctr;
                if (osmo_timerfd_schedule(&trx_rate_ctr_timerfd, &next_sched, 
&intv_sched) < 0) {
                        LOGC(DCTR, ERROR) << "Failed to schedule timerfd: " << 
errno
-                                         << " = "<< strerror_r(errno, err_buf, 
sizeof(err_buf));
+                                         << " = "<< strerror_buf(errno, 
err_buf, sizeof(err_buf));
                }
                trx_rate_ctr_mutex.unlock();
                break;
diff --git a/Transceiver52M/device/ipc/IPCDevice.cpp 
b/Transceiver52M/device/ipc/IPCDevice.cpp
index 1d2b89a..25eac44 100644
--- a/Transceiver52M/device/ipc/IPCDevice.cpp
+++ b/Transceiver52M/device/ipc/IPCDevice.cpp
@@ -31,6 +31,7 @@
 #include "Threads.h"
 #include "IPCDevice.h"
 #include "smpl_buf.h"
+#include "Utils.h"

 extern "C" {
 #include <sys/mman.h>
@@ -100,7 +101,7 @@
        LOGP(DDEV, LOGL_NOTICE, "Opening shm path %s\n", shm_name);
        if ((fd = shm_open(shm_name, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR)) < 0) 
{
                LOGP(DDEV, LOGL_ERROR, "shm_open %d: %s\n", errno,
-                    strerror_r(errno, err_buf, sizeof(err_buf)));
+                    strerror_buf(errno, err_buf, sizeof(err_buf)));
                rc = -errno;
                goto err_shm_open;
        }
@@ -109,7 +110,7 @@
        struct stat shm_stat;
        if (fstat(fd, &shm_stat) < 0) {
                LOGP(DDEV, LOGL_ERROR, "fstat %d: %s\n", errno,
-                    strerror_r(errno, err_buf, sizeof(err_buf)));
+                    strerror_buf(errno, err_buf, sizeof(err_buf)));
                rc = -errno;
                goto err_mmap;
        }
@@ -119,7 +120,7 @@
        LOGP(DDEV, LOGL_NOTICE, "mmaping shared memory fd %d (size=%zu)\n", fd, 
shm_len);
        if ((shm = mmap(NULL, shm_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 
0)) == MAP_FAILED) {
                LOGP(DDEV, LOGL_ERROR, "mmap %d: %s\n", errno,
-                    strerror_r(errno, err_buf, sizeof(err_buf)));
+                    strerror_buf(errno, err_buf, sizeof(err_buf)));
                rc = -errno;
                goto err_mmap;
        }
@@ -850,7 +851,7 @@

        if (select(max_fd + 1, &crfds, &cwfds, 0, &wait) < 0) {
                LOGP(DDEV, LOGL_ERROR, "select() failed: %s\n",
-                    strerror_r(errno, err_buf, sizeof(err_buf)));
+                    strerror_buf(errno, err_buf, sizeof(err_buf)));
                return;
        }


--
To view, visit https://gerrit.osmocom.org/c/osmo-trx/+/42199?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings?usp=email

Gerrit-MessageType: merged
Gerrit-Project: osmo-trx
Gerrit-Branch: master
Gerrit-Change-Id: I642aff8a9f98823e117c4debd19384ddf5975039
Gerrit-Change-Number: 42199
Gerrit-PatchSet: 6
Gerrit-Owner: Timur Davydov <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <[email protected]>
Gerrit-Reviewer: laforge <[email protected]>
Gerrit-Reviewer: osmith <[email protected]>
Gerrit-Reviewer: pespin <[email protected]>

Reply via email to