Navigation


Changeset 1014:908ffbb81f60 in freeDiameter for libfdproto


Ignore:
Timestamp:
Mar 29, 2013, 6:30:59 PM (11 years ago)
Author:
Sebastien Decugis <sdecugis@freediameter.net>
Branch:
default
Phase:
public
Message:

Added a second callback in fd_msg_send_timeout to handle more easily the timeout situation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libfdproto/messages.c

    r1009 r1014  
    122122        struct session          *msg_sess;              /* Cached message session if any */
    123123        struct {
    124                         void (*fct)(void *, struct msg **);
     124                        void (*anscb)(void *, struct msg **);
     125                        void (*expirecb)(void *, DiamId_t, size_t, struct msg **);
    125126                        void * data;
    126127                        struct timespec timeout;
    127                 }                msg_cb;                /* Callback to be called when an answer is received, if not NULL */
     128                }                msg_cb;                /* Callback to be called when an answer is received, or timeout expires, if not NULL */
    128129        DiamId_t                 msg_src_id;            /* Diameter Id of the peer this message was received from. This string is malloc'd and must be freed */
    129130        size_t                   msg_src_id_len;        /* cached length of this string */
     
    775776                msg->msg_public.msg_eteid
    776777                ) );
    777         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)|",
    778                         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) );
     778        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)|",
     779                        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) );
    779780        return 0;
    780781}
     
    10301031
    10311032/* Associate / get answer callbacks */
    1032 int fd_msg_anscb_associate( struct msg * msg, void ( *anscb)(void *, struct msg **), void  * data, const struct timespec *timeout )
    1033 {
    1034         TRACE_ENTRY("%p %p %p", msg, anscb, data);
     1033int 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 )
     1034{
     1035        TRACE_ENTRY("%p %p %p %p", msg, anscb, expirecb, data);
    10351036       
    10361037        /* Check the parameters */
     
    10401041                return anscb ? EINVAL : 0; /* we associate with requests only */
    10411042       
    1042         CHECK_PARAMS( (anscb == NULL) || (msg->msg_cb.fct == NULL) ); /* We are not overwritting a cb */
     1043        CHECK_PARAMS( (anscb == NULL)    || (msg->msg_cb.anscb == NULL) ); /* We are not overwritting a cb */
     1044        CHECK_PARAMS( (expirecb == NULL) || (msg->msg_cb.expirecb == NULL) ); /* We are not overwritting a cb */
    10431045       
    10441046        /* Associate callback and data with the message, if any */
    1045         msg->msg_cb.fct = anscb;
     1047        msg->msg_cb.anscb = anscb;
     1048        msg->msg_cb.expirecb = expirecb;
    10461049        msg->msg_cb.data = data;
    10471050        if (timeout) {
     
    10521055}       
    10531056
    1054 int fd_msg_anscb_get( struct msg * msg, void (**anscb)(void *, struct msg **), void ** data )
    1055 {
    1056         TRACE_ENTRY("%p %p %p", msg, anscb, data);
     1057int fd_msg_anscb_get( struct msg * msg, void (**anscb)(void *, struct msg **), void (**expirecb)(void *, DiamId_t, size_t, struct msg **), void ** data )
     1058{
     1059        TRACE_ENTRY("%p %p %p %p", msg, anscb, expirecb, data);
    10571060       
    10581061        /* Check the parameters */
    1059         CHECK_PARAMS( CHECK_MSG(msg) && anscb && data );
     1062        CHECK_PARAMS( CHECK_MSG(msg) );
    10601063       
    10611064        /* Copy the result */
    1062         *anscb = msg->msg_cb.fct;
    1063         *data  = msg->msg_cb.data;
     1065        if (anscb)
     1066                *anscb = msg->msg_cb.anscb;
     1067        if (data)
     1068                *data  = msg->msg_cb.data;
     1069        if (expirecb)
     1070                *expirecb = msg->msg_cb.expirecb;
    10641071       
    10651072        return 0;
Note: See TracChangeset for help on using the changeset viewer.