/* actually start the thread */
arg->listener = xbt_thread_create("listener", listener_function, arg);
- gras_os_sleep(0); /* TODO: useless? give the listener a chance to initialize even if the main is empty and we cancel it right afterward */
+ gras_os_sleep(0); /* TODO: useless? give the listener a chance to initialize even if the main is empty and we cancel it right afterward */
return arg;
}
/**
* \brief Creates and runs a new #smx_process_t.
*
- * Does exactly the same as #SIMIX_process_create_with_arguments but without
+ * Does exactly the same as #SIMIX_process_create_with_arguments but without
providing standard arguments (\a argc, \a argv).
* \see SIMIX_process_create_with_arguments
*/
free(arg);
}
-/**
+/**
* \brief Creates and runs a new #smx_process_t.
*
* A constructor for #m_process_t taking four arguments and returning the corresponding object. The structure (and the corresponding thread) is created, and put in the list of ready process.
* \param host the location where the new agent is executed.
* \param argc first argument passed to \a code
* \param argv second argument passed to \a code
- * \param clean_process_function The cleanup function of user process. It will be called when the process finish. This function have to call the SIMIX_process_cleanup.
+ * \param clean_process_function The cleanup function of user process. It will be called when the process finish. This function have to call the SIMIX_process_cleanup.
* \see smx_process_t
* \return The new corresponding object.
*/
smx_process_t self = NULL;
smx_host_t host = SIMIX_host_get_by_name(hostname);
+ DEBUG2("Start process %s on host %s",name,hostname);
+
if (!SIMIX_host_get_state(host)) {
WARN2("Cannot launch process '%s' on failed host '%s'", name, hostname);
return NULL;
return process;
}
-/**
+/**
* \brief Creates and runs a new #smx_process_t hosting a JAVA thread
*
* Warning: this should only be used in libsimgrid4java, since it create
- * a context with no code, which leads to segfaults in plain libsimgrid
+ * a context with no code, which leads to segfaults in plain libsimgrid
*/
void SIMIX_jprocess_create(const char *name, smx_host_t host,
void *data,
smx_process_t self = NULL;
/* HACK: We need this trick because when we xbt_context_new() do
- syncronization stuff, the s_process field in the m_process needs
- to have a valid value, and we call xbt_context_new() before
- returning, of course, ie, before providing a right value to the
- caller (Java_simgrid_msg_Msg_processCreate) have time to store it
- in place. This way, we initialize the m_process->simdata->s_process
+ syncronization stuff, the s_process field in the m_process needs
+ to have a valid value, and we call xbt_context_new() before
+ returning, of course, ie, before providing a right value to the
+ caller (Java_simgrid_msg_Msg_processCreate) have time to store it
+ in place. This way, we initialize the m_process->simdata->s_process
field ourself ASAP.
All this would be much simpler if the synchronization stuff would be done
int index;
smx_mutex_t mutex;
smx_cond_t cond;
+ smx_process_t main;
+ smx_process_t sender;
+ smx_process_t receiver;
} s_smpi_host_data_t;
typedef struct smpi_host_data_t *smpi_host_data_t;
smpi_mpi_communicator_t comm,
smpi_mpi_request_t * request);
-int smpi_sender(int argc, char **argv);
-
-int smpi_receiver(int argc, char **argv);
+int smpi_sender(int argc,char*argv[]);
+int smpi_receiver(int argc, char*argv[]);
#endif
#include "private.h"
+#include "xbt/time.h"
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_base, smpi,
"Logging specific to SMPI (base)");
host = SIMIX_host_self();
hdata = xbt_new(s_smpi_host_data_t, 1);
+ SIMIX_host_set_data(host, hdata);
for (i = 0; i < smpi_global->host_count && host != smpi_global->hosts[i]; i++);
hdata->index = i;
hdata->mutex = SIMIX_mutex_init();
hdata->cond = SIMIX_cond_init();
-
- SIMIX_host_set_data(host, hdata);
-
+ hdata->main = SIMIX_process_self();
+ hdata->sender = SIMIX_process_create("smpi_sender",
+ smpi_sender, hdata,
+ SIMIX_host_get_name(SIMIX_host_self()), 0, NULL,
+ /*props */ NULL);
+ hdata->receiver = SIMIX_process_create("smpi_receiver",
+ smpi_receiver, hdata,
+ SIMIX_host_get_name(SIMIX_host_self()), 0, NULL,
+ /*props */ NULL);
return;
}
SIMIX_create_environment(argv[1]);
SIMIX_function_register("smpi_simulated_main", smpi_simulated_main);
- SIMIX_function_register("smpi_sender", smpi_sender);
- SIMIX_function_register("smpi_receiver", smpi_receiver);
SIMIX_launch_application(argv[2]);
// must initialize globals between creating environment and launching app....
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_receiver, smpi,
"Logging specific to SMPI (receiver)");
-int smpi_receiver(int argc, char **argv)
+int smpi_receiver(int argc, char*argv[])
{
+ smpi_host_data_t mydata = SIMIX_process_get_data(SIMIX_process_self());
smx_process_t self;
- int index;
+ int index = mydata->index;
xbt_fifo_t request_queue;
xbt_fifo_t message_queue;
self = SIMIX_process_self();
- index = smpi_host_index();
-
request_queue = smpi_global->pending_recv_request_queues[index];
message_queue = smpi_global->received_message_queues[index];
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_sender, smpi,
"Logging specific to SMPI (sender)");
-int smpi_sender(int argc, char **argv)
-{
+int smpi_sender(int argc,char*argv[]) {
+ smpi_host_data_t mydata = SIMIX_process_get_data(SIMIX_process_self());
smx_process_t self;
smx_host_t shost;
self = SIMIX_process_self();
shost = SIMIX_host_self();
- index = smpi_host_index();
+ index = mydata->index;
request_queue = smpi_global->pending_send_request_queues[index];
host="${hostnames[$j]}"
fi
- echo " <process host=\"${host}\" function=\"smpi_sender\"/>" >> ${APPLICATIONTMP}
- echo " <process host=\"${host}\" function=\"smpi_receiver\"/>" >> ${APPLICATIONTMP}
+# echo " <process host=\"${host}\" function=\"smpi_sender\"/>" >> ${APPLICATIONTMP}
+# echo " <process host=\"${host}\" function=\"smpi_receiver\"/>" >> ${APPLICATIONTMP}
done
cat >> ${APPLICATIONTMP} <<APPLICATIONFOOT
APPLICATIONFOOT
##-------------------------------- end DEFAULT APPLICATION --------------------------------------
+echo ${EXEC} ${PLATFORMTMP} ${APPLICATIONTMP}
${EXEC} ${PLATFORMTMP} ${APPLICATIONTMP}
echo "[$0] cleaning up temp files"
if [ -z "${PLATFORM}" ]; then
rm ${PLATFORMTMP}
fi
-rm ${APPLICATIONTMP}
+#rm ${APPLICATIONTMP}