aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/nifs/common
diff options
context:
space:
mode:
authorMicael Karlberg <[email protected]>2019-05-22 12:28:09 +0200
committerMicael Karlberg <[email protected]>2019-05-22 12:28:09 +0200
commit8551ec93d2864d8122472d8531a5268ee500d38d (patch)
treeaa25a489d3f913d5c38332bbaa5940b4ea761a79 /erts/emulator/nifs/common
parent02752f185b18c7f1c3f57dd80cf7c12f925dfe6a (diff)
downloadotp-8551ec93d2864d8122472d8531a5268ee500d38d.tar.gz
otp-8551ec93d2864d8122472d8531a5268ee500d38d.tar.bz2
otp-8551ec93d2864d8122472d8531a5268ee500d38d.zip
[esock] Replace usage of clock_gettime(CLOCK_REALTIME, ...)
The usage of the function clock_gettime(CLOCK_REALTIME, ...) has been replaced with enif_monotonic_time(ERL_NIF_USEC) and enif_time_offset(ERL_NIF_USEC). For now its if-def'ed so that we still *can* use clock_gettime, but for the momemnt its not used even if its available. OTP-15566, OTP-15686
Diffstat (limited to 'erts/emulator/nifs/common')
-rw-r--r--erts/emulator/nifs/common/socket_dbg.c57
-rw-r--r--erts/emulator/nifs/common/socket_util.c77
-rw-r--r--erts/emulator/nifs/common/socket_util.h3
3 files changed, 71 insertions, 66 deletions
diff --git a/erts/emulator/nifs/common/socket_dbg.c b/erts/emulator/nifs/common/socket_dbg.c
index 96f75a328f..7dfc4b77bc 100644
--- a/erts/emulator/nifs/common/socket_dbg.c
+++ b/erts/emulator/nifs/common/socket_dbg.c
@@ -30,6 +30,7 @@
#include <time.h>
#include <erl_nif.h>
+#include "socket_util.h"
#include "socket_dbg.h"
#define TSELF() enif_thread_self()
@@ -38,12 +39,6 @@
static FILE* dbgout = NULL;
-#if defined(CLOCK_REALTIME)
-static int realtime(struct timespec* tsP);
-static int timespec2str(char *buf, unsigned int len, struct timespec *ts);
-#endif
-
-
extern
void esock_dbg_init(char* filename)
{
@@ -73,10 +68,7 @@ void esock_dbg_printf( const char* prefix, const char* format, ... )
{
va_list args;
char f[512 + sizeof(format)]; // This has to suffice...
-#if defined(CLOCK_REALTIME)
char stamp[30];
- struct timespec ts;
-#endif
int res;
/*
@@ -85,64 +77,21 @@ void esock_dbg_printf( const char* prefix, const char* format, ... )
* But then I must change the API....something for later.
*/
-#if defined(CLOCK_REALTIME)
- if (!realtime(&ts) &&
- (timespec2str(stamp, sizeof(stamp), &ts) == 0)) {
+ if (esock_timestamp(stamp, sizeof(stamp))) {
res = enif_snprintf(f, sizeof(f), "%s [%s] [%s] %s",
prefix, stamp, TSNAME(), format);
} else {
res = enif_snprintf(f, sizeof(f), "%s [%s] %s",
prefix, TSNAME(), format);
}
-#else
- res = enif_snprintf(f, sizeof(f), "%s [%s] %s",
- prefix, TSNAME(), format);
-#endif
if (res > 0) {
va_start (args, format);
enif_vfprintf (dbgout, f, args);
va_end (args);
- fflush(stdout);
+ fflush(dbgout);
}
return;
}
-
-#if defined(CLOCK_REALTIME)
-static
-int realtime(struct timespec* tsP)
-{
- return clock_gettime(CLOCK_REALTIME, tsP);
-}
-
-
-
-
-/*
- * Convert a timespec struct into a readable/printable string
- */
-static
-int timespec2str(char *buf, unsigned int len, struct timespec *ts)
-{
- int ret, buflen;
- struct tm t;
-
- tzset();
- if (localtime_r(&(ts->tv_sec), &t) == NULL)
- return 1;
-
- ret = strftime(buf, len, "%F %T", &t);
- if (ret == 0)
- return 2;
- len -= ret - 1;
- buflen = strlen(buf);
-
- ret = snprintf(&buf[buflen], len, ".%06ld", ts->tv_nsec/1000);
- if (ret >= len)
- return 3;
-
- return 0;
-}
-#endif
diff --git a/erts/emulator/nifs/common/socket_util.c b/erts/emulator/nifs/common/socket_util.c
index 8ad95cb6b7..0a87c9a3ca 100644
--- a/erts/emulator/nifs/common/socket_util.c
+++ b/erts/emulator/nifs/common/socket_util.c
@@ -52,6 +52,10 @@
extern char* erl_errno_id(int error); /* THIS IS JUST TEMPORARY??? */
#if defined(CLOCK_REALTIME)
+// #define ESOCK_USE_CLOCK_REALTIME 1
+#endif
+
+#if defined(ESOCK_USE_CLOCK_REALTIME)
static int realtime(struct timespec* tsP);
static int timespec2str(char *buf,
unsigned int len,
@@ -1510,10 +1514,7 @@ void esock_warning_msg( const char* format, ... )
{
va_list args;
char f[512 + sizeof(format)]; // This has to suffice...
-#if defined(CLOCK_REALTIME)
char stamp[64]; // Just in case...
- struct timespec ts;
-#endif
int res;
/*
@@ -1525,18 +1526,13 @@ void esock_warning_msg( const char* format, ... )
// 2018-06-29 12:13:21.232089
// 29-Jun-2018::13:47:25.097097
-#if defined(CLOCK_REALTIME)
- if (!realtime(&ts) &&
- (timespec2str(stamp, sizeof(stamp), &ts) == 0)) {
+ if (esock_timestamp(stamp, sizeof(stamp))) {
res = enif_snprintf(f, sizeof(f),
"=WARNING MSG==== %s ===\r\n%s",
stamp, format);
} else {
res = enif_snprintf(f, sizeof(f), "=WARNING MSG==== %s", format);
}
-#else
- res = enif_snprintf(f, sizeof(f), "=WARNING MSG==== %s", format);
-#endif
if (res > 0) {
va_start (args, format);
@@ -1549,11 +1545,67 @@ void esock_warning_msg( const char* format, ... )
}
-#if defined(CLOCK_REALTIME)
+/* *** esock_timestamp ***
+ *
+ * Create a timestamp string.
+ * If awailable, it uses the realtime(CLOCK_REALTIME) function(s)
+ * and produces a nice readable timetamp. But if not, it produces
+ * a timestamp in the form of an Epoch.
+ */
+
+/* We should really have: ESOCK_USE_PRETTY_TIMESTAMP */
+extern
+BOOLEAN_T esock_timestamp(char *buf, unsigned int len)
+{
+#if defined(ESOCK_USE_CLOCK_REALTIME)
+
+ struct timespec ts;
+
+ if (!realtime(&ts) && (timespec2str(buf, len, &ts) == 0)) {
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+
+#else
+
+ int ret, buflen;
+ ErlNifTime monTime = enif_monotonic_time(ERL_NIF_USEC);
+ ErlNifTime offTime = enif_time_offset(ERL_NIF_USEC);
+ ErlNifTime time = monTime + offTime;
+ time_t sec = time / 1000000; // (if _MSEC) sec = time / 1000;
+ time_t usec = time % 1000000; // (if _MSEC) msec = time % 1000;
+ struct tm t;
+
+ /* Ideally, we would convert this plain integer into a
+ * nice readable string, but...
+ */
+
+ if (localtime_r(&sec, &t) == NULL)
+ return FALSE;
+
+ ret = strftime(buf, len, "%d-%B-%Y::%T", &t);
+ if (ret == 0)
+ return FALSE;
+ len -= ret - 1;
+ buflen = strlen(buf);
+
+ ret = enif_snprintf(&buf[buflen], len, ".%06b64d", usec);
+ if (ret >= len)
+ return FALSE;
+
+ return TRUE;
+
+#endif
+}
+
+
+
+#if defined(ESOCK_USE_CLOCK_REALTIME)
static
int realtime(struct timespec* tsP)
{
- return clock_gettime(CLOCK_REALTIME, tsP);
+ return clock_gettime(CLOCK_REALTIME, tsP);
}
@@ -1579,7 +1631,7 @@ int timespec2str(char *buf, unsigned int len, struct timespec *ts)
len -= ret - 1;
buflen = strlen(buf);
- ret = snprintf(&buf[buflen], len, ".%06ld", ts->tv_nsec/1000);
+ ret = enif_snprintf(&buf[buflen], len, ".%06b64d", ts->tv_nsec/1000);
if (ret >= len)
return 3;
@@ -1588,6 +1640,7 @@ int timespec2str(char *buf, unsigned int len, struct timespec *ts)
#endif
+
/* =================================================================== *
* *
* Various (internal) utility functions *
diff --git a/erts/emulator/nifs/common/socket_util.h b/erts/emulator/nifs/common/socket_util.h
index 84b1c8085f..2688a920c4 100644
--- a/erts/emulator/nifs/common/socket_util.h
+++ b/erts/emulator/nifs/common/socket_util.h
@@ -199,6 +199,9 @@ extern
ERL_NIF_TERM esock_make_error_errno(ErlNifEnv* env, int err);
extern
+BOOLEAN_T esock_timestamp(char *buf, unsigned int len);
+
+extern
void esock_warning_msg(const char* format, ... );