Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' of git+ssh://scm.gforge.inria.fr//gitroot/simgrid/simgrid
authorJean-Baptiste Hervé <jean-baptiste.herve@esial.net>
Thu, 9 Aug 2012 09:15:16 +0000 (11:15 +0200)
committerJean-Baptiste Hervé <jean-baptiste.herve@esial.net>
Thu, 9 Aug 2012 09:15:16 +0000 (11:15 +0200)
include/simgrid/simix.h
src/msg/msg_mailbox.c
src/msg/msg_private.h
src/simix/smx_network.c
src/smpi/smpi_base.c
src/smpi/smpi_global.c
src/xbt/xbt_log_appender_file.c
src/xbt/xbt_main.c

index 55a834b..b3eff4d 100644 (file)
@@ -365,6 +365,8 @@ XBT_PUBLIC(void) simcall_rdv_destroy(smx_rdv_t rvp);
 XBT_PUBLIC(smx_rdv_t) simcall_rdv_get_by_name(const char *name);
 XBT_PUBLIC(int) simcall_rdv_comm_count_by_host(smx_rdv_t rdv, smx_host_t host);
 XBT_PUBLIC(smx_action_t) simcall_rdv_get_head(smx_rdv_t rdv);
+XBT_PUBLIC(smx_process_t) SIMIX_rdv_get_receiver(smx_rdv_t rdv);
+XBT_PUBLIC(void) SIMIX_rdv_set_receiver(smx_rdv_t rdv , smx_process_t process);
 
 XBT_PUBLIC(xbt_dict_t) SIMIX_get_rdv_points(void);
 
index d8509ed..14b1540 100644 (file)
@@ -59,7 +59,7 @@ msg_mailbox_t MSG_mailbox_get_by_alias(const char *alias)
 void MSG_mailbox_set_async(const char *alias){
   msg_mailbox_t mailbox = MSG_mailbox_get_by_alias(alias);
 
-  mailbox->permanent_receiver=SIMIX_process_self();
+  SIMIX_rdv_set_receiver(mailbox, SIMIX_process_self());
   XBT_VERB("%s mailbox set to receive eagerly for process %p\n",alias, SIMIX_process_self());
 
 }
index 6c95445..3c6c04d 100644 (file)
@@ -16,7 +16,6 @@
 #include "xbt/dict.h"
 #include "xbt/config.h"
 #include "instr/instr_private.h"
-
 SG_BEGIN_DECL()
 
 /**************** datatypes **********************************/
index 7737e92..0ce248a 100644 (file)
@@ -104,6 +104,26 @@ smx_action_t SIMIX_rdv_get_head(smx_rdv_t rdv)
   return xbt_fifo_get_item_content(xbt_fifo_get_first_item(rdv->comm_fifo));
 }
 
+/**
+ *  \brief get the receiver (process associated to the mailbox)
+ *  \param rdv The rendez-vous point
+ *  \return process The receiving process (NULL if not set)
+ */
+smx_process_t SIMIX_rdv_get_receiver(smx_rdv_t rdv)
+{
+  return rdv->permanent_receiver;
+}
+
+/**
+ *  \brief set the receiver of the rendez vous point to allow eager sends
+ *  \param rdv The rendez-vous point
+ *  \param process The receiving process
+ */
+void SIMIX_rdv_set_receiver(smx_rdv_t rdv , smx_process_t process)
+{
+   rdv->permanent_receiver=process;
+}
+
 /**
  *  \brief Pushes a communication action into a rendez-vous point
  *  \param rdv The rendez-vous point
index 2bc6b97..9ff9da7 100644 (file)
@@ -9,6 +9,7 @@
 #include "mc/mc.h"
 #include "xbt/replay.h"
 #include <errno.h>
+#include "surf/surf.h"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_base, smpi,
                                 "Logging specific to SMPI (base)");
index cdbdc96..fcaaf23 100644 (file)
@@ -15,8 +15,6 @@
 #include "simix/smx_private.h"
 
 
-XBT_LOG_NEW_CATEGORY(smpi, "All SMPI categories");
-
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_kernel, smpi,
                                 "Logging specific to SMPI (kernel)");
 
@@ -67,7 +65,7 @@ void smpi_process_init(int *argc, char ***argv)
     (*argc)--;
     data->argc = argc;
     data->argv = argv;
-    data->mailbox_small->permanent_receiver=proc;// set the process attached to the mailbox
+    SIMIX_rdv_set_receiver(data->mailbox_small, proc);// set the process attached to the mailbox
     XBT_DEBUG("<%d> New process in the game: %p", index, proc);
   }
 }
@@ -274,7 +272,8 @@ int MAIN__(void)
   }
 
   /* Connect log categories.  See xbt/log.c */
-  XBT_LOG_CONNECT(smpi);
+  XBT_LOG_CONNECT(smpi);  /* Keep this line as soon as possible in this function: xbt_log_appender_file.c depends on it
+                             DO NOT connect this in XBT or so, or it will be useless to xbt_log_appender_file.c */
   XBT_LOG_CONNECT(smpi_base);
   XBT_LOG_CONNECT(smpi_bench);
   XBT_LOG_CONNECT(smpi_coll);
index 57038c1..8869cc2 100644 (file)
@@ -1,39 +1,45 @@
-/* file_appender - a dumb log appender which simply prints to stdout        */
+/* file_appender - a dumb log appender which simply prints to a file        */
 
-/* Copyright (c) 2007-2011. The SimGrid Team.
- * All rights reserved.                                                     */
+/* Copyright (c) 2007-2012. The SimGrid Team. All rights reserved.          */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "xbt/sysdep.h"
 #include "xbt/log_private.h"
+#include "smpi/private.h" // to access bench_begin/end. Not ultraclean, I confess
 #include <stdio.h>
 
-/**
- * The root category's default logging function.
- */
-
-extern const char *xbt_log_priority_names[8];
-
+static void append_file(xbt_log_appender_t this_, char *str) {
+  fputs(str, (FILE *) this_->data);
+}
 
-static void append_file(xbt_log_appender_t this_appender, char *str)
-{
-  fputs(str, (FILE *) (this_appender->data));
+static void smpi_append_file(xbt_log_appender_t this_, char *str) {
+  smpi_bench_end();
+  fputs(str, (FILE *) this_->data);
+  smpi_bench_begin();
 }
 
-static void free_(xbt_log_appender_t this_)
-{
+static void free_(xbt_log_appender_t this_) {
   if (this_->data != stderr)
     fclose(this_->data);
 }
 
+void __smpi_bench_dont (void); // Stupid prototype
+void __smpi_bench_dont (void) { /* I'm only a place-holder in case we link without SMPI */; }
+void smpi_bench_begin(void) __attribute__ ((weak, alias ("__smpi_bench_dont")));
+void smpi_bench_end(void)   __attribute__ ((weak, alias ("__smpi_bench_dont")));
 
 
-xbt_log_appender_t xbt_log_appender_file_new(char *arg)
-{
+XBT_LOG_EXTERNAL_CATEGORY(smpi); // To detect if SMPI is inited
+
+xbt_log_appender_t xbt_log_appender_file_new(char *arg) {
+
   xbt_log_appender_t res = xbt_new0(s_xbt_log_appender_t, 1);
-  res->do_append = append_file;
+  if (_XBT_LOGV(smpi).initialized) // HACK to detect if we run in SMPI mode. Relies on MAIN__ source disposition
+    res->do_append = smpi_append_file;
+  else
+    res->do_append = append_file;
   res->free_ = free_;
   if (arg)
     res->data = (void *) fopen(arg, "w");
index 2ca0ed6..030dd34 100644 (file)
@@ -23,6 +23,9 @@
 XBT_LOG_NEW_CATEGORY(xbt, "All XBT categories (simgrid toolbox)");
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(module, xbt, "module handling");
 
+XBT_LOG_NEW_CATEGORY(smpi, "All SMPI categories"); /* lives here even if that's a bit odd to solve linking issues: this is used in xbt_log_file_appender to detect whether SMPI is used (and thus whether we should unbench the writing to disk) */
+
+
 char *xbt_binary_name = NULL;   /* Mandatory to retrieve neat backtraces */
 int xbt_initialized = 0;