Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Better choice of what is debug and what is verbose
[simgrid.git] / src / gras / DataDesc / ddt_exchange.c
index 15c9a65..62873e4 100644 (file)
@@ -11,9 +11,9 @@
 
 #include "xbt/ex.h"
 #include "gras/DataDesc/datadesc_private.h"
-#include "gras/Transport/transport_interface.h" /* gras_trp_chunk_send/recv */
+#include "gras/Transport/transport_interface.h" /* gras_trp_send/recv */
 
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(ddt_exchange,datadesc,
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_ddt_exchange,gras_ddt,
                                 "Sending data over the network");
 const char *gras_datadesc_cat_names[9] = { 
   "undefined", 
@@ -22,27 +22,17 @@ const char *gras_datadesc_cat_names[9] = {
 
 static gras_datadesc_type_t int_type = NULL;
 static gras_datadesc_type_t pointer_type = NULL;    
-static _XBT_INLINE void gras_dd_send_int(gras_socket_t sock,             int  i);
-static _XBT_INLINE void gras_dd_recv_int(gras_socket_t sock, int r_arch, int *i);
 
 static _XBT_INLINE void
-gras_dd_alloc_ref(xbt_dict_t  refs,  long int     size,
-                 char       **r_ref, long int     r_len,
-                 char       **l_ref, int detect_cycle);
-
-static _XBT_INLINE int
-gras_dd_is_r_null(char **r_ptr, long int length);
-
-static _XBT_INLINE void
-gras_dd_send_int(gras_socket_t sock,int i) {
+gras_dd_send_int(gras_socket_t sock,int *i, int stable) {
 
   if (!int_type) {
     int_type = gras_datadesc_by_name("int");
      xbt_assert(int_type);  
   }
    
-  DEBUG1("send_int(%d)",i);
-  gras_trp_chunk_send(sock, (char*)&i, int_type->size[GRAS_THISARCH]);
+  DEBUG1("send_int(%d)",*i);
+  gras_trp_send(sock, (char*)i, int_type->size[GRAS_THISARCH], stable);
 }
 
 static _XBT_INLINE void
@@ -54,13 +44,13 @@ gras_dd_recv_int(gras_socket_t sock, int r_arch, int *i) {
   }
 
   if (int_type->size[GRAS_THISARCH] >= int_type->size[r_arch]) {
-    gras_trp_chunk_recv(sock, (char*)i, int_type->size[r_arch]);
+    gras_trp_recv(sock, (char*)i, int_type->size[r_arch]);
     if (r_arch != GRAS_THISARCH)
       gras_dd_convert_elm(int_type,1,r_arch, i,i);
   } else {
     void *ptr = xbt_malloc(int_type->size[r_arch]);
 
-    gras_trp_chunk_recv(sock, (char*)ptr, int_type->size[r_arch]);
+    gras_trp_recv(sock, (char*)ptr, int_type->size[r_arch]);
     if (r_arch != GRAS_THISARCH)
       gras_dd_convert_elm(int_type,1,r_arch, ptr,i);
     free(ptr);
@@ -132,8 +122,8 @@ gras_datadesc_copy_rec(gras_cbps_t           state,
 
   VERB4("Copy a %s (%s) from %p to %p", 
        type->name, gras_datadesc_cat_names[type->category_code],
-       src,dst);
-
+       src,dst);       
+   
   if (type->send) {
     type->send(type,state,src);
   }
@@ -164,9 +154,27 @@ gras_datadesc_copy_rec(gras_cbps_t           state,
       if (field->send)
        field->send(type,state,field_src);
       
-      VERB1("Copy field %s",field->name);
+      DEBUG1("Copy field %s",field->name);
       count += gras_datadesc_copy_rec(state,refs,sub_type, field_src, field_dst, 0,
                                      detect_cycle || sub_type->cycle);
+       
+       if (XBT_LOG_ISENABLED(gras_ddt_exchange,xbt_log_priority_verbose)) {
+         if (sub_type == gras_datadesc_by_name("unsigned int")) {
+            VERB2("Copied value for field %s: %d (type: unsigned int)",field->name, *(unsigned int*)field_dst);
+         } else if (sub_type == gras_datadesc_by_name("int")) {
+            VERB2("Copied value for field %s: %d (type: int)",field->name, *(int*)field_dst);
+            
+         } else if (sub_type == gras_datadesc_by_name("unsigned long int")) {
+            VERB2("Copied value for field %s: %ld (type: unsigned long int)",field->name, *(unsigned long int*)field_dst);
+         } else if (sub_type == gras_datadesc_by_name("long int")) {
+            VERB2("Copied value for field %s: %ld (type: long int)",field->name, *(long int*)field_dst);
+
+         } else if (sub_type == gras_datadesc_by_name("string")) {
+            VERB2("Copied value for field %s: '%s' (type: string)", field->name, *(char**)field_dst);   
+         } else {
+            VERB1("Copied a value for field %s (type not scalar?)", field->name);
+         }
+       }
       
     }
     VERB1("<< Copied all fields of the structure %s", type->name);
@@ -297,7 +305,7 @@ gras_datadesc_copy_rec(gras_cbps_t           state,
 
   case e_gras_datadesc_type_cat_array: {
     gras_dd_cat_array_t    array_data;
-    long int               count;
+    long int               array_count;
     char                  *src_ptr=src;
     char                  *dst_ptr=dst;
     long int               elm_size;
@@ -305,12 +313,12 @@ gras_datadesc_copy_rec(gras_cbps_t           state,
     array_data = type->category.array_data;
     
     /* determine and send the element count */
-    count = array_data.fixed_size;
-    if (count == 0)
-      count = subsize;
-    if (count == 0) {
-      count = array_data.dynamic_size(type,state,src);
-      xbt_assert1(count >=0,
+    array_count = array_data.fixed_size;
+    if (array_count == 0)
+      array_count = subsize;
+    if (array_count == 0) {
+      array_count = array_data.dynamic_size(type,state,src);
+      xbt_assert1(array_count >=0,
                   "Invalid (negative) array size for type %s",type->name);
     }
     
@@ -318,21 +326,24 @@ gras_datadesc_copy_rec(gras_cbps_t           state,
     sub_type = array_data.type;
     elm_size = sub_type->aligned_size[GRAS_THISARCH];
     if (sub_type->category_code == e_gras_datadesc_type_cat_scalar) {
-      VERB1("Array of %ld scalars, copy it in one shot",count);
-      memcpy(dst, src, sub_type->aligned_size[GRAS_THISARCH] * count);
-      count += sub_type->aligned_size[GRAS_THISARCH] * count;
+      VERB1("Array of %ld scalars, copy it in one shot",array_count);
+      memcpy(dst, src, sub_type->aligned_size[GRAS_THISARCH] * array_count);
+      count += sub_type->aligned_size[GRAS_THISARCH] * array_count;
     } else if (sub_type->category_code == e_gras_datadesc_type_cat_array &&
               sub_type->category.array_data.fixed_size > 0 &&
               sub_type->category.array_data.type->category_code == e_gras_datadesc_type_cat_scalar) {
        
-      VERB1("Array of %ld fixed array of scalars, copy it in one shot",count);
+      VERB1("Array of %ld fixed array of scalars, copy it in one shot",
+           array_count);
       memcpy(dst,src,sub_type->category.array_data.type->aligned_size[GRAS_THISARCH] 
-                    * count * sub_type->category.array_data.fixed_size);
+                    * array_count * sub_type->category.array_data.fixed_size);
       count += sub_type->category.array_data.type->aligned_size[GRAS_THISARCH] 
-              * count * sub_type->category.array_data.fixed_size;
+              * array_count * sub_type->category.array_data.fixed_size;
        
     } else {
-      for (cpt=0; cpt<count; cpt++) {
+      VERB1("Array of %ld stuff, copy it in one after the other",array_count);
+      for (cpt=0; cpt<array_count; cpt++) {
+       VERB2("Copy the %dth stuff out of %ld",cpt,array_count);
        count += gras_datadesc_copy_rec(state,refs, sub_type, src_ptr, dst_ptr, 0,
                                        detect_cycle || sub_type->cycle);
        src_ptr += elm_size;
@@ -345,6 +356,7 @@ gras_datadesc_copy_rec(gras_cbps_t           state,
   default:
     xbt_assert0(0, "Invalid type");
   }
+   
   return count;
 }
 /**
@@ -397,13 +409,17 @@ gras_datadesc_send_rec(gras_socket_t         sock,
   VERB2("Send a %s (%s)", 
        type->name, gras_datadesc_cat_names[type->category_code]);
 
+  if (!strcmp(type->name,"string"))
+    VERB1("value: '%s'",*(char**)data);
+
   if (type->send) {
     type->send(type,state,data);
+    DEBUG0("Run the emission callback");
   }
 
   switch (type->category_code) {
   case e_gras_datadesc_type_cat_scalar:
-    gras_trp_chunk_send(sock, data, type->size[GRAS_THISARCH]);
+    gras_trp_send(sock, data, type->size[GRAS_THISARCH], 1);
     break;
 
   case e_gras_datadesc_type_cat_struct: {
@@ -422,8 +438,10 @@ gras_datadesc_send_rec(gras_socket_t         sock,
       
       sub_type = field->type;
       
-      if (field->send)
+      if (field->send) {
+       DEBUG1("Run the emission callback of field %s", field->name);
        field->send(type,state,field_data);
+      }
       
       VERB1("Send field %s",field->name);
       gras_datadesc_send_rec(sock,state,refs,sub_type, field_data, 
@@ -457,7 +475,7 @@ gras_datadesc_send_rec(gras_socket_t         sock,
                 type->name, field_num, xbt_dynar_length(union_data.fields));
 
     /* Send the field number */
-    gras_dd_send_int(sock, field_num);
+    gras_dd_send_int(sock, &field_num, 0 /* not stable */);
     
     /* Send the content */
     field = xbt_dynar_get_as(union_data.fields, field_num, gras_dd_cat_field_t);
@@ -483,7 +501,7 @@ gras_datadesc_send_rec(gras_socket_t         sock,
     sub_type = ref_data.type;
     if (sub_type == NULL) {
       sub_type = (*ref_data.selector)(type,state,data);
-      gras_dd_send_int(sock, sub_type->code);
+      gras_dd_send_int(sock, (int*) &(sub_type->code),1 /*stable*/);
     }
     
     /* Send the actual value of the pointer for cycle handling */
@@ -492,8 +510,8 @@ gras_datadesc_send_rec(gras_socket_t         sock,
       xbt_assert(pointer_type);
     }
      
-    gras_trp_chunk_send(sock, (char*)data,
-                       pointer_type->size[GRAS_THISARCH]);
+    gras_trp_send(sock, (char*)data,
+                 pointer_type->size[GRAS_THISARCH], 1 /*stable*/);
     
     /* Send the pointed data only if not already sent */
     if (*(void**)data == NULL) {
@@ -531,7 +549,7 @@ gras_datadesc_send_rec(gras_socket_t         sock,
 
   case e_gras_datadesc_type_cat_array: {
     gras_dd_cat_array_t    array_data;
-    long int               count;
+    int                    count;
     char                  *ptr=data;
     long int               elm_size;
     
@@ -543,24 +561,26 @@ gras_datadesc_send_rec(gras_socket_t         sock,
       count = array_data.dynamic_size(type,state,data);
       xbt_assert1(count >=0,
                   "Invalid (negative) array size for type %s",type->name);
-      gras_dd_send_int(sock, count);
+      gras_dd_send_int(sock, &count, 0/*non-stable*/);
     }
     
     /* send the content */
     sub_type = array_data.type;
     elm_size = sub_type->aligned_size[GRAS_THISARCH];
     if (sub_type->category_code == e_gras_datadesc_type_cat_scalar) {
-      VERB1("Array of %ld scalars, send it in one shot",count);
-      gras_trp_chunk_send(sock, data, 
-                         sub_type->aligned_size[GRAS_THISARCH] * count);
+      VERB1("Array of %d scalars, send it in one shot",count);
+      gras_trp_send(sock, data, 
+                   sub_type->aligned_size[GRAS_THISARCH] * count,
+                   0 /* not stable */);
     } else if (sub_type->category_code == e_gras_datadesc_type_cat_array &&
               sub_type->category.array_data.fixed_size > 0 &&
               sub_type->category.array_data.type->category_code == e_gras_datadesc_type_cat_scalar) {
        
-      VERB1("Array of %ld fixed array of scalars, send it in one shot",count);
-      gras_trp_chunk_send(sock, data, 
-                         sub_type->category.array_data.type->aligned_size[GRAS_THISARCH] 
-                         * count * sub_type->category.array_data.fixed_size);
+      VERB1("Array of %d fixed array of scalars, send it in one shot",count);
+      gras_trp_send(sock, data, 
+                   sub_type->category.array_data.type->aligned_size[GRAS_THISARCH] 
+                   * count * sub_type->category.array_data.fixed_size,
+                   0 /* not stable */);
        
     } else {
       for (cpt=0; cpt<count; cpt++) {
@@ -588,19 +608,20 @@ void gras_datadesc_send(gras_socket_t        sock,
                        void *src) {
 
   xbt_ex_t e;
-  gras_cbps_t  state;
+  static gras_cbps_t state=NULL;
   xbt_dict_t  refs; /* all references already sent */
  
   xbt_assert0(type,"called with NULL type descriptor");
 
   refs = xbt_dict_new();
-  state = gras_cbps_new();
+  if (!state)
+    state = gras_cbps_new();
   
   TRY {
     gras_datadesc_send_rec(sock,state,refs,type,(char*)src, type->cycle);
   } CLEANUP {
     xbt_dict_free(&refs);
-    gras_cbps_free(&state);
+    gras_cbps_reset(state);
   } CATCH(e) {
     RETHROW;
   }
@@ -640,13 +661,13 @@ gras_datadesc_recv_rec(gras_socket_t         sock,
   switch (type->category_code) {
   case e_gras_datadesc_type_cat_scalar:
     if (type->size[GRAS_THISARCH] == type->size[r_arch]) {
-      gras_trp_chunk_recv(sock, (char*)l_data, type->size[r_arch]);
+      gras_trp_recv(sock, (char*)l_data, type->size[r_arch]);
       if (r_arch != GRAS_THISARCH)
        gras_dd_convert_elm(type,1,r_arch, l_data,l_data);
     } else {
       void *ptr = xbt_malloc(type->size[r_arch]);
 
-      gras_trp_chunk_recv(sock, (char*)ptr, type->size[r_arch]);
+      gras_trp_recv(sock, (char*)ptr, type->size[r_arch]);
       if (r_arch != GRAS_THISARCH)
        gras_dd_convert_elm(type,1,r_arch, ptr,l_data);
       free(ptr);
@@ -673,8 +694,10 @@ gras_datadesc_recv_rec(gras_socket_t         sock,
                             field_data,-1, 
                             detect_cycle || sub_type->cycle);
        
-      if (field->recv)
+      if (field->recv) {
+       DEBUG1("Run the reception callback of field %s", field->name);
         field->recv(type,state,(void*)l_data);
+      }
     
     }
     VERB1("<< Received all fields of the structure %s", type->name);
@@ -740,8 +763,8 @@ gras_datadesc_recv_rec(gras_socket_t         sock,
 
     r_ref = xbt_malloc(pointer_type->size[r_arch]);
 
-    gras_trp_chunk_recv(sock, (char*)r_ref,
-                       pointer_type->size[r_arch]);
+    gras_trp_recv(sock, (char*)r_ref,
+                 pointer_type->size[r_arch]);
 
     /* Receive the pointed data only if not already sent */
     if (gras_dd_is_r_null(r_ref, pointer_type->size[r_arch])) {
@@ -838,15 +861,15 @@ gras_datadesc_recv_rec(gras_socket_t         sock,
       VERB1("Array of %d scalars, get it in one shoot", count);
       if (sub_type->aligned_size[GRAS_THISARCH] >= 
          sub_type->aligned_size[r_arch]) {
-       gras_trp_chunk_recv(sock, (char*)l_data, 
-                           sub_type->aligned_size[r_arch] * count);
+       gras_trp_recv(sock, (char*)l_data, 
+                     sub_type->aligned_size[r_arch] * count);
        if (r_arch != GRAS_THISARCH)
          gras_dd_convert_elm(sub_type,count,r_arch, l_data,l_data);
       } else {
        ptr = xbt_malloc(sub_type->aligned_size[r_arch] * count);
 
-       gras_trp_chunk_recv(sock, (char*)ptr, 
-                           sub_type->size[r_arch] * count);
+       gras_trp_recv(sock, (char*)ptr, 
+                     sub_type->size[r_arch] * count);
        if (r_arch != GRAS_THISARCH)
          gras_dd_convert_elm(sub_type,count,r_arch, ptr,l_data);
        free(ptr);
@@ -861,16 +884,16 @@ gras_datadesc_recv_rec(gras_socket_t         sock,
       VERB1("Array of %d fixed array of scalars, get it in one shot",count);
       if (subsub_type->aligned_size[GRAS_THISARCH] >= 
          subsub_type->aligned_size[r_arch]) {
-       gras_trp_chunk_recv(sock, (char*)l_data, 
-                           subsub_type->aligned_size[r_arch] * count * 
-                           array_data.fixed_size);
+       gras_trp_recv(sock, (char*)l_data, 
+                     subsub_type->aligned_size[r_arch] * count * 
+                     array_data.fixed_size);
        if (r_arch != GRAS_THISARCH)
          gras_dd_convert_elm(subsub_type,count*array_data.fixed_size,r_arch, l_data,l_data);
       } else {
        ptr = xbt_malloc(subsub_type->aligned_size[r_arch] * count*array_data.fixed_size);
 
-       gras_trp_chunk_recv(sock, (char*)ptr, 
-                           subsub_type->size[r_arch] * count*array_data.fixed_size);
+       gras_trp_recv(sock, (char*)ptr, 
+                     subsub_type->size[r_arch] * count*array_data.fixed_size);
        if (r_arch != GRAS_THISARCH)
          gras_dd_convert_elm(subsub_type,count*array_data.fixed_size,r_arch, ptr,l_data);
        free(ptr);
@@ -901,6 +924,9 @@ gras_datadesc_recv_rec(gras_socket_t         sock,
   if (type->recv)
     type->recv(type,state,l_data);
 
+  if (!strcmp(type->name,"string"))
+    VERB1("value: '%s'",*(char**)l_data);
+
 }
 
 /**
@@ -917,11 +943,12 @@ gras_datadesc_recv(gras_socket_t         sock,
                   void                 *dst) {
 
   xbt_ex_t e;
-  gras_cbps_t  state; /* callback persistent state */
+  static gras_cbps_t state=NULL; /* callback persistent state */
   xbt_dict_t  refs;  /* all references already sent */
 
   refs = xbt_dict_new();
-  state = gras_cbps_new();
+  if (!state)
+    state = gras_cbps_new();
 
   xbt_assert0(type,"called with NULL type descriptor");
   TRY {
@@ -931,7 +958,7 @@ gras_datadesc_recv(gras_socket_t         sock,
                           type->cycle);
   } CLEANUP {
     xbt_dict_free(&refs);
-    gras_cbps_free(&state);
+    gras_cbps_reset(state);
   } CATCH(e) {
     RETHROW;
   }