Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
take care of new dll import and dll export in Windows
[simgrid.git] / src / gras / Transport / transport_private.h
index 9b384ec..21fb874 100644 (file)
 #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:
  * 
@@ -44,7 +58,8 @@ typedef struct s_gras_socket  {
   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. */
+                     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. */
 
   unsigned long int buf_size; /* what to say to the OS. field here to remember it when accepting */
    
@@ -60,16 +75,16 @@ typedef struct s_gras_socket  {
   gras_trp_bufdata_t *bufdata; 
 }s_gras_socket_t;
        
-void gras_trp_socket_new(int incomming,
+XBT_PUBLIC(void) gras_trp_socket_new(int incomming,
                         gras_socket_t *dst);
 
 /* The drivers */
 typedef void (*gras_trp_setup_t)(gras_trp_plugin_t dst);
 
-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);
+XBT_PUBLIC(void) gras_trp_tcp_setup(gras_trp_plugin_t plug);
+XBT_PUBLIC(void) gras_trp_iov_setup(gras_trp_plugin_t plug);
+XBT_PUBLIC(void) gras_trp_file_setup(gras_trp_plugin_t plug);
+XBT_PUBLIC(void) gras_trp_sg_setup(gras_trp_plugin_t plug);
 
 /*
 
@@ -89,6 +104,6 @@ void gras_trp_sg_setup(gras_trp_plugin_t plug);
 
 */
 
-gras_socket_t gras_trp_buf_init_sock(gras_socket_t sock);
+XBT_PUBLIC(gras_socket_t) gras_trp_buf_init_sock(gras_socket_t sock);
 
 #endif /* GRAS_TRP_PRIVATE_H */