Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Do not use recv() but read() to check whether a socket returned by select() is valid...
[simgrid.git] / src / gras / Transport / transport_private.h
index 630d887..1a04218 100644 (file)
 
 #include "xbt/sysdep.h"
 #include "xbt/log.h"
 
 #include "xbt/sysdep.h"
 #include "xbt/log.h"
-#include "xbt/error.h"
 #include "xbt/dynar.h"
 #include "xbt/dict.h"
 
 #include "xbt/dynar.h"
 #include "xbt/dict.h"
 
-#include "gras/cond.h"       /* gras_if_RL() */
+#include "gras/emul.h"       /* gras_if_RL() */
 
 #include "gras_modinter.h"   /* module init/exit */
 #include "gras/transport.h"  /* rest of module interface */
 
 #include "gras/Transport/transport_interface.h" /* semi-public API */
 
 #include "gras_modinter.h"   /* module init/exit */
 #include "gras/transport.h"  /* rest of module interface */
 
 #include "gras/Transport/transport_interface.h" /* semi-public API */
-#include "gras/Virtu/virtu_interface.h" /* socketset_get() */
+#include "gras/Virtu/virtu_interface.h" /* libdata management */
+
+extern int gras_trp_libdata_id; /* our libdata identifier */
+
+/* The function that select returned the last time we asked. We need this
+   because the TCP read are greedy and try to get as much data in their 
+   buffer as possible (to avoid subsequent syscalls).
+   (measurement sockets are not buffered and thus not concerned).
+  
+   So, we can get more than one message in one shoot. And when this happens,
+   we have to handle the same socket again afterward without select()ing at
+   all. 
+   Then, this data is not a static of the TCP driver because we want to
+   zero it when it gets closed by the user. If not, we use an already freed 
+   pointer, which is bad.
+   It gets tricky since gras_socket_close is part of the common API, not 
+   only the RL one. */
+extern gras_socket_t _gras_lastly_selected_socket;
 
 /**
  * s_gras_socket:
 
 /**
  * s_gras_socket:
 typedef struct gras_trp_bufdata_ gras_trp_bufdata_t;
 
 typedef struct s_gras_socket  {
 typedef struct gras_trp_bufdata_ gras_trp_bufdata_t;
 
 typedef struct s_gras_socket  {
-  gras_trp_plugin_t *plugin;
+  gras_trp_plugin_t plugin;
     
   int incoming :1; /* true if we can read from this sock */
   int outgoing :1; /* true if we can write on this sock */
   int accepting :1; /* true if master incoming sock in tcp */
     
   int incoming :1; /* true if we can read from this sock */
   int outgoing :1; /* true if we can write on this sock */
   int accepting :1; /* true if master incoming sock in tcp */
-  int raw :1; /* true if this is an experiment socket instead of messaging */
-
-  unsigned long int bufSize; /* what to say to the OS. field here to remember it when accepting */
+  int meas :1; /* true if this is an experiment socket instead of messaging */
+  int valid :1; /* false if a select returned that the peer quitted, forcing us to "close" the socket */
+  int moredata :1; /* TCP socket use a buffer and read operation get as much 
+                     data as possible. It is possible that several messages
+                     are received in one shoot, and select won't catch them 
+                     afterward again. 
+                     This boolean indicates that this is the case, so that we
+                     don't call select in that case.  Note that measurement
+                     sockets are not concerned since they use the TCP
+                     interface directly, with no buffer. */
+   
+  int recvd :1; /* true if the recvd_val field contains one byte of the stream (that we peek'ed to check the socket validity) */
+  char recvd_val; /* what we peeked from the socket, if any */
+   
+  unsigned long int buf_size; /* what to say to the OS. 
+                                Field here to remember it when accepting */
    
   int  sd; 
   int  port; /* port on this side */
   int  peer_port; /* port on the other side */
   char *peer_name; /* hostname of the other side */
    
   int  sd; 
   int  port; /* port on this side */
   int  peer_port; /* port on the other side */
   char *peer_name; /* hostname of the other side */
+  char *peer_proc; /* process on the other side */
 
   void *data;    /* plugin specific data */
 
 
   void *data;    /* plugin specific data */
 
@@ -58,20 +90,20 @@ void gras_trp_socket_new(int incomming,
                         gras_socket_t *dst);
 
 /* The drivers */
                         gras_socket_t *dst);
 
 /* The drivers */
-typedef xbt_error_t (*gras_trp_setup_t)(gras_trp_plugin_t *dst);
+typedef void (*gras_trp_setup_t)(gras_trp_plugin_t dst);
 
 
-xbt_error_t gras_trp_tcp_setup(gras_trp_plugin_t *plug);
-xbt_error_t gras_trp_file_setup(gras_trp_plugin_t *plug);
-xbt_error_t gras_trp_sg_setup(gras_trp_plugin_t *plug);
-xbt_error_t gras_trp_buf_setup(gras_trp_plugin_t *plug);
+void gras_trp_tcp_setup(gras_trp_plugin_t plug);
+void gras_trp_iov_setup(gras_trp_plugin_t plug);
+void gras_trp_file_setup(gras_trp_plugin_t plug);
+void gras_trp_sg_setup(gras_trp_plugin_t plug);
 
 
-/*
+/* FIXME: this should be solved by SIMIX
 
   I'm tired of that shit. the select in SG has to create a socket to expeditor
   manually do deal with the weirdness of the hostdata, themselves here to deal
   with the weird channel concept of SG and convert them back to ports.
   
 
   I'm tired of that shit. the select in SG has to create a socket to expeditor
   manually do deal with the weirdness of the hostdata, themselves here to deal
   with the weird channel concept of SG and convert them back to ports.
   
-  When introducing buffered transport (whith I want to get used in SG to debug
+  When introducing buffered transport (which I want to get used in SG to debug
   the buffering itself), we should not make the rest of the code aware of the
   change and not specify code for this. This is bad design.
   
   the buffering itself), we should not make the rest of the code aware of the
   change and not specify code for this. This is bad design.
   
@@ -83,14 +115,6 @@ xbt_error_t gras_trp_buf_setup(gras_trp_plugin_t *plug);
 
 */
 
 
 */
 
-void gras_trp_buf_init_sock(gras_socket_t sock);
-
-
-/* Data exchange over raw sockets */
-xbt_error_t gras_socket_raw_exchange(gras_socket_t peer,
-                                     int sender,
-                                     unsigned int timeout,
-                                     unsigned long int expSize,
-                                     unsigned long int msgSize);
+gras_socket_t gras_trp_buf_init_sock(gras_socket_t sock);
 
 #endif /* GRAS_TRP_PRIVATE_H */
 
 #endif /* GRAS_TRP_PRIVATE_H */