superfluous level of indirection. User pass adress of variable containing
data (both when sending and receiving), and not of a variable being a
pointer to the data. Let's say that I like it better ;)
The price for that is constructs like "int msg=*(int*)payload" in handlers,
but it's a fine price, IMHO.
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@153
48e7efb5-ca39-0410-a469-
dd3cf9ba447f
them all up in one shot)
[DataDesc]
- Fix the ugly case of reference to dynamic array.
them all up in one shot)
[DataDesc]
- Fix the ugly case of reference to dynamic array.
+ - New (semi-public) function gras_datadesc_size to allow the messaging
+ layer to malloc the needed space for the buffer.
[Transport]
- gras_socket_close now expect the socket to close (and not its address to
put NULL in it after it). This is because the socket passed to handlers
is one of their argument (=> not writable).
[Transport]
- gras_socket_close now expect the socket to close (and not its address to
put NULL in it after it). This is because the socket passed to handlers
is one of their argument (=> not writable).
+ [Messaging]
+ - propagate the interface cleanup from last week in datadesc, ie remove a
+ superfluous level of indirection. User pass adress of variable
+ containing data (both when sending and receiving), and not of a variable
+ being a pointer to the data. Let's say that I like it better ;)
+ The price for that is constructs like "int msg=*(int*)payload" in
+ handlers, but it's a fine price, IMHO.
* If the callback accepts the message, it should free it after use.
*/
typedef int (*gras_cb_t)(gras_socket_t *expeditor,
* If the callback accepts the message, it should free it after use.
*/
typedef int (*gras_cb_t)(gras_socket_t *expeditor,
- gras_datadesc_type_t *payload_type,
- void *payload_data);
gras_error_t gras_cb_register (gras_msgtype_t *msgtype,
gras_error_t gras_cb_register (gras_msgtype_t *msgtype,
void gras_cb_unregister(gras_msgtype_t *msgtype,
void gras_cb_unregister(gras_msgtype_t *msgtype,
gras_error_t gras_msg_send(gras_socket_t *sock,
gras_msgtype_t *msgtype,
gras_error_t gras_msg_send(gras_socket_t *sock,
gras_msgtype_t *msgtype,
gras_error_t gras_msg_wait(double timeout,
gras_msgtype_t *msgt_want,
gras_socket_t **expeditor,
gras_error_t gras_msg_wait(double timeout,
gras_msgtype_t *msgt_want,
gras_socket_t **expeditor,
gras_error_t gras_msg_handle(double timeOut);
gras_error_t gras_msg_handle(double timeOut);
TRY(gras_trp_chunk_send(sock, GRAS_header, 6));
TRY(gras_trp_chunk_send(sock, GRAS_header, 6));
- TRY(gras_datadesc_send(sock, string_type, msgtype->name));
+ TRY(gras_datadesc_send(sock, string_type, &msgtype->name));
TRY(gras_datadesc_send(sock, msgtype->ctn_type, payload));
return no_error;
TRY(gras_datadesc_send(sock, msgtype->ctn_type, payload));
return no_error;
* gras_msg_recv:
*
* receive the next message on the given socket.
* gras_msg_recv:
*
* receive the next message on the given socket.
- * The room for the payload will be malloc'ed by the function.
*/
gras_error_t
gras_msg_recv(gras_socket_t *sock,
gras_msgtype_t **msgtype,
*/
gras_error_t
gras_msg_recv(gras_socket_t *sock,
gras_msgtype_t **msgtype,
+ void **payload,
+ int *payload_size) {
- *payload = NULL;
- return gras_msg_recv_no_malloc(sock,msgtype,payload);
-}
-/**
- * gras_msg_recv_no_malloc:
- *
- * receive the next message on the given socket.
- *
- * No room will be allocated by the function, which is good to get
- * the payload onto the stack (passing the address of a static variable),
- * but will happily segfault if passed an arbitrary pointer...
- */
-gras_error_t
-gras_msg_recv_no_malloc(gras_socket_t *sock,
- gras_msgtype_t **msgtype,
- void **payload) {
-
gras_error_t errcode;
static gras_datadesc_type_t *string_type=NULL;
char header[6];
gras_error_t errcode;
static gras_datadesc_type_t *string_type=NULL;
char header[6];
DEBUG2("Handle an incoming message using protocol %d from arch %s",
(int)header[4],gras_datadesc_arch_name(r_arch));
DEBUG2("Handle an incoming message using protocol %d from arch %s",
(int)header[4],gras_datadesc_arch_name(r_arch));
- TRY(gras_datadesc_recv(sock, string_type, r_arch,(void**) &msg_name));
+ TRY(gras_datadesc_recv(sock, string_type, r_arch, &msg_name));
TRY(gras_set_get_by_name(_gras_msgtype_set,
msg_name,(gras_set_elm_t**)msgtype));
TRY(gras_set_get_by_name(_gras_msgtype_set,
msg_name,(gras_set_elm_t**)msgtype));
- TRY(gras_datadesc_recv(sock, (*msgtype)->ctn_type, r_arch, payload));
+
+
+ *payload_size=gras_datadesc_size((*msgtype)->ctn_type);
+ gras_assert2(*payload_size > 0,
+ "%s %s",
+ "Dynamic array as payload is forbided for now (FIXME?).",
+ "Reference to dynamic array is allowed.");
+ *payload = malloc(*payload_size);
+ TRY(gras_datadesc_recv(sock, (*msgtype)->ctn_type, r_arch, *payload));
gras_msg_wait(double timeout,
gras_msgtype_t *msgt_want,
gras_socket_t **expeditor,
gras_msg_wait(double timeout,
gras_msgtype_t *msgt_want,
gras_socket_t **expeditor,
gras_msgtype_t *msgt_got;
gras_msgtype_t *msgt_got;
+ void *payload_got;
+ int payload_size_got;
gras_error_t errcode;
double start, now;
gras_procdata_t *pd=gras_procdata_get();
gras_error_t errcode;
double start, now;
gras_procdata_t *pd=gras_procdata_get();
gras_msg_t msg;
*expeditor = NULL;
gras_msg_t msg;
*expeditor = NULL;
VERB1("Waiting for message %s",msgt_want->name);
VERB1("Waiting for message %s",msgt_want->name);
gras_dynar_foreach(pd->msg_queue,cpt,msg){
if (msg.type->code == msgt_want->code) {
*expeditor = msg.expeditor;
gras_dynar_foreach(pd->msg_queue,cpt,msg){
if (msg.type->code == msgt_want->code) {
*expeditor = msg.expeditor;
- *payload = msg.payload;
+ memcpy(payload, msg.payload, msg.payload_size);
+ free(msg.payload);
gras_dynar_cursor_rm(pd->msg_queue, &cpt);
gras_dynar_cursor_rm(pd->msg_queue, &cpt);
- VERB0("Waited message was queued");
+ VERB0("The waited message was queued");
return no_error;
}
}
while (1) {
TRY(gras_trp_select(timeout - now + start, expeditor));
return no_error;
}
}
while (1) {
TRY(gras_trp_select(timeout - now + start, expeditor));
- TRY(gras_msg_recv(*expeditor, &msgt_got, payload));
+ TRY(gras_msg_recv(*expeditor, &msgt_got, &payload_got, &payload_size_got));
if (msgt_got->code == msgt_want->code) {
if (msgt_got->code == msgt_want->code) {
+ memcpy(payload, payload_got, payload_size_got);
+ free(payload_got);
VERB0("Got waited message");
return no_error;
}
VERB0("Got waited message");
return no_error;
}
/* not expected msg type. Queue it for later */
msg.expeditor = *expeditor;
msg.type = msgt_got;
/* not expected msg type. Queue it for later */
msg.expeditor = *expeditor;
msg.type = msgt_got;
- msg.payload = *payload;
+ msg.payload = payload;
+ msg.payload_size = payload_size_got;
TRY(gras_dynar_push(pd->msg_queue,&msg));
now=gras_time();
TRY(gras_dynar_push(pd->msg_queue,&msg));
now=gras_time();
gras_msg_t msg;
gras_socket_t *expeditor;
void *payload=NULL;
gras_msg_t msg;
gras_socket_t *expeditor;
void *payload=NULL;
gras_msgtype_t *msgtype;
gras_procdata_t*pd=gras_procdata_get();
gras_msgtype_t *msgtype;
gras_procdata_t*pd=gras_procdata_get();
} else {
TRY(gras_trp_select(timeOut, &expeditor));
} else {
TRY(gras_trp_select(timeOut, &expeditor));
- TRY(gras_msg_recv(expeditor, &msgtype, &payload));
+ TRY(gras_msg_recv(expeditor, &msgtype, &payload, &payload_size));
gras_dynar_foreach(list->cbs,cpt,cb) {
INFO3("Invoque the callback #%d (@%p) for incomming msg %s",
cpt+1,cb,msgtype->name);
gras_dynar_foreach(list->cbs,cpt,cb) {
INFO3("Invoque the callback #%d (@%p) for incomming msg %s",
cpt+1,cb,msgtype->name);
- if ((*cb)(expeditor,msgtype->ctn_type,payload)) {
+ if ((*cb)(expeditor,payload)) {
/* cb handled the message */
/* cb handled the message */
gras_socket_t *expeditor;
gras_msgtype_t *type;
void *payload;
gras_socket_t *expeditor;
gras_msgtype_t *type;
void *payload;
} gras_msg_t;
gras_error_t gras_msg_send_namev(gras_socket_t *sock,
} gras_msg_t;
gras_error_t gras_msg_send_namev(gras_socket_t *sock,
gras_error_t gras_msg_recv(gras_socket_t *sock,
gras_msgtype_t **msgtype,
gras_error_t gras_msg_recv(gras_socket_t *sock,
gras_msgtype_t **msgtype,
- void **payload);
-gras_error_t
-gras_msg_recv_no_malloc(gras_socket_t *sock,
- gras_msgtype_t **msgtype,
- void **payload);
-
+ void **payload,
+ int *payload_size);