Clean code and add comments
authorDaniel Zaoui <daniel.zaoui@yahoo.com>
Tue, 16 May 2017 07:16:22 +0000 (10:16 +0300)
committerDaniel Zaoui <daniel.zaoui@yahoo.com>
Mon, 5 Jun 2017 05:55:36 +0000 (08:55 +0300)
src/lib/eina/eina_debug.c
src/lib/eina/eina_debug.h

index 293afd9..fa88d18 100644 (file)
@@ -63,7 +63,10 @@ Eina_Spinlock _eina_debug_lock;
 
 // only init once
 static Eina_Bool _inited = EINA_FALSE;
-static char *_my_app_name = NULL;
+
+#ifdef __linux__
+extern char *__progname;
+#endif
 
 extern Eina_Bool eina_module_init(void);
 extern Eina_Bool eina_mempool_init(void);
@@ -86,14 +89,19 @@ static Eina_Hash *_modules_hash = NULL;
 
 static int _bridge_keep_alive_opcode = EINA_DEBUG_OPCODE_INVALID;
 
+/* Semaphore used by the debug thread to wait for another thread to do the
+ * requested job.
+ * It is needed when packets are needed to be treated into a specific
+ * thread.
+ */
 static Eina_Semaphore _thread_cmd_ready_sem;
 
+/* Used to encode/decode data on sending/reception */
 typedef void *(*Eina_Debug_Encode_Cb)(const void *buffer, unsigned int size, unsigned int *ret_size);
 typedef void *(*Eina_Debug_Decode_Cb)(const void *buffer, unsigned int size, unsigned int *ret_size);
 
 typedef struct
 {
-   int magic; /* Used to certify the validity of the struct */
    const Eina_Debug_Opcode *ops;
    Eina_Debug_Opcode_Status_Cb status_cb;
 } _opcode_reply_info;
@@ -105,17 +113,17 @@ struct _Eina_Debug_Session
    Eina_Debug_Dispatch_Cb dispatch_cb; /* Session dispatcher */
    Eina_Debug_Encode_Cb encode_cb; /* Packet encoder */
    Eina_Debug_Decode_Cb decode_cb; /* Packet decoder */
+   Eina_List *cmds; /* List of shell commands to send before the communication
+                     * with the daemon. Only used when a shell remote
+                     * connection is requested.
+                     */
    double encoding_ratio; /* Encoding ratio */
-   /* List of shell commands to send before the communication
-    * with the daemon. Only used when a shell remote connection is requested.
-    */
-   Eina_List *cmds;
    int cbs_length; /* cbs table size */
    int fd_in; /* File descriptor to read */
    int fd_out; /* File descriptor to write */
-   /* Indicator to wait for input before continuing sending commands.
-    * Only used in shell remote connections */
-   Eina_Bool wait_for_input : 1;
+   Eina_Bool wait_for_input : 1; /* Indicator to wait for input before
+                                  * continuing sending commands.
+                                  * Only used in shell remote connections */
 };
 
 static void _opcodes_register_all(Eina_Debug_Session *session);
@@ -181,14 +189,19 @@ _daemon_greet(Eina_Debug_Session *session)
    /* say hello to our debug daemon - tell them our PID and protocol
       version we speak */
    /* Version + Pid + App name */
-   int size = 8 + (_my_app_name ? strlen(_my_app_name) : 0) + 1;
+#ifdef __linux__
+   char *app_name = __progname;
+#else
+   char *app_name = NULL;
+#endif
+   int size = 8 + (app_name ? strlen(app_name) : 0) + 1;
    unsigned char *buf = alloca(size);
    int version = 1; // version of protocol we speak
    int pid = getpid();
    memcpy(buf + 0, &version, 4);
    memcpy(buf + 4, &pid, 4);
-   if (_my_app_name)
-      memcpy(buf + 8, _my_app_name, strlen(_my_app_name) + 1);
+   if (app_name)
+      memcpy(buf + 8, app_name, strlen(app_name) + 1);
    else
       buf[8] = '\0';
    eina_debug_session_send(session, 0, EINA_DEBUG_OPCODE_HELLO, buf, size);
@@ -330,7 +343,7 @@ _packet_receive(unsigned char **buffer)
           }
         else
           {
-             // we couldn't allocate memory for payloa buffer
+             // we couldn't allocate memory for payload buffer
              // internal memory limit error
              e_debug("Cannot allocate %u bytes for op", size);
              goto end;
@@ -369,11 +382,12 @@ eina_debug_session_dispatch_override(Eina_Debug_Session *session, Eina_Debug_Dis
    session->dispatch_cb = disp_cb;
 }
 
-typedef struct {
-     Eina_Module *handle;
-     Eina_Bool (*init)(void);
-     Eina_Bool (*shutdown)(void);
-     int ref;
+typedef struct
+{
+   Eina_Module *handle;
+   Eina_Bool (*init)(void);
+   Eina_Bool (*shutdown)(void);
+   int ref;
 } _module_info;
 
 #define _LOAD_SYMBOL(cls_struct, pkg, sym) \
@@ -467,15 +481,17 @@ _module_shutdown_cb(Eina_Debug_Session *session, int cid, void *buffer, int size
    return EINA_DEBUG_OK;
 }
 
-static const Eina_Debug_Opcode _EINA_DEBUG_MONITOR_OPS[] = {
-       {"module/init", &_module_init_opcode, &_module_init_cb},
-       {"module/shutdown", &_module_shutdown_opcode, &_module_shutdown_cb},
-       {NULL, NULL, NULL}
+static const Eina_Debug_Opcode _MONITOR_OPS[] =
+{
+     {"module/init", &_module_init_opcode, &_module_init_cb},
+     {"module/shutdown", &_module_shutdown_opcode, &_module_shutdown_cb},
+     {NULL, NULL, NULL}
 };
 
-static const Eina_Debug_Opcode _EINA_DEBUG_BRIDGE_OPS[] = {
-       {"Bridge/Keep-Alive", &_bridge_keep_alive_opcode, NULL},
-       {NULL, NULL, NULL}
+static const Eina_Debug_Opcode _BRIDGE_OPS[] =
+{
+     {"Bridge/Keep-Alive", &_bridge_keep_alive_opcode, NULL},
+     {NULL, NULL, NULL}
 };
 
 static void
@@ -542,7 +558,7 @@ _opcodes_registration_send(Eina_Debug_Session *session,
    int count = 0;
    int size = sizeof(uint64_t);
 
-   while(info->ops[count].opcode_name)
+   while (info->ops[count].opcode_name)
      {
         size += strlen(info->ops[count].opcode_name) + 1;
         count++;
@@ -555,7 +571,7 @@ _opcodes_registration_send(Eina_Debug_Session *session,
    int size_curr = sizeof(uint64_t);
 
    count = 0;
-   while(info->ops[count].opcode_name)
+   while (info->ops[count].opcode_name)
      {
         int len = strlen(info->ops[count].opcode_name) + 1;
         memcpy(buf + size_curr, info->ops[count].opcode_name, len);
@@ -626,7 +642,6 @@ eina_debug_local_connect(Eina_Bool is_master)
    char buf[4096];
    int fd, socket_unix_len, curstate = 0;
    struct sockaddr_un socket_unix;
-#endif
 
    Eina_Debug_Session *session = calloc(1, sizeof(*session));
    session->dispatch_cb = eina_debug_dispatch;
@@ -637,7 +652,6 @@ eina_debug_local_connect(Eina_Bool is_master)
    //   /var/run/UID/.ecore/efl_debug/0
    // either way a 4k buffer should be ebough ( if it's not we're on an
    // insane system)
-#ifndef _WIN32
    snprintf(buf, sizeof(buf), "%s/%s/%s/%i", _socket_home_get(), SERVER_PATH, SERVER_NAME,
          is_master ? SERVER_MASTER_PORT : SERVER_SLAVE_PORT);
    // create the socket
@@ -664,7 +678,7 @@ eina_debug_local_connect(Eina_Bool is_master)
    _daemon_greet(session);
    _opcodes_register_all(session);
    if (!is_master)
-      eina_debug_opcodes_register(session, _EINA_DEBUG_MONITOR_OPS, NULL);
+      eina_debug_opcodes_register(session, _MONITOR_OPS, NULL);
 
    _last_local_session = session;
    return session;
@@ -674,8 +688,7 @@ err:
    if (fd >= 0) close(fd);
    free(session);
 #else
-   (void) _session;
-   (void) type;
+   (void) is_master;
 #endif
    return NULL;
 }
@@ -757,14 +770,14 @@ eina_debug_shell_remote_connect(const char *cmds_str)
         eina_debug_session_shell_codec_enable(session);
         session->cmds = cmds;
         _cmd_consume(session);
-        eina_debug_opcodes_register(session, _EINA_DEBUG_BRIDGE_OPS, NULL);
+        eina_debug_opcodes_register(session, _BRIDGE_OPS, NULL);
         eina_debug_timer_add(10000, _bridge_keep_alive_send, session);
         // start the monitor thread
         _thread_start(session);
         return session;
      }
 #else
-   (void) cmd;
+   (void) cmds_str;
    return NULL;
 #endif
 }
@@ -794,8 +807,8 @@ _monitor(void *_data)
    // impact the application specifically
    for (;_session;)
      {
-        int size;
         unsigned char *buffer;
+        int size;
 
         size = _packet_receive(&buffer);
         // if not negative - we have a real message
@@ -810,12 +823,6 @@ _monitor(void *_data)
              if (_session->dispatch_cb == eina_debug_dispatch)
                 free(buffer);
           }
-#if 0
-        else if (size == 0)
-          {
-             // May be due to a response from a script line
-          }
-#endif
         else
           {
              close(_session->fd_in);
@@ -864,7 +871,7 @@ _thread_start(Eina_Debug_Session *session)
 /*
  * Sends to daemon:
  * - Pointer to ops: returned in the response to determine which opcodes have been added
- * - List of opcode names seperated by \0
+ * - List of opcode names separated by \0
  */
 EAPI void
 eina_debug_opcodes_register(Eina_Debug_Session *session, const Eina_Debug_Opcode ops[],
@@ -880,7 +887,8 @@ eina_debug_opcodes_register(Eina_Debug_Session *session, const Eina_Debug_Opcode
    session->opcode_reply_infos = eina_list_append(
          session->opcode_reply_infos, info);
 
-   //send only if _session's fd connected, if not -  it will be sent when connected
+   /* Send only if _session's fd connected.
+    * Otherwise, it will be sent when connected */
    if(session && session->fd_in != -1 && !session->cmds)
       _opcodes_registration_send(session, info);
 }
@@ -986,8 +994,8 @@ eina_debug_dispatch(Eina_Debug_Session *session, void *buffer)
                   _eina_debug_thread_active[i].cmd_session = session;
                   _eina_debug_thread_active[i].cmd_buffer = buffer;
                   _eina_debug_thread_active[i].cmd_result = EINA_DEBUG_OK;
-                  pthread_kill(_eina_debug_thread_active[i].thread, SIG);
-                  nb_calls++;
+                  if (!pthread_kill(_eina_debug_thread_active[i].thread, SIG))
+                     nb_calls++;
                }
           }
         eina_spinlock_release(&_eina_debug_thread_lock);
@@ -1018,8 +1026,8 @@ eina_debug_dispatch(Eina_Debug_Session *session, void *buffer)
                                }
                           case EINA_DEBUG_AGAIN:
                                {
-                                  pthread_kill(_eina_debug_thread_active[i].thread, SIG);
-                                  nb_calls++;
+                                  if (!pthread_kill(_eina_debug_thread_active[i].thread, SIG))
+                                     nb_calls++;
                                   break;
                                }
                           default: break;
@@ -1057,10 +1065,6 @@ _signal_handler(int sig EINA_UNUSED,
    eina_semaphore_release(&_thread_cmd_ready_sem, 1);
 }
 
-#ifdef __linux__
-   extern char *__progname;
-#endif
-
 static void
 _signal_init(void)
 {
@@ -1072,7 +1076,7 @@ _signal_init(void)
    sa.sa_flags = SA_RESTART | SA_SIGINFO;
    sigemptyset(&sa.sa_mask);
    if (sigaction(SIG, &sa, NULL) != 0)
-     e_debug("EINA DEBUG ERROR: Can't set up sig %i handler!", SIG);
+      e_debug("EINA DEBUG ERROR: Can't set up sig %i handler!", SIG);
 
    sa.sa_sigaction = NULL;
    sa.sa_handler = SIG_IGN;
@@ -1112,9 +1116,6 @@ eina_debug_init(void)
    // if someone uses the EFL_NODEBUG env var or disabled debug - do not do
    // debugging. handy for when this debug code is buggy itself
 
-#ifdef __linux__
-   _my_app_name = __progname;
-#endif
    if (!getenv("EFL_NODEBUG") && !_debug_disabled)
      {
         eina_debug_local_connect(EINA_FALSE);
index 3d52bbf..a955f76 100644 (file)
  * @{
  */
 
+/** Used as a return value for callbacks invoked by the dispatcher */
 typedef enum
 {
-   EINA_DEBUG_OK,
-   EINA_DEBUG_ERROR,
-   EINA_DEBUG_AGAIN
+   EINA_DEBUG_OK, /**< Success */
+   EINA_DEBUG_ERROR, /**< Error in packet - will close the connection */
+   EINA_DEBUG_AGAIN /**< Recall the callback - may due to resources unavailability at the invocation time */
 } Eina_Debug_Error;
 
 enum
@@ -142,7 +143,7 @@ typedef struct
  *
  * Useful for applications that don't want debugging. The debug daemon is one
  * of them.
- * Need to be invoked before eina_init. Otherwise it can't have any effect.
+ * Need to be invoked before eina_init. Otherwise it won't have any effect.
  */
 EAPI void eina_debug_disable(void);
 
@@ -293,6 +294,12 @@ EAPI Eina_Debug_Timer *eina_debug_timer_add(unsigned int timeout_ms, Eina_Debug_
  */
 EAPI void eina_debug_timer_del(Eina_Debug_Timer *timer);
 
+/**
+ * @brief Get an id of the current thread
+ *
+ * This id corresponds to the index in the Eina threads table where the thread
+ * information is stored.
+ */
 EAPI int eina_debug_thread_id_get(void);
 
 #endif