Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Yeah, right. We should prevent to push the socket into the dynar in gras_trp_socket_n...
[simgrid.git] / src / gras / Transport / transport_plugin_file.c
index a85fa4b..de41f4d 100644 (file)
@@ -8,10 +8,10 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "portable.h"
-#include "transport_private.h"
+#include "gras/Transport/transport_private.h"
 #include "xbt/ex.h"
 
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(trp_file,transport,
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_trp_file,gras_trp,
        "Pseudo-transport to write to/read from a file");
 
 /***
@@ -19,14 +19,17 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(trp_file,transport,
  ***/
 void gras_trp_file_close(gras_socket_t sd);
   
+void gras_trp_file_chunk_send_raw(gras_socket_t sd,
+                                 const char *data,
+                                 unsigned long int size);
 void gras_trp_file_chunk_send(gras_socket_t sd,
                              const char *data,
-                             unsigned long int size);
-
-void gras_trp_file_chunk_recv(gras_socket_t sd,
-                             char *data,
-                             unsigned long int size);
+                             unsigned long int size,
+                             int stable_ignored);
 
+int gras_trp_file_chunk_recv(gras_socket_t sd,
+                            char *data,
+                            unsigned long int size);
 
 /***
  *** Specific plugin part
@@ -53,8 +56,12 @@ gras_trp_file_setup(gras_trp_plugin_t plug) {
   FD_ZERO(&(file->incoming_socks));
 
   plug->socket_close = gras_trp_file_close;
-  plug->chunk_send   = gras_trp_file_chunk_send;
-  plug->chunk_recv   = gras_trp_file_chunk_recv;
+
+  plug->raw_send = gras_trp_file_chunk_send_raw;
+  plug->send = gras_trp_file_chunk_send;
+
+  plug->raw_recv = plug->recv = gras_trp_file_chunk_recv;
+
   plug->data         = (void*)file;
 }
 
@@ -88,6 +95,7 @@ gras_socket_client_from_file(const char*path) {
     res->sd = 1; /* stdout */
   }
 
+  res->recv_ok=0;
   DEBUG5("sock_client_from_file(%s): sd=%d in=%c out=%c accept=%c",
         path,
         res->sd,
@@ -95,6 +103,8 @@ gras_socket_client_from_file(const char*path) {
         res->outgoing?'y':'n',
         res->accepting?'y':'n');
 
+  xbt_dynar_push(((gras_trp_procdata_t)
+                 gras_libdata_by_id(gras_trp_libdata_id))->sockets,&res);
   return res;
 }
 
@@ -134,6 +144,9 @@ gras_socket_t gras_socket_server_from_file(const char*path) {
         res->outgoing?'y':'n',
         res->accepting?'y':'n');
 
+  res->recv_ok=0;
+  xbt_dynar_push(((gras_trp_procdata_t)
+                 gras_libdata_by_id(gras_trp_libdata_id))->sockets,&res);
   return res;
 }
 
@@ -169,7 +182,14 @@ void gras_trp_file_close(gras_socket_t sock){
 void
 gras_trp_file_chunk_send(gras_socket_t sock,
                         const char *data,
-                        unsigned long int size) {
+                        unsigned long int size,
+                        int stable_ignored) {
+  gras_trp_file_chunk_send_raw(sock,data,size);
+}
+void
+gras_trp_file_chunk_send_raw(gras_socket_t sock,
+                            const char *data,
+                            unsigned long int size) {
   
   xbt_assert0(sock->outgoing, "Cannot write on client file socket");
   xbt_assert0(size >= 0, "Cannot send a negative amount of data");
@@ -199,33 +219,36 @@ gras_trp_file_chunk_send(gras_socket_t sock,
  *
  * Receive data on a file pseudo-socket.
  */
-void
+int
 gras_trp_file_chunk_recv(gras_socket_t sock,
                         char *data,
                         unsigned long int size) {
 
+  int got = 0;
+
   xbt_assert0(sock, "Cannot recv on an NULL socket");
   xbt_assert0(sock->incoming, "Cannot recv on client file socket");
   xbt_assert0(size >= 0, "Cannot receive a negative amount of data");
-  
+
   while (size) {
     int status = 0;
     
-    status = read(sock->sd, data, (long int)size);
-    DEBUG3("read(%d, %p, %ld);", sock->sd, data, size);
+    status = read(sock->sd, data+got, (long int)size);
+    DEBUG3("read(%d, %p, %ld);", sock->sd, data+got, size);
     
     if (status == -1) {
       THROW4(system_error,0,"read(%d,%p,%d) failed: %s",
-            sock->sd, data, (int)size,
+            sock->sd, data+got, (int)size,
             strerror(errno));
     }
     
     if (status) {
-      size  -= status;
-      data  += status;
+      size    -= status;
+      got    += status;
     } else {
       THROW0(system_error,0,"file descriptor closed");
     }
   }
+  return got;
 }