@@ -64,54 +64,50 @@ void reb_exit(const char* const msg){
6464 // This function should also kill all children.
6565 // Not implemented as pid is not easy to get to.
6666 // kill(pid, SIGKILL);
67- fprintf ( stderr , "\n\033[1mFatal error! Exiting now.\033[0m %s\n" , msg );
67+ reb_message ( NULL , 0 , REB_MESSAGE_TYPE_ERROR , msg );
6868 exit (EXIT_FAILURE );
6969}
7070
71- void reb_message (struct reb_simulation * const r , char type , const char * const msg ){
72- int save_messages = 0 ;
73- if (r != NULL ){
74- save_messages = r -> save_messages ;
75- }
76- if (!save_messages || strlen (msg )>=reb_messages_max_length ){
77- if (type == 'w' ){
78- fprintf (stderr ,"\n\033[1mWarning!\033[0m %s\n" ,msg );
79- }else if (type == 'e' ){
80- fprintf (stderr ,"\n\033[1mError!\033[0m %s\n" ,msg );
71+ void reb_message (char * * * messages , int save_messages , enum REB_MESSAGE_TYPE type , const char * const msg ){
72+ if (!save_messages || messages == NULL ){
73+ switch (type ){
74+ case REB_MESSAGE_TYPE_INFO :
75+ fprintf (stderr ,"\nREBOUND Message! %s\n" ,msg );
76+ break ;
77+ case REB_MESSAGE_TYPE_WARNING :
78+ fprintf (stderr ,"\n\033[1mWarning!\033[0m %s\n" ,msg );
79+ break ;
80+ case REB_MESSAGE_TYPE_ERROR :
81+ fprintf (stderr ,"\n\033[1mError!\033[0m %s\n" ,msg );
82+ break ;
8183 }
8284 }else {
83- // TODO: Should be protected by MUTEX
84- if (r -> messages == NULL ){
85- r -> messages = calloc (reb_messages_max_N ,sizeof (char * ));
85+ // Note: not thread safe.
86+ if (* messages == NULL ){
87+ * messages = calloc (reb_messages_max_N ,sizeof (char * ));
8688 }
8789 int n = 0 ;
8890 for (;n < reb_messages_max_N ;n ++ ){
89- if (r -> messages [n ]== NULL ){
91+ if (( * messages ) [n ]== NULL ){
9092 break ;
9193 }
9294 }
9395 if (n == reb_messages_max_N ){
94- free (r -> messages [0 ]);
96+ free (( * messages ) [0 ]);
9597 for (int i = 0 ;i < reb_messages_max_N - 1 ;i ++ ){
96- r -> messages [i ] = r -> messages [i + 1 ];
98+ ( * messages ) [i ] = ( * messages ) [i + 1 ];
9799 }
98- r -> messages [reb_messages_max_N - 1 ] = NULL ;
100+ ( * messages ) [reb_messages_max_N - 1 ] = NULL ;
99101 n = reb_messages_max_N - 1 ;
100102 }
101- r -> messages [n ] = malloc (sizeof (char * )* reb_messages_max_length );
102- r -> messages [n ][0 ] = type ;
103- strcpy (r -> messages [n ]+ 1 , msg );
103+ (* messages )[n ] = malloc (sizeof (char * )* reb_messages_max_length );
104+ // First character indicates type for python.
105+ (* messages )[n ][0 ] = (char )type ;
106+ strncpy ((* messages )[n ]+ 1 , msg , reb_messages_max_length - 2 );
107+ (* messages )[n ][reb_messages_max_length - 1 ] = '\0' ;
104108 }
105109}
106110
107- void reb_simulation_warning (struct reb_simulation * const r , const char * const msg ){
108- reb_message (r , 'w' , msg );
109- }
110-
111- void reb_simulation_error (struct reb_simulation * const r , const char * const msg ){
112- reb_message (r , 'e' , msg );
113- }
114-
115111int reb_pop_message (char * * messages , char * const buf ){
116112 if (messages ){
117113 char * w0 = messages [0 ];
@@ -149,10 +145,16 @@ void reb_mpi_init(struct reb_simulation* const r){
149145 reb_communication_mpi_init (r ,0 ,NULL );
150146 // Make sure domain can be decomposed into equal number of root boxes per node.
151147 if ((r -> N_root /r -> mpi_num )* r -> mpi_num != r -> N_root ){
152- if (r -> mpi_id == 0 ) fprintf (stderr ,"ERROR: Number of root boxes (%d) not a multiple of mpi nodes (%d).\n" ,r -> N_root ,r -> mpi_num );
148+ if (r -> mpi_id == 0 ){
149+ char msg [1024 ];
150+ sprintf (msg , "Number of root boxes (%d) not a multiple of mpi nodes (%d).\n" ,r -> N_root ,r -> mpi_num );
151+ reb_simulation_error (r ,msg );
152+ }
153153 exit (-1 );
154154 }
155- printf ("MPI-node: %d. Process id: %d.\n" ,r -> mpi_id , getpid ());
155+ char msg [1024 ];
156+ sprintf (msg ,"MPI-node: %d. Process id: %d.\n" ,r -> mpi_id , getpid ());
157+ reb_simulation_info (r ,msg );
156158}
157159
158160void reb_mpi_finalize (struct reb_simulation * const r ){
0 commit comments