Mercurial > hg > freeDiameter
diff libfdcore/p_out.c @ 1010:357c2f892d24
Implement a new counter on pending answers to send back to a peer.
Function fd_peer_get_load_pending updated to retrieve this counter as well.
When a peer has answers pending, the connection is not immediately teared down
upon DPR/DPA exchange, but a GRACE_TIMEOUT delay (default 1 sec) is granted.
author | Sebastien Decugis <sdecugis@freediameter.net> |
---|---|
date | Mon, 25 Mar 2013 16:39:32 +0100 |
parents | 5c564966a754 |
children | 0117a7746b21 |
line wrap: on
line diff
--- a/libfdcore/p_out.c Mon Mar 25 14:35:55 2013 +0100 +++ b/libfdcore/p_out.c Mon Mar 25 16:39:32 2013 +0100 @@ -172,9 +172,21 @@ /* Wrapper to sending a message either by out thread (peer in OPEN state) or directly; cnx or peer must be provided. Flags are valid only for direct sending, not through thread (unused) */ int fd_out_send(struct msg ** msg, struct cnxctx * cnx, struct fd_peer * peer, uint32_t flags) { + struct msg_hdr * hdr; + TRACE_ENTRY("%p %p %p %x", msg, cnx, peer, flags); CHECK_PARAMS( msg && *msg && (cnx || (peer && peer->p_cnxctx))); + if (peer) { + CHECK_FCT( fd_msg_hdr(*msg, &hdr) ); + if (!(hdr->msg_flags & CMD_FLAG_REQUEST)) { + /* Update the count of pending answers to send */ + CHECK_POSIX( pthread_mutex_lock(&peer->p_state_mtx) ); + peer->p_reqin_count--; + CHECK_POSIX( pthread_mutex_unlock(&peer->p_state_mtx) ); + } + } + if (fd_peer_getstate(peer) == STATE_OPEN) { /* Normal case: just queue for the out thread to pick it up */ CHECK_FCT( fd_fifo_post(peer->p_tosend, msg) );