Changeset 9b1baac in mainline for uspace/lib/c/generic/ns.c


Ignore:
Timestamp:
2018-07-18T08:35:42Z (7 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
0b05082
Parents:
edc64c0
Message:

ns: register service interfaces individually

Each service interface is now registered individually with the naming
service. This adds a degree of type safety, potentially allows the
individual interfaces to be implemented by independent tasks and moves
the code slightly closer to the full-fledged ports design.

Broker services (e.g. the location service) can still register a
fallback port for receiving connections to all interface types
explicitly using service_register_broker().

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/ns.c

    redc64c0 r9b1baac  
    4646static async_sess_t *sess_ns = NULL;
    4747
    48 errno_t service_register(service_t service)
    49 {
    50         errno_t retval;
     48errno_t service_register(service_t service, iface_t iface,
     49    async_port_handler_t handler, void *data)
     50{
     51        async_sess_t *sess = ns_session_get();
     52        if (sess == NULL)
     53                return EIO;
     54
     55        port_id_t port;
     56        errno_t rc = async_create_port(iface, handler, data, &port);
     57        if (rc != EOK)
     58                return rc;
     59
     60        async_exch_t *exch = async_exchange_begin(sess);
     61
    5162        ipc_call_t answer;
    52 
    53         async_sess_t *sess = ns_session_get();
    54         if (sess == NULL)
    55                 return EIO;
    56 
    57         async_exch_t *exch = async_exchange_begin(sess);
    58         aid_t req = async_send_1(exch, NS_REGISTER, service, &answer);
    59         errno_t rc = async_connect_to_me(exch, 0, service, 0);
     63        aid_t req = async_send_2(exch, NS_REGISTER, service, iface, &answer);
     64        rc = async_connect_to_me(exch, iface, service, 0);
    6065
    6166        async_exchange_end(exch);
     
    6671        }
    6772
     73        errno_t retval;
     74        async_wait_for(req, &retval);
     75        return rc;
     76}
     77
     78errno_t service_register_broker(service_t service, async_port_handler_t handler,
     79    void *data)
     80{
     81        async_set_fallback_port_handler(handler, data);
     82
     83        async_sess_t *sess = ns_session_get();
     84        if (sess == NULL)
     85                return EIO;
     86
     87        async_exch_t *exch = async_exchange_begin(sess);
     88
     89        ipc_call_t answer;
     90        aid_t req = async_send_1(exch, NS_REGISTER_BROKER, service, &answer);
     91        errno_t rc = async_connect_to_me(exch, INTERFACE_ANY, service, 0);
     92
     93        async_exchange_end(exch);
     94
     95        if (rc != EOK) {
     96                async_forget(req);
     97                return rc;
     98        }
     99
     100        errno_t retval;
    68101        async_wait_for(req, &retval);
    69102        return rc;
Note: See TracChangeset for help on using the changeset viewer.