diff libfdproto/messages.c @ 1014:908ffbb81f60

Added a second callback in fd_msg_send_timeout to handle more easily the timeout situation
author Sebastien Decugis <sdecugis@freediameter.net>
date Fri, 29 Mar 2013 17:30:59 +0800
parents e22434c66126
children 0117a7746b21
line wrap: on
line diff
--- a/libfdproto/messages.c	Fri Mar 29 17:11:45 2013 +0800
+++ b/libfdproto/messages.c	Fri Mar 29 17:30:59 2013 +0800
@@ -121,10 +121,11 @@
 	struct rt_data		*msg_rtdata;		/* Routing list for the query */
 	struct session		*msg_sess;		/* Cached message session if any */
 	struct {
-			void (*fct)(void *, struct msg **);
+			void (*anscb)(void *, struct msg **);
+			void (*expirecb)(void *, DiamId_t, size_t, struct msg **);
 			void * data;
 			struct timespec timeout;
-		}		 msg_cb;		/* Callback to be called when an answer is received, if not NULL */
+		}		 msg_cb;		/* Callback to be called when an answer is received, or timeout expires, if not NULL */
 	DiamId_t		 msg_src_id;		/* Diameter Id of the peer this message was received from. This string is malloc'd and must be freed */
 	size_t			 msg_src_id_len;	/* cached length of this string */
 	struct timespec		 msg_ts_rcv;		/* Timestamp when this message was received from the network */
@@ -774,8 +775,8 @@
 		msg->msg_public.msg_hbhid,
 		msg->msg_public.msg_eteid
 		) );
-	CHECK_FCT( dump_add_str(outstr, offset, outlen, INOBJHDR "intern: rwb:%p rt:%d cb:%p(%p) qry:%p asso:%d sess:%p src:%s(%zd)|", 
-			INOBJHDRVAL, msg->msg_rawbuffer, msg->msg_routable, msg->msg_cb.fct, msg->msg_cb.data, msg->msg_query, msg->msg_associated, msg->msg_sess, msg->msg_src_id?:"(nil)", msg->msg_src_id_len) );
+	CHECK_FCT( dump_add_str(outstr, offset, outlen, INOBJHDR "intern: rwb:%p rt:%d cb:%p,%p(%p) qry:%p asso:%d sess:%p src:%s(%zd)|", 
+			INOBJHDRVAL, msg->msg_rawbuffer, msg->msg_routable, msg->msg_cb.anscb, msg->msg_cb.expirecb, msg->msg_cb.data, msg->msg_query, msg->msg_associated, msg->msg_sess, msg->msg_src_id?:"(nil)", msg->msg_src_id_len) );
 	return 0;
 }
 
@@ -1029,9 +1030,9 @@
 }
 
 /* Associate / get answer callbacks */
-int fd_msg_anscb_associate( struct msg * msg, void ( *anscb)(void *, struct msg **), void  * data, const struct timespec *timeout )
+int fd_msg_anscb_associate( struct msg * msg, void ( *anscb)(void *, struct msg **), void  * data, void (*expirecb)(void *, DiamId_t, size_t, struct msg **), const struct timespec *timeout )
 {
-	TRACE_ENTRY("%p %p %p", msg, anscb, data);
+	TRACE_ENTRY("%p %p %p %p", msg, anscb, expirecb, data);
 	
 	/* Check the parameters */
 	CHECK_PARAMS( CHECK_MSG(msg) );
@@ -1039,10 +1040,12 @@
 	if (! (msg->msg_public.msg_flags & CMD_FLAG_REQUEST ))
 		return anscb ? EINVAL : 0; /* we associate with requests only */
 	
-	CHECK_PARAMS( (anscb == NULL) || (msg->msg_cb.fct == NULL) ); /* We are not overwritting a cb */
+	CHECK_PARAMS( (anscb == NULL)    || (msg->msg_cb.anscb == NULL) ); /* We are not overwritting a cb */
+	CHECK_PARAMS( (expirecb == NULL) || (msg->msg_cb.expirecb == NULL) ); /* We are not overwritting a cb */
 	
 	/* Associate callback and data with the message, if any */
-	msg->msg_cb.fct = anscb;
+	msg->msg_cb.anscb = anscb;
+	msg->msg_cb.expirecb = expirecb;
 	msg->msg_cb.data = data;
 	if (timeout) {
 		memcpy(&msg->msg_cb.timeout, timeout, sizeof(struct timespec));
@@ -1051,16 +1054,20 @@
 	return 0;
 }	
 
-int fd_msg_anscb_get( struct msg * msg, void (**anscb)(void *, struct msg **), void ** data )
+int fd_msg_anscb_get( struct msg * msg, void (**anscb)(void *, struct msg **), void (**expirecb)(void *, DiamId_t, size_t, struct msg **), void ** data )
 {
-	TRACE_ENTRY("%p %p %p", msg, anscb, data);
+	TRACE_ENTRY("%p %p %p %p", msg, anscb, expirecb, data);
 	
 	/* Check the parameters */
-	CHECK_PARAMS( CHECK_MSG(msg) && anscb && data );
+	CHECK_PARAMS( CHECK_MSG(msg) );
 	
 	/* Copy the result */
-	*anscb = msg->msg_cb.fct;
-	*data  = msg->msg_cb.data;
+	if (anscb)
+		*anscb = msg->msg_cb.anscb;
+	if (data)
+		*data  = msg->msg_cb.data;
+	if (expirecb)
+		*expirecb = msg->msg_cb.expirecb;
 	
 	return 0;
 }
"Welcome to our mercurial repository"