Changeset 1f2b07a in mainline


Ignore:
Timestamp:
2015-06-08T22:00:22Z (9 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
dc0d6e5d
Parents:
204ba47
Message:

TCP and UDP client code needs to make sure callback connection handler has terminated before freeing session-related data.

Location:
uspace
Files:
6 edited

Legend:

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

    r204ba47 r1f2b07a  
    8181        list_initialize(&tcp->conn);
    8282        list_initialize(&tcp->listener);
     83        fibril_mutex_initialize(&tcp->lock);
     84        fibril_condvar_initialize(&tcp->cv);
    8385
    8486        rc = loc_service_get_id(SERVICE_NAME_TCP, &tcp_svcid,
     
    115117
    116118        async_hangup(tcp->sess);
     119
     120        fibril_mutex_lock(&tcp->lock);
     121        while (!tcp->cb_done)
     122                fibril_condvar_wait(&tcp->cv, &tcp->lock);
     123        fibril_mutex_unlock(&tcp->lock);
     124
    117125        free(tcp);
    118126}
     
    593601
    594602                if (!IPC_GET_IMETHOD(call)) {
    595                         /* TODO: Handle hangup */
    596                         return;
     603                        /* Hangup*/
     604                        goto out;
    597605                }
    598606
     
    621629                }
    622630        }
     631out:
     632        fibril_mutex_lock(&tcp->lock);
     633        tcp->cb_done = true;
     634        fibril_mutex_unlock(&tcp->lock);
     635        fibril_condvar_broadcast(&tcp->cv);
    623636}
    624637
  • uspace/lib/c/generic/inet/udp.c

    r204ba47 r1f2b07a  
    7373
    7474        list_initialize(&udp->assoc);
     75        fibril_mutex_initialize(&udp->lock);
     76        fibril_condvar_initialize(&udp->cv);
    7577
    7678        rc = loc_service_get_id(SERVICE_NAME_UDP, &udp_svcid,
     
    107109
    108110        async_hangup(udp->sess);
     111
     112        fibril_mutex_lock(&udp->lock);
     113        while (!udp->cb_done)
     114                fibril_condvar_wait(&udp->cv, &udp->lock);
     115        fibril_mutex_unlock(&udp->lock);
     116
    109117        free(udp);
    110118}
     
    343351
    344352                if (!IPC_GET_IMETHOD(call)) {
    345                         /* TODO: Handle hangup */
    346                         return;
     353                        /* Hangup */
     354                        goto out;
    347355                }
    348356
     
    356364                }
    357365        }
     366out:
     367        fibril_mutex_lock(&udp->lock);
     368        udp->cb_done = true;
     369        fibril_mutex_unlock(&udp->lock);
     370        fibril_condvar_broadcast(&udp->cv);
    358371}
    359372
  • uspace/lib/c/include/inet/tcp.h

    r204ba47 r1f2b07a  
    9090        /** List of listeners */
    9191        list_t listener; /* of tcp_listener_t */
     92        /** TCP service lock */
     93        fibril_mutex_t lock;
     94        /** For waiting on cb_done */
     95        fibril_condvar_t cv;
     96        /** Set to @a true when callback connection handler has terminated */
     97        bool cb_done;
    9298} tcp_t;
    9399
  • uspace/lib/c/include/inet/udp.h

    r204ba47 r1f2b07a  
    3737
    3838#include <async.h>
     39#include <fibril_synch.h>
    3940#include <inet/addr.h>
    4041#include <inet/endpoint.h>
    4142#include <inet/inet.h>
     43#include <stdbool.h>
    4244
    4345/** UDP link state */
     
    8183        /** List of associations */
    8284        list_t assoc; /* of udp_assoc_t */
     85        /** UDP service lock */
     86        fibril_mutex_t lock;
     87        /** For waiting on cb_done */
     88        fibril_condvar_t cv;
     89        /** Set to @a true when callback connection handler has terminated */
     90        bool cb_done;
    8391} udp_t;
    8492
  • uspace/srv/net/tcp/service.c

    r204ba47 r1f2b07a  
    886886                /* XXX Destroy listeners */
    887887        }
     888
     889        if (client->sess != NULL)
     890                async_hangup(client->sess);
    888891}
    889892
  • uspace/srv/net/udp/service.c

    r204ba47 r1f2b07a  
    490490        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_client_conn()");
    491491
     492        client.sess = NULL;
    492493        list_initialize(&client.cassoc);
    493494        list_initialize(&client.crcv_queue);
     
    545546
    546547        /* XXX Clean up client receive queue */
     548
     549        if (client.sess != NULL)
     550                async_hangup(client.sess);
    547551}
    548552
Note: See TracChangeset for help on using the changeset viewer.