Changeset 9b1baac in mainline for uspace/lib/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().

Location:
uspace/lib/c
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/async/server.c

    redc64c0 r9b1baac  
    13171317 * Ask through phone for a new connection to some service.
    13181318 *
    1319  * @param exch Exchange for sending the message.
    1320  * @param arg1 User defined argument.
    1321  * @param arg2 User defined argument.
    1322  * @param arg3 User defined argument.
     1319 * @param exch  Exchange for sending the message.
     1320 * @param iface Callback interface.
     1321 * @param arg2  User defined argument.
     1322 * @param arg3  User defined argument.
    13231323 *
    13241324 * @return Zero on success or an error code.
    13251325 *
    13261326 */
    1327 errno_t async_connect_to_me(async_exch_t *exch, sysarg_t arg1, sysarg_t arg2,
     1327errno_t async_connect_to_me(async_exch_t *exch, iface_t iface, sysarg_t arg2,
    13281328    sysarg_t arg3)
    13291329{
     
    13321332
    13331333        ipc_call_t answer;
    1334         aid_t req = async_send_3(exch, IPC_M_CONNECT_TO_ME, arg1, arg2, arg3,
     1334        aid_t req = async_send_3(exch, IPC_M_CONNECT_TO_ME, iface, arg2, arg3,
    13351335            &answer);
    13361336
  • uspace/lib/c/generic/devman.c

    redc64c0 r9b1baac  
    192192
    193193        exch = devman_exchange_begin(INTERFACE_DDF_DRIVER);
    194         async_connect_to_me(exch, 0, 0, 0);
     194        async_connect_to_me(exch, INTERFACE_ANY, 0, 0);
    195195        devman_exchange_end(exch);
    196196
  • uspace/lib/c/generic/loc.c

    redc64c0 r9b1baac  
    255255        }
    256256
    257         async_connect_to_me(exch, 0, 0, 0);
     257        async_connect_to_me(exch, INTERFACE_ANY, 0, 0);
    258258
    259259        /*
  • 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;
  • uspace/lib/c/include/async.h

    redc64c0 r9b1baac  
    342342extern async_sess_t *async_connect_kbox(task_id_t);
    343343
    344 extern errno_t async_connect_to_me(async_exch_t *, sysarg_t, sysarg_t, sysarg_t);
     344extern errno_t async_connect_to_me(async_exch_t *, iface_t, sysarg_t, sysarg_t);
    345345
    346346extern errno_t async_hangup(async_sess_t *);
  • uspace/lib/c/include/ipc/ns.h

    redc64c0 r9b1baac  
    4141        NS_PING = IPC_FIRST_USER_METHOD,
    4242        NS_REGISTER,
     43        NS_REGISTER_BROKER,
    4344        NS_TASK_WAIT,
    4445        NS_ID_INTRO,
  • uspace/lib/c/include/ns.h

    redc64c0 r9b1baac  
    4040#include <async.h>
    4141
    42 extern errno_t service_register(service_t);
     42extern errno_t service_register(service_t, iface_t, async_port_handler_t,
     43    void *);
     44extern errno_t service_register_broker(service_t, async_port_handler_t, void *);
    4345extern async_sess_t *service_connect(service_t, iface_t, sysarg_t);
    4446extern async_sess_t *service_connect_blocking(service_t, iface_t, sysarg_t);
Note: See TracChangeset for help on using the changeset viewer.