+typedef struct s_gras_cblist gras_cblist_t;
+XBT_PUBLIC void gras_cbl_free(void *); /* used to free the memory at the end */
+XBT_PUBLIC void gras_cblist_free(void *cbl);
+
+/**
+ * gras_msg_cb_ctx_t:
+ *
+ * Context associated to a given callback (to either regular message or RPC)
+ */
+struct s_gras_msg_cb_ctx {
+ gras_socket_t expeditor;
+ gras_msgtype_t msgtype;
+ unsigned long int ID;
+ double timeout;
+ int answer_due; /* Whether the callback is expected to return a result (for sanity checks) */
+};
+typedef struct s_gras_msg_cb_ctx s_gras_msg_cb_ctx_t;
+
+/* ********* *
+ * * TIMER * *
+ * ********* */
+typedef struct {
+ double expiry;
+ double period;
+ void_f_void_t *action;
+ int repeat;
+} s_gras_timer_t, *gras_timer_t;
+
+/* returns 0 if it handled a timer, or the delay until next timer, or -1 if no armed timer */
+XBT_PUBLIC double gras_msg_timer_handle(void);
+
+XBT_PUBLIC gras_msg_cb_ctx_t gras_msg_cb_ctx_new(gras_socket_t expe,
+ gras_msgtype_t msgtype,
+ unsigned long int ID,
+ int answer_due,
+ double timeout);
+