Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/ns/service.c

    r4e00f87 r8a637a4  
    4040#include "ns.h"
    4141
    42 
    4342/** Service hash table item. */
    4443typedef struct {
    4544        ht_link_t link;
    46         sysarg_t service;        /**< Service ID. */
    47         sysarg_t phone;          /**< Phone registered with the service. */
    48         sysarg_t in_phone_hash;  /**< Incoming phone hash. */
     45       
     46        /** Service ID */
     47        service_t service;
     48       
     49        /** Phone registered with the interface */
     50        sysarg_t phone;
     51       
     52        /** Incoming phone hash */
     53        sysarg_t in_phone_hash;
    4954} hashed_service_t;
    5055
    51 
    5256static size_t service_key_hash(void *key)
    5357{
    54         return *(sysarg_t*)key;
     58        return *(service_t *) key;
    5559}
    5660
    5761static size_t service_hash(const ht_link_t *item)
    5862{
    59         hashed_service_t *hs = hash_table_get_inst(item, hashed_service_t, link);
    60         return hs->service;
     63        hashed_service_t *service =
     64            hash_table_get_inst(item, hashed_service_t, link);
     65       
     66        return service->service;
    6167}
    6268
    6369static bool service_key_equal(void *key, const ht_link_t *item)
    6470{
    65         hashed_service_t *hs = hash_table_get_inst(item, hashed_service_t, link);
    66         return hs->service == *(sysarg_t*)key;
     71        hashed_service_t *service =
     72            hash_table_get_inst(item, hashed_service_t, link);
     73       
     74        return service->service == *(service_t *) key;
    6775}
    6876
     
    8290typedef struct {
    8391        link_t link;
    84         sysarg_t service;        /**< Number of the service. */
    85         ipc_callid_t callid;     /**< Call ID waiting for the connection */
    86         sysarg_t arg2;           /**< Second argument */
    87         sysarg_t arg3;           /**< Third argument */
     92        service_t service;    /**< Service ID */
     93        iface_t iface;        /**< Interface ID */
     94        ipc_callid_t callid;  /**< Call ID waiting for the connection */
     95        sysarg_t arg3;        /**< Third argument */
    8896} pending_conn_t;
    8997
     
    92100int service_init(void)
    93101{
    94         if (!hash_table_create(&service_hash_table, 0, 0, &service_hash_table_ops)) {
    95                 printf(NAME ": No memory available for services\n");
     102        if (!hash_table_create(&service_hash_table, 0, 0,
     103            &service_hash_table_ops)) {
     104                printf("%s: No memory available for services\n", NAME);
    96105                return ENOMEM;
    97106        }
     
    106115{
    107116loop:
    108         list_foreach(pending_conn, cur) {
    109                 pending_conn_t *pr = list_get_instance(cur, pending_conn_t, link);
    110                
    111                 ht_link_t *link = hash_table_find(&service_hash_table, &pr->service);
     117        list_foreach(pending_conn, link, pending_conn_t, pending) {
     118                ht_link_t *link = hash_table_find(&service_hash_table, &pending->service);
    112119                if (!link)
    113120                        continue;
    114121               
    115                 hashed_service_t *hs = hash_table_get_inst(link, hashed_service_t, link);
    116                 (void) ipc_forward_fast(pr->callid, hs->phone, pr->arg2,
    117                     pr->arg3, 0, IPC_FF_NONE);
    118                
    119                 list_remove(cur);
    120                 free(pr);
     122                hashed_service_t *hashed_service = hash_table_get_inst(link, hashed_service_t, link);
     123                (void) ipc_forward_fast(pending->callid, hashed_service->phone,
     124                    pending->iface, pending->arg3, 0, IPC_FF_NONE);
     125               
     126                list_remove(&pending->link);
     127                free(pending);
     128               
    121129                goto loop;
    122130        }
     
    132140 *
    133141 */
    134 int register_service(sysarg_t service, sysarg_t phone, ipc_call_t *call)
     142int register_service(service_t service, sysarg_t phone, ipc_call_t *call)
    135143{
    136144        if (hash_table_find(&service_hash_table, &service))
    137                 return EEXISTS;
    138        
    139         hashed_service_t *hs = (hashed_service_t *) malloc(sizeof(hashed_service_t));
    140         if (!hs)
     145                return EEXIST;
     146       
     147        hashed_service_t *hashed_service =
     148            (hashed_service_t *) malloc(sizeof(hashed_service_t));
     149        if (!hashed_service)
    141150                return ENOMEM;
    142151       
    143         hs->service = service;
    144         hs->phone = phone;
    145         hs->in_phone_hash = call->in_phone_hash;
    146         hash_table_insert(&service_hash_table, &hs->link);
     152        hashed_service->service = service;
     153        hashed_service->phone = phone;
     154        hashed_service->in_phone_hash = call->in_phone_hash;
     155       
     156        hash_table_insert(&service_hash_table, &hashed_service->link);
    147157       
    148158        return EOK;
     
    152162 *
    153163 * @param service Service to be connected to.
     164 * @param iface   Interface to be connected to.
    154165 * @param call    Pointer to call structure.
    155166 * @param callid  Call ID of the request.
     
    158169 *
    159170 */
    160 void connect_to_service(sysarg_t service, ipc_call_t *call, ipc_callid_t callid)
    161 {
     171void connect_to_service(service_t service, iface_t iface, ipc_call_t *call,
     172    ipc_callid_t callid)
     173{
     174        sysarg_t arg3 = IPC_GET_ARG3(*call);
     175        sysarg_t flags = IPC_GET_ARG4(*call);
    162176        sysarg_t retval;
    163177       
    164178        ht_link_t *link = hash_table_find(&service_hash_table, &service);
    165179        if (!link) {
    166                 if (IPC_GET_ARG4(*call) & IPC_FLAG_BLOCKING) {
     180                if (flags & IPC_FLAG_BLOCKING) {
    167181                        /* Blocking connection, add to pending list */
    168                         pending_conn_t *pr =
     182                        pending_conn_t *pending =
    169183                            (pending_conn_t *) malloc(sizeof(pending_conn_t));
    170                         if (!pr) {
     184                        if (!pending) {
    171185                                retval = ENOMEM;
    172186                                goto out;
    173187                        }
    174188                       
    175                         link_initialize(&pr->link);
    176                         pr->service = service;
    177                         pr->callid = callid;
    178                         pr->arg2 = IPC_GET_ARG2(*call);
    179                         pr->arg3 = IPC_GET_ARG3(*call);
    180                         list_append(&pr->link, &pending_conn);
     189                        link_initialize(&pending->link);
     190                        pending->service = service;
     191                        pending->iface = iface;
     192                        pending->callid = callid;
     193                        pending->arg3 = arg3;
     194                       
     195                        list_append(&pending->link, &pending_conn);
    181196                        return;
    182197                }
     198               
    183199                retval = ENOENT;
    184200                goto out;
    185201        }
    186202       
    187         hashed_service_t *hs = hash_table_get_inst(link, hashed_service_t, link);
    188         (void) ipc_forward_fast(callid, hs->phone, IPC_GET_ARG2(*call),
    189             IPC_GET_ARG3(*call), 0, IPC_FF_NONE);
     203        hashed_service_t *hashed_service = hash_table_get_inst(link, hashed_service_t, link);
     204        (void) ipc_forward_fast(callid, hashed_service->phone, iface, arg3,
     205            0, IPC_FF_NONE);
    190206        return;
    191207       
Note: See TracChangeset for help on using the changeset viewer.