Changeset 1d4b815 in mainline for uspace/lib/c/generic/inet/tcp.c


Ignore:
Timestamp:
2015-05-09T19:05:48Z (10 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
309469de
Parents:
779541b
Message:

Properly wait for connection establishment.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/inet/tcp.c

    r779541b r1d4b815  
    274274int tcp_conn_wait_connected(tcp_conn_t *conn)
    275275{
    276         async_usleep(1000 * 1000);
    277         return 0;
     276        fibril_mutex_lock(&conn->lock);
     277        while (!conn->connected && !conn->conn_failed && !conn->conn_reset)
     278                fibril_condvar_wait(&conn->cv, &conn->lock);
     279
     280        if (conn->connected) {
     281                fibril_mutex_unlock(&conn->lock);
     282                return EOK;
     283        } else {
     284                assert(conn->conn_failed || conn->conn_reset);
     285                fibril_mutex_unlock(&conn->lock);
     286                return EIO;
     287        }
    278288}
    279289
     
    442452static void tcp_ev_connected(tcp_t *tcp, ipc_callid_t iid, ipc_call_t *icall)
    443453{
     454        tcp_conn_t *conn;
     455        sysarg_t conn_id;
     456        int rc;
     457
    444458        printf("tcp_ev_connected()\n");
    445         async_answer_0(iid, ENOTSUP);
     459        conn_id = IPC_GET_ARG1(*icall);
     460
     461        rc = tcp_conn_get(tcp, conn_id, &conn);
     462        if (rc != EOK) {
     463                printf("conn ID %zu not found\n",
     464                    conn_id);
     465                async_answer_0(iid, ENOENT);
     466                return;
     467        }
     468
     469        fibril_mutex_lock(&conn->lock);
     470        conn->connected = true;
     471        fibril_condvar_broadcast(&conn->cv);
     472        fibril_mutex_unlock(&conn->lock);
     473
     474        async_answer_0(iid, EOK);
    446475}
    447476
    448477static void tcp_ev_conn_failed(tcp_t *tcp, ipc_callid_t iid, ipc_call_t *icall)
    449478{
     479        tcp_conn_t *conn;
     480        sysarg_t conn_id;
     481        int rc;
     482
    450483        printf("tcp_ev_conn_failed()\n");
    451         async_answer_0(iid, ENOTSUP);
     484        conn_id = IPC_GET_ARG1(*icall);
     485
     486        rc = tcp_conn_get(tcp, conn_id, &conn);
     487        if (rc != EOK) {
     488                printf("conn ID %zu not found\n",
     489                    conn_id);
     490                async_answer_0(iid, ENOENT);
     491                return;
     492        }
     493
     494        fibril_mutex_lock(&conn->lock);
     495        conn->conn_failed = true;
     496        fibril_condvar_broadcast(&conn->cv);
     497        fibril_mutex_unlock(&conn->lock);
     498
     499        async_answer_0(iid, EOK);
    452500}
    453501
    454502static void tcp_ev_conn_reset(tcp_t *tcp, ipc_callid_t iid, ipc_call_t *icall)
    455503{
     504        tcp_conn_t *conn;
     505        sysarg_t conn_id;
     506        int rc;
     507
    456508        printf("tcp_ev_conn_reset()\n");
    457         async_answer_0(iid, ENOTSUP);
     509        conn_id = IPC_GET_ARG1(*icall);
     510
     511        rc = tcp_conn_get(tcp, conn_id, &conn);
     512        if (rc != EOK) {
     513                printf("conn ID %zu not found\n",
     514                    conn_id);
     515                async_answer_0(iid, ENOENT);
     516                return;
     517        }
     518
     519        fibril_mutex_lock(&conn->lock);
     520        conn->conn_reset = true;
     521        fibril_condvar_broadcast(&conn->cv);
     522        fibril_mutex_unlock(&conn->lock);
     523
     524        async_answer_0(iid, EOK);
    458525}
    459526
Note: See TracChangeset for help on using the changeset viewer.