Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
31bb98fc8317f9bd7a8cf6a4f747bb36e1bad4b3
[simgrid.git] / src / amok / base.c
1 /* $Id$ */
2
3 /* base - several addons to do specific stuff not in GRAS itself            */
4
5 /* Copyright (c) 2003, 2004 Martin Quinson. All rights reserved.            */
6
7 /* This program is free software; you can redistribute it and/or modify it
8  * under the terms of the license (GNU LGPL) which comes with this package. */
9
10 #include "gras.h"
11 #include "amok/base.h"
12
13 XBT_LOG_NEW_SUBCATEGORY(amok,XBT_LOG_ROOT_CAT,"All AMOK categories");
14
15 amok_remoterr_t amok_remoterr_new(xbt_error_t param_errcode, 
16                                   const char* format,...) {
17    
18   amok_remoterr_t res;
19    
20   va_list ap;
21   va_start(ap,format);
22   res = amok_remoterr_new_va(param_errcode,format,ap);
23   va_end(ap);
24   return res;
25 }
26
27 amok_remoterr_t amok_remoterr_new_va(xbt_error_t param_errcode, 
28                                      const char* format,va_list ap) {
29   amok_remoterr_t res=xbt_new(s_amok_remoterr_t,1);
30   res->code=param_errcode;
31   if (format) {
32      res->msg=(char*)xbt_malloc(1024);
33      vsnprintf(res->msg,1024,format,ap);
34   } else {
35      res->msg = NULL;
36   }
37    
38   return res;   
39 }
40
41 void amok_remoterr_free(amok_remoterr_t *err) {
42    if (err && *err) {
43       if ((*err)->msg) free((*err)->msg);
44       free(*err);
45       err=NULL;
46    }
47 }
48
49
50 void
51 amok_repport_error (gras_socket_t sock, gras_msgtype_t msgtype,
52                     xbt_error_t param_errcode, const char* format,...) {
53   amok_remoterr_t error;
54   va_list ap;
55
56   error=xbt_new(s_amok_remoterr_t,1);
57   error->code=param_errcode;
58   error->msg=(char*)xbt_malloc(1024); /* FIXME */
59   va_start(ap,format);
60   vsnprintf(error->msg,1024,format,ap);
61   va_end(ap);
62
63   gras_msg_send(sock,msgtype,error);
64   /* FIXME: error handling while error reporting :-/ 
65   if (errcode != no_error) {
66      CRITICAL4("Error '%s' while reporting error '%s' to %s:%d",
67                xbt_error_name(errcode),error->msg,
68                gras_socket_peer_name(sock),gras_socket_peer_port(sock) );
69   }
70   */
71 }
72
73 void amok_base_init(void) {
74   gras_datadesc_type_t host_desc, remoterr_desc;
75      
76   /* Build the datatype descriptions */
77   host_desc = gras_datadesc_struct("xbt_host_t");
78   gras_datadesc_struct_append(host_desc,"name",gras_datadesc_by_name("string"));
79   gras_datadesc_struct_append(host_desc,"exp_size",gras_datadesc_by_name("int"));
80   gras_datadesc_struct_close(host_desc);
81   host_desc = gras_datadesc_ref("xbt_host_t*",host_desc);
82    
83   remoterr_desc = gras_datadesc_struct("s_amok_remoterr_t");
84   gras_datadesc_struct_append(remoterr_desc,"msg",gras_datadesc_by_name("string"));
85   gras_datadesc_struct_append(remoterr_desc,"code",gras_datadesc_by_name("unsigned int"));
86   gras_datadesc_struct_close(remoterr_desc);
87   remoterr_desc = gras_datadesc_ref("amok_remoterr_t",remoterr_desc);
88 }
89
90 void amok_base_exit(void) {
91    /* No real module mechanism in GRAS so far, nothing to do. */
92 }
93