Evil: use static buffer to store error messages
authorVincent Torri <vincent.torri@gmail.com>
Mon, 11 Dec 2017 06:06:02 +0000 (15:06 +0900)
committerJean-Philippe Andre <jp.andre@samsung.com>
Mon, 11 Dec 2017 07:04:02 +0000 (16:04 +0900)
Reviewers: cedric, jpeg

Differential Revision: https://phab.enlightenment.org/D5394

12 files changed:
src/lib/ecore/ecore_exe_win32.c
src/lib/ecore/ecore_main.c
src/lib/ecore_con/ecore_con_local_win32.c
src/lib/ecore_con/efl_net_dialer_windows.c
src/lib/ecore_con/efl_net_server_windows.c
src/lib/eina/eina_file_win32.c
src/lib/eio/eio_monitor_win32.c
src/lib/evil/evil_dlfcn.c
src/lib/evil/evil_main.c
src/lib/evil/evil_mman.c
src/lib/evil/evil_util.c
src/lib/evil/evil_util.h

index 80a4e70..204f13e 100644 (file)
@@ -64,11 +64,7 @@ _ecore_exe_close_cb(void *data,
 
    /* FIXME : manage the STILL_ACTIVE returned error */
    if (!GetExitCodeProcess(exe->process, &exit_code))
-     {
-        char *msg = evil_last_error_get();
-        DBG("%s", msg);
-        free(msg);
-     }
+     DBG("%s", evil_last_error_get());
 
    e->exit_code = exit_code;
    e->exited = 1;
@@ -498,16 +494,8 @@ _impl_ecore_exe_efl_object_finalize(Eo *obj, Ecore_Exe_Data *exe)
    if (!CreateProcess(shell, exe_cmd_buf, NULL, NULL, EINA_TRUE,
                       run_pri | CREATE_SUSPENDED, NULL, NULL, &si, &pi))
      {
-        char *msg;
-
-        msg = evil_last_error_get();
-        if (msg)
-          {
-             WRN("Failed to create process %s: %s", exe_cmd_buf, msg);
-             free(msg);
-          }
-        else
-          WRN("Failed to create process %s: %ld", exe_cmd_buf, GetLastError());
+        WRN("Failed to create process %s: %s",
+            exe_cmd_buf, evil_last_error_get());
         goto error;
      }
 
index a854397..d72de0d 100644 (file)
@@ -2594,13 +2594,7 @@ _ecore_main_win32_objects_wait(DWORD objects_nbr,
      {
         ERR("Error when waiting threads.");
         if (result == WAIT_FAILED)
-          {
-             char *str;
-
-             str = evil_last_error_get();
-             ERR("%s", str);
-             free(str);
-          }
+          ERR("%s", evil_last_error_get());
         goto close_thread;
      }
 
@@ -2755,11 +2749,7 @@ _ecore_main_win32_select(int             nfds EINA_UNUSED,
    /* The result tells us the type of event we have. */
    if (result == WAIT_FAILED)
      {
-        char *m;
-
-        m = evil_last_error_get();
-        WRN("%s", m);
-        free(m);
+        WRN("%s", evil_last_error_get());
         res = -1;
      }
    else if (result == WAIT_TIMEOUT)
index 9a5b731..126ccda 100644 (file)
@@ -64,14 +64,7 @@ _ecore_con_local_win32_server_read_client_handler(void *data, Ecore_Win32_Handle
    if (broken_pipe)
      {
 #if 0
-        char *msg;
-
-        msg = evil_last_error_get();
-        if (msg)
-          {
-             ecore_con_event_client_error(cl, msg);
-             free(msg);
-          }
+        ecore_con_event_client_error(cl, evil_last_error_get());
 #endif
         _ecore_con_client_kill(obj);
         return ECORE_CALLBACK_CANCEL;
@@ -99,12 +92,7 @@ _ecore_con_local_win32_server_peek_client_handler(void *data, Ecore_Win32_Handle
      return ECORE_CALLBACK_RENEW;
 
 #if 0
-   msg = evil_last_error_get();
-   if (msg)
-     {
-        ecore_con_event_server_error(host_svr, msg);
-        free(msg);
-     }
+   ecore_con_event_server_error(host_svr, evil_last_error_get());
 #endif
    _ecore_con_server_kill(cl->host_server);
    return ECORE_CALLBACK_CANCEL;
@@ -126,12 +114,7 @@ _ecore_con_local_win32_client_peek_server_handler(void *data, Ecore_Win32_Handle
    if (!ResetEvent(svr->event_peek))
      return ECORE_CALLBACK_RENEW;
 #if 0
-   msg = evil_last_error_get();
-   if (msg)
-     {
-        ecore_con_event_server_error(svr, msg);
-        free(msg);
-     }
+   ecore_con_event_server_error(svr, evil_last_error_get());
 #endif
    _ecore_con_server_kill(obj);
    return ECORE_CALLBACK_CANCEL;
@@ -172,14 +155,7 @@ _ecore_con_local_win32_client_read_server_handler(void *data, Ecore_Win32_Handle
    if (broken_pipe)
      {
 #if 0
-        char *msg;
-
-        msg = evil_last_error_get();
-        if (msg)
-          {
-             ecore_con_event_server_error(svr, msg);
-             free(msg);
-          }
+        ecore_con_event_server_error(svr, evil_last_error_get());
 #endif
         _ecore_con_server_kill(obj);
         return ECORE_CALLBACK_CANCEL;
@@ -686,14 +662,7 @@ ecore_con_local_win32_server_flush(Ecore_Con_Server *obj)
    res = WriteFile(svr->pipe, eina_binbuf_string_get(svr->buf) + svr->write_buf_offset, num, &written, NULL);
    if (!res)
      {
-        char *msg;
-
-        msg = evil_last_error_get();
-        if (msg)
-          {
-             ecore_con_event_server_error(obj, msg);
-             free(msg);
-          }
+        ecore_con_event_server_error(obj, evil_last_error_get());
         _ecore_con_server_kill(obj);
      }
 
@@ -737,14 +706,7 @@ ecore_con_local_win32_client_flush(Ecore_Con_Client *obj)
    res = WriteFile(svr->pipe, eina_binbuf_string_get(cl->buf) + cl->buf_offset, num, &written, NULL);
    if (!res)
      {
-        char *msg;
-
-        msg = evil_last_error_get();
-        if (msg)
-          {
-             ecore_con_event_client_error(obj, msg);
-             free(msg);
-          }
+        ecore_con_event_client_error(obj, evil_last_error_get());
         _ecore_con_client_kill(obj);
      }
 
index f174d2d..f96b731 100644 (file)
@@ -66,9 +66,8 @@ _efl_net_dialer_windows_efl_net_dialer_dial(Eo *o, Efl_Net_Dialer_Windows_Data *
            case ERROR_INVALID_NAME: return EADDRNOTAVAIL;
            default:
              {
-                char *msg = evil_format_message(win32err);
-                ERR("CreateFile(%s): Unexpected win32err=%lu (%s)", pd->address_dial, win32err, msg);
-                free(msg);
+                ERR("CreateFile(%s): Unexpected win32err=%lu (%s)",
+                    pd->address_dial, win32err, evil_format_message(win32err));
                 return EINVAL;
              }
           }
@@ -85,9 +84,8 @@ _efl_net_dialer_windows_efl_net_dialer_dial(Eo *o, Efl_Net_Dialer_Windows_Data *
     snprintf(cstr, sizeof(cstr), "%s:%lu", address, cpid);
   else
     {
-       char *msg = evil_last_error_get();
-       WRN("server=%p (%s) could not GetNamedPipeClientProcessId(o): %s", o, address, msg);
-       free(msg);
+       WRN("server=%p (%s) could not GetNamedPipeClientProcessId(o): %s",
+           o, address, evil_last_error_get());
        eina_strlcpy(cstr, address, sizeof(cstr));
     }
 
@@ -95,9 +93,8 @@ _efl_net_dialer_windows_efl_net_dialer_dial(Eo *o, Efl_Net_Dialer_Windows_Data *
     snprintf(sstr, sizeof(sstr), "%s:%lu", address, spid);
   else
     {
-       char *msg = evil_last_error_get();
-       WRN("server=%p (%s) could not GetNamedPipeServerProcessId(o): %s", o, address, msg);
-       free(msg);
+       WRN("server=%p (%s) could not GetNamedPipeServerProcessId(o): %s",
+           o, address, evil_last_error_get());
        eina_strlcpy(sstr, address, sizeof(sstr));
      }
 
index 76dd5b0..5c8c489 100644 (file)
@@ -61,9 +61,8 @@ _efl_net_server_windows_client_listen_success(void *data, Eo *client, DWORD used
      snprintf(cstr, sizeof(cstr), "%s:%lu", addr, cpid);
    else
      {
-        char *msg = evil_last_error_get();
-        WRN("server=%p (%s) could not GetNamedPipeClientProcessId(client): %s", o, addr, msg);
-        free(msg);
+        WRN("server=%p (%s) could not GetNamedPipeClientProcessId(client): %s",
+            o, addr, evil_last_error_get());
         eina_strlcpy(cstr, addr, sizeof(cstr));
      }
 
@@ -71,9 +70,8 @@ _efl_net_server_windows_client_listen_success(void *data, Eo *client, DWORD used
      snprintf(sstr, sizeof(sstr), "%s:%lu", addr, spid);
    else
      {
-        char *msg = evil_last_error_get();
-        WRN("server=%p (%s) could not GetNamedPipeServerProcessId(client): %s", o, addr, msg);
-        free(msg);
+        WRN("server=%p (%s) could not GetNamedPipeServerProcessId(client): %s",
+            o, addr, evil_last_error_get());
         eina_strlcpy(sstr, addr, sizeof(sstr));
      }
 
@@ -225,8 +223,8 @@ _efl_net_server_windows_client_new(Eo *o, Efl_Net_Server_Windows_Data *pd)
            case ERROR_INVALID_PARAMETER: return EINVAL;
            default:
              {
-                char *msg = evil_format_message(win32err);
-                ERR("Unexpected win32err=%lu (%s)", win32err, msg);
+                ERR("Unexpected win32err=%lu (%s)",
+                    win32err, evil_format_message(win32err));
                 return EINVAL;
              }
           }
index 9307b59..4cb0a22 100644 (file)
@@ -737,16 +737,9 @@ eina_file_open(const char *path, Eina_Bool shared)
 
    if (handle == INVALID_HANDLE_VALUE)
      {
-        char *msg;
-
-        msg = evil_last_error_get();
-        if (msg)
-          {
-             WRN("eina_file_open() failed with file %s: %s", filename, msg);
-             free(msg);
-          }
-        else
-          goto free_file;
+       WRN("eina_file_open() failed with file %s: %s",
+           filename, evil_last_error_get());
+       goto free_file;
      }
 
    if (!GetFileAttributesEx(filename, GetFileExInfoStandard, &fad))
index 05374f1..bfbb0ec 100644 (file)
@@ -191,14 +191,7 @@ _eio_monitor_win32_cb(void *data, Ecore_Win32_Handler *wh EINA_UNUSED)
                               &w->overlapped,
                               NULL))
      {
-        char *msg;
-
-        msg = evil_last_error_get();
-        if (msg)
-          {
-             ERR("%s", msg);
-             free(msg);
-          }
+        ERR("%s", evil_last_error_get());
         return ECORE_CALLBACK_CANCEL;
      }
 
@@ -271,14 +264,7 @@ _eio_monitor_win32_watcher_new(Eio_Monitor      *monitor,
                               &w->overlapped,
                               NULL))
      {
-        char *msg;
-
-        msg = evil_last_error_get();
-        if (msg)
-          {
-             ERR("%s", msg);
-             free(msg);
-          }
+        ERR("%s", evil_last_error_get());
         goto close_event;
      }
 
index fe1dc7d..1a7db5e 100644 (file)
@@ -24,7 +24,7 @@ static int _dl_err_viewed = 0;
 static void
 _dl_get_last_error(char *desc)
 {
-   char *str;
+   const char *str;
    size_t l1;
    size_t l2;
 
@@ -45,7 +45,6 @@ _dl_get_last_error(char *desc)
         memcpy(_dl_err + l1, str, l2);
         _dl_err[l1 + l2] = '\0';
      }
-   free(str);
    _dl_err_viewed = 0;
 }
 
index 8ddd85f..875d6c5 100644 (file)
@@ -22,6 +22,8 @@ extern LONGLONG _evil_time_freq;
 extern LONGLONG _evil_time_count;
 extern long     _evil_time_second;
 
+extern DWORD    _evil_tls_index;
+
 long _evil_systemtime_to_time(SYSTEMTIME st);
 
 int
@@ -96,3 +98,41 @@ evil_shutdown(void)
 
    return _evil_init_count;
 }
+
+BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved)
+{
+   LPVOID data;
+
+   switch (reason)
+     {
+     case DLL_PROCESS_ATTACH:
+       _evil_tls_index = TlsAlloc();
+       if (_evil_tls_index == TLS_OUT_OF_INDEXES)
+         return FALSE;
+     case DLL_THREAD_ATTACH:
+       data = (LPVOID)LocalAlloc(LPTR, 4096);
+       if (!data)
+         return FALSE;
+       if (!TlsSetValue(_evil_tls_index, data))
+         return FALSE;
+       break;
+     case DLL_THREAD_DETACH:
+       data = TlsGetValue(_evil_tls_index);
+       if (data)
+         LocalFree((HLOCAL)data);
+       break;
+     case DLL_PROCESS_DETACH:
+       data = TlsGetValue(_evil_tls_index);
+       if (data)
+         LocalFree((HLOCAL)data);
+       TlsFree(_evil_tls_index);
+       break;
+     default:
+       break;
+     }
+
+   return TRUE;
+
+   (void)inst;
+   (void)reserved;
+}
index fca3c72..3f632e5 100644 (file)
@@ -83,12 +83,8 @@ mmap(void  *addr EVIL_UNUSED,
    fm = CreateFileMapping(handle, NULL, protect, 0, 0, NULL);
    if (!fm)
      {
-        char *str;
-
-        str = evil_last_error_get();
-        fprintf(stderr, "[Evil] [mmap] CreateFileMapping failed: %s\n", str);
-        free(str);
-
+        fprintf(stderr, "[Evil] [mmap] CreateFileMapping failed: %s\n",
+                evil_last_error_get());
         return MAP_FAILED;
      }
 
@@ -117,12 +113,8 @@ mmap(void  *addr EVIL_UNUSED,
 
    if (!data)
      {
-        char *str;
-
-        str = evil_last_error_get();
-        fprintf(stderr, "[Evil] [mmap] MapViewOfFile failed: %s\n", str);
-        free(str);
-
+        fprintf(stderr, "[Evil] [mmap] MapViewOfFile failed: %s\n",
+                evil_last_error_get());
         return MAP_FAILED;
      }
 
@@ -137,13 +129,8 @@ munmap(void  *addr,
 
    res = UnmapViewOfFile(addr);
    if (!res)
-     {
-        char *str;
-
-        str = evil_last_error_get();
-        fprintf(stderr, "[Evil] [munmap] UnmapViewOfFile failed: %s\n", str);
-        free(str);
-     }
+     fprintf(stderr, "[Evil] [munmap] UnmapViewOfFile failed: %s\n",
+             evil_last_error_get());
 
    return (res == 0) ? -1 : 0;
 }
index 4f74353..36ee38e 100644 (file)
@@ -17,6 +17,7 @@
 #include "evil_macro.h"
 #include "evil_util.h"
 
+DWORD _evil_tls_index;
 
 /* static void _evil_error_display(const char *fct, LONG res); */
 static void _evil_last_error_display(const char *fct);
@@ -113,12 +114,12 @@ evil_utf16_to_utf8(const wchar_t *text16)
    return text8;
 }
 
-char *
+const char *
 evil_format_message(long err)
 {
+   char *buf;
    LPTSTR msg;
    char  *str;
-   char  *disp;
 
    if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                       NULL,
@@ -128,10 +129,10 @@ evil_format_message(long err)
                       0,
                       NULL))
      {
-        char buf[4096];
-
-        snprintf(buf, 4096, "FormatMessage failed with error %ld\n", GetLastError());
-        return strdup(buf);
+        buf = (char *)TlsGetValue(_evil_tls_index);
+        snprintf(buf, 4096,
+                 "FormatMessage failed with error %ld\n", GetLastError());
+        return (const char *)buf;
      }
 
 #ifdef UNICODE
@@ -140,15 +141,8 @@ evil_format_message(long err)
    str = msg;
 #endif /* UNICODE */
 
-   disp = (char *)malloc((strlen(str) + strlen("(00000) ") + 1) * sizeof(char));
-   if (!disp)
-     {
-        LocalFree(msg);
-        return NULL;
-     }
-
-   snprintf(disp, strlen(str) + strlen("(00000) ") + 1,
-            "(%5ld) %s", err, str);
+   buf = (char *)TlsGetValue(_evil_tls_index);
+   snprintf(buf, 4096, "(%5ld) %s", err, str);
 
 #ifdef UNICODE
    free(str);
@@ -156,10 +150,10 @@ evil_format_message(long err)
 
    LocalFree(msg);
 
-   return disp;
+   return (const char *)buf;
 }
 
-char *
+const char *
 evil_last_error_get(void)
 {
    DWORD  err;
@@ -171,11 +165,7 @@ evil_last_error_get(void)
 static void
 _evil_last_error_display(const char *fct)
 {
-   char *error;
-
-   error = evil_last_error_get();
-   fprintf(stderr, "[Evil] [%s] ERROR: %s\n", fct, error);
-   free(error);
+   fprintf(stderr, "[Evil] [%s] ERROR: %s\n", fct, evil_last_error_get());
 }
 
 
index 8392d96..6b3e504 100644 (file)
@@ -59,9 +59,9 @@ EAPI char *evil_wchar_to_char(const wchar_t *text);
  */
 EAPI char *evil_utf16_to_utf8(const wchar_t *text);
 
-EAPI char *evil_format_message(long err);
+EAPI const char *evil_format_message(long err);
 
-EAPI char *evil_last_error_get(void);
+EAPI const char *evil_last_error_get(void);
 
 /**
  * @brief Return a dir to store temporary files.