1 #ifndef PAKMAN_MPI_WORKER_H 2 #define PAKMAN_MPI_WORKER_H 34 #define PAKMAN_EXIT_SUCCESS 0 37 #define PAKMAN_EXIT_FAILURE 1 39 #ifndef DOXYGEN_SHOULD_SKIP_THIS 42 #define PAKMAN_MANAGER_MSG_TAG 2 43 #define PAKMAN_MANAGER_SIGNAL_TAG 3 44 #define PAKMAN_WORKER_MSG_TAG 5 45 #define PAKMAN_WORKER_ERROR_CODE_TAG 6 47 #define PAKMAN_TERMINATE_WORKER_SIGNAL 0 49 MPI_Comm pakman_get_parent_comm();
51 char* pakman_receive_message(MPI_Comm comm);
52 int pakman_receive_signal(MPI_Comm comm);
54 void pakman_send_message(MPI_Comm comm,
const char *message);
55 void pakman_send_error_code(MPI_Comm comm,
int error_code);
80 int argc,
char *argv[],
81 int (*simulator)(
int argc,
char *argv[],
82 const char *input_string,
char **p_output_string));
84 #ifndef DOXYGEN_SHOULD_SKIP_THIS 86 MPI_Comm pakman_get_parent_comm()
89 MPI_Comm_get_parent(&parent_comm);
94 char* pakman_receive_message(MPI_Comm comm)
98 MPI_Probe(PAKMAN_ROOT, PAKMAN_MANAGER_MSG_TAG, comm, &status);
102 MPI_Get_count(&status, MPI_CHAR, &count);
103 char *buffer = (
char *) malloc(count *
sizeof(
char));
106 MPI_Recv(buffer, count, MPI_CHAR, PAKMAN_ROOT, PAKMAN_MANAGER_MSG_TAG,
107 comm, MPI_STATUS_IGNORE);
112 int pakman_receive_signal(MPI_Comm comm)
118 MPI_Recv(&signal, 1, MPI_INT, PAKMAN_ROOT, PAKMAN_MANAGER_SIGNAL_TAG,
119 comm, MPI_STATUS_IGNORE);
124 void pakman_send_message(MPI_Comm comm,
const char *message)
127 size_t count = strlen(message) + 1;
130 MPI_Send(message, count, MPI_CHAR, PAKMAN_ROOT, PAKMAN_WORKER_MSG_TAG,
134 void pakman_send_error_code(MPI_Comm comm,
int error_code)
137 MPI_Send(&error_code, 1, MPI_INT, PAKMAN_ROOT,
138 PAKMAN_WORKER_ERROR_CODE_TAG, comm);
144 int argc,
char *argv[],
145 int (*simulator)(
int argc,
char *argv[],
146 const char *input_string,
char **p_output_string))
149 MPI_Comm parent_comm = pakman_get_parent_comm();
152 if (parent_comm == MPI_COMM_NULL)
154 fputs(
"Pakman Worker error: MPI Worker was not spawned, exiting...\n",
160 int continue_loop = 1;
161 while (continue_loop)
165 MPI_Probe(PAKMAN_ROOT, MPI_ANY_TAG, parent_comm, &status);
168 switch (status.MPI_TAG)
170 case PAKMAN_MANAGER_MSG_TAG:
173 char* input_string = pakman_receive_message(parent_comm);
177 int error_code = (*simulator)(argc, argv,
178 input_string, &output_string);
181 pakman_send_message(parent_comm, output_string);
184 pakman_send_error_code(parent_comm, error_code);
192 case PAKMAN_MANAGER_SIGNAL_TAG:
195 int signal = pakman_receive_signal(parent_comm);
200 case PAKMAN_TERMINATE_WORKER_SIGNAL:
208 fputs(
"Pakman Worker error: signal not recognised, " 209 "exiting...\n", stderr);
217 fputs(
"Pakman Worker error: tag not recognised, exiting...\n",
225 MPI_Comm_disconnect(&parent_comm);
int pakman_run_mpi_worker(int argc, char *argv[], int(*simulator)(int argc, char *argv[], const char *input_string, char **p_output_string))
#define PAKMAN_EXIT_FAILURE
#define PAKMAN_EXIT_SUCCESS