Changeset bbf159a in mainline for uspace/srv/net/tl/tcp/ucall.c


Ignore:
Timestamp:
2011-12-13T17:06:25Z (12 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
7a8c1c4e
Parents:
0d29e0cd
Message:

Eliminate busy waiting when TCP send buffer is full.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/tl/tcp/ucall.c

    r0d29e0cd rbbf159a  
    121121        }
    122122
    123         if (conn->snd_buf_fin)
     123        fibril_mutex_lock(&conn->snd_buf_lock);
     124
     125        if (conn->snd_buf_fin) {
     126                fibril_mutex_unlock(&conn->snd_buf_lock);
    124127                return TCP_ECLOSING;
     128        }
    125129
    126130        while (size > 0) {
    127131                buf_free = conn->snd_buf_size - conn->snd_buf_used;
    128132                while (buf_free == 0 && !conn->reset) {
    129                         tcp_tqueue_new_data(conn);
     133                        log_msg(LVL_DEBUG, "%s: buf_free == 0, waiting.",
     134                            conn->name);
     135                        fibril_condvar_wait(&conn->snd_buf_cv,
     136                            &conn->snd_buf_lock);
    130137                        buf_free = conn->snd_buf_size - conn->snd_buf_used;
    131138                }
    132139
    133                 if (conn->reset)
     140                if (conn->reset) {
     141                        fibril_mutex_unlock(&conn->snd_buf_lock);
    134142                        return TCP_ERESET;
     143                }
    135144
    136145                xfer_size = min(size, buf_free);
     
    141150                conn->snd_buf_used += xfer_size;
    142151                size -= xfer_size;
    143         }
    144 
     152
     153                fibril_mutex_unlock(&conn->snd_buf_lock);
     154                tcp_tqueue_new_data(conn);
     155                fibril_mutex_lock(&conn->snd_buf_lock);
     156        }
     157
     158        fibril_mutex_unlock(&conn->snd_buf_lock);
    145159        tcp_tqueue_new_data(conn);
    146160
Note: See TracChangeset for help on using the changeset viewer.