Ignore:
File:
1 edited

Legend:

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

    r8a637a4 r4e00f87  
    4040#include "ns.h"
    4141
     42
    4243/** Service hash table item. */
    4344typedef struct {
    4445        ht_link_t link;
    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;
     46        sysarg_t service;        /**< Service ID. */
     47        sysarg_t phone;          /**< Phone registered with the service. */
     48        sysarg_t in_phone_hash;  /**< Incoming phone hash. */
    5449} hashed_service_t;
     50
    5551
    5652static size_t service_key_hash(void *key)
    5753{
    58         return *(service_t *) key;
     54        return *(sysarg_t*)key;
    5955}
    6056
    6157static size_t service_hash(const ht_link_t *item)
    6258{
    63         hashed_service_t *service =
    64             hash_table_get_inst(item, hashed_service_t, link);
    65        
    66         return service->service;
     59        hashed_service_t *hs = hash_table_get_inst(item, hashed_service_t, link);
     60        return hs->service;
    6761}
    6862
    6963static bool service_key_equal(void *key, const ht_link_t *item)
    7064{
    71         hashed_service_t *service =
    72             hash_table_get_inst(item, hashed_service_t, link);
    73        
    74         return service->service == *(service_t *) key;
     65        hashed_service_t *hs = hash_table_get_inst(item, hashed_service_t, link);
     66        return hs->service == *(sysarg_t*)key;
    7567}
    7668
     
    9082typedef struct {
    9183        link_t link;
    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 */
     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 */
    9688} pending_conn_t;
    9789
     
    10092int service_init(void)
    10193{
    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);
     94        if (!hash_table_create(&service_hash_table, 0, 0, &service_hash_table_ops)) {
     95                printf(NAME ": No memory available for services\n");
    10596                return ENOMEM;
    10697        }
     
    115106{
    116107loop:
    117         list_foreach(pending_conn, link, pending_conn_t, pending) {
    118                 ht_link_t *link = hash_table_find(&service_hash_table, &pending->service);
     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);
    119112                if (!link)
    120113                        continue;
    121114               
    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);
     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);
    125118               
    126                 list_remove(&pending->link);
    127                 free(pending);
    128                
     119                list_remove(cur);
     120                free(pr);
    129121                goto loop;
    130122        }
     
    140132 *
    141133 */
    142 int register_service(service_t service, sysarg_t phone, ipc_call_t *call)
     134int register_service(sysarg_t service, sysarg_t phone, ipc_call_t *call)
    143135{
    144136        if (hash_table_find(&service_hash_table, &service))
    145                 return EEXIST;
     137                return EEXISTS;
    146138       
    147         hashed_service_t *hashed_service =
    148             (hashed_service_t *) malloc(sizeof(hashed_service_t));
    149         if (!hashed_service)
     139        hashed_service_t *hs = (hashed_service_t *) malloc(sizeof(hashed_service_t));
     140        if (!hs)
    150141                return ENOMEM;
    151142       
    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);
     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);
    157147       
    158148        return EOK;
     
    162152 *
    163153 * @param service Service to be connected to.
    164  * @param iface   Interface to be connected to.
    165154 * @param call    Pointer to call structure.
    166155 * @param callid  Call ID of the request.
     
    169158 *
    170159 */
    171 void connect_to_service(service_t service, iface_t iface, ipc_call_t *call,
    172     ipc_callid_t callid)
     160void connect_to_service(sysarg_t service, ipc_call_t *call, ipc_callid_t callid)
    173161{
    174         sysarg_t arg3 = IPC_GET_ARG3(*call);
    175         sysarg_t flags = IPC_GET_ARG4(*call);
    176162        sysarg_t retval;
    177163       
    178164        ht_link_t *link = hash_table_find(&service_hash_table, &service);
    179165        if (!link) {
    180                 if (flags & IPC_FLAG_BLOCKING) {
     166                if (IPC_GET_ARG4(*call) & IPC_FLAG_BLOCKING) {
    181167                        /* Blocking connection, add to pending list */
    182                         pending_conn_t *pending =
     168                        pending_conn_t *pr =
    183169                            (pending_conn_t *) malloc(sizeof(pending_conn_t));
    184                         if (!pending) {
     170                        if (!pr) {
    185171                                retval = ENOMEM;
    186172                                goto out;
    187173                        }
    188174                       
    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);
     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);
    196181                        return;
    197182                }
    198                
    199183                retval = ENOENT;
    200184                goto out;
    201185        }
    202186       
    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);
     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);
    206190        return;
    207191       
Note: See TracChangeset for help on using the changeset viewer.