Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/net/modules.c

    rbf172825 r9934f7d  
    114114    async_client_conn_t client_receiver)
    115115{
     116        return bind_service_timeout(need, arg1, arg2, arg3, client_receiver, 0);
     117}
     118
     119/** Create bidirectional connection with the needed module service and registers
     120 * the message receiver.
     121 *
     122 * @param[in] need      The needed module service.
     123 * @param[in] arg1      The first parameter.
     124 * @param[in] arg2      The second parameter.
     125 * @param[in] arg3      The third parameter.
     126 * @param[in] client_receiver The message receiver.
     127 * @param[in] timeout   The connection timeout in microseconds. No timeout if
     128 *                      set to zero (0).
     129 *
     130 * @return              The phone of the needed service.
     131 * @return              ETIMEOUT if the connection timeouted.
     132 * @return              Other error codes as defined for the ipc_connect_to_me()
     133 *                      function.
     134 *
     135 */
     136int bind_service_timeout(services_t need, sysarg_t arg1, sysarg_t arg2,
     137    sysarg_t arg3, async_client_conn_t client_receiver, suseconds_t timeout)
     138{
    116139        /* Connect to the needed service */
    117         int phone = connect_to_service(need);
     140        int phone = connect_to_service_timeout(need, timeout);
    118141        if (phone >= 0) {
    119142                /* Request the bidirectional connection */
     
    136159int connect_to_service(services_t need)
    137160{
    138         return service_obsolete_connect_blocking(need, 0, 0);
     161        return connect_to_service_timeout(need, 0);
     162}
     163
     164/** Connects to the needed module.
     165 *
     166 *  @param[in] need     The needed module service.
     167 *  @param[in] timeout  The connection timeout in microseconds. No timeout if
     168 *                      set to zero (0).
     169 *  @return             The phone of the needed service.
     170 *  @return             ETIMEOUT if the connection timeouted.
     171 */
     172int connect_to_service_timeout(services_t need, suseconds_t timeout)
     173{
     174        int phone;
     175
     176        /* If no timeout is set */
     177        if (timeout <= 0)
     178                return service_obsolete_connect_blocking(need, 0, 0);
     179       
     180        while (true) {
     181                phone = service_obsolete_connect(need, 0, 0);
     182                if ((phone >= 0) || (phone != ENOENT))
     183                        return phone;
     184
     185                /* Abort if no time is left */
     186                if (timeout <= 0)
     187                        return ETIMEOUT;
     188
     189                /* Wait the minimum of the module wait time and the timeout */
     190                usleep((timeout <= MODULE_WAIT_TIME) ?
     191                    timeout : MODULE_WAIT_TIME);
     192                timeout -= MODULE_WAIT_TIME;
     193        }
    139194}
    140195
Note: See TracChangeset for help on using the changeset viewer.