Exemplo n.º 1
0
def _poll_connectivity(state, channel, initial_try_to_connect):
    try_to_connect = initial_try_to_connect
    connectivity = channel.check_connectivity_state(try_to_connect)
    with state.lock:
        state.connectivity = (
            _common.CYGRPC_CONNECTIVITY_STATE_TO_CHANNEL_CONNECTIVITY[
                connectivity])
        callbacks = tuple(callback
                          for callback, unused_but_known_to_be_none_connectivity
                          in state.callbacks_and_connectivities)
        for callback_and_connectivity in state.callbacks_and_connectivities:
            callback_and_connectivity[1] = state.connectivity
        if callbacks:
            _spawn_delivery(state, callbacks)
    while True:
        event = channel.watch_connectivity_state(connectivity,
                                                 time.time() + 0.2)
        cygrpc.block_if_fork_in_progress(state)
        with state.lock:
            if not state.callbacks_and_connectivities and not state.try_to_connect:
                state.polling = False
                state.connectivity = None
                break
            try_to_connect = state.try_to_connect
            state.try_to_connect = False
        if event.success or try_to_connect:
            connectivity = channel.check_connectivity_state(try_to_connect)
            with state.lock:
                state.connectivity = (
                    _common.CYGRPC_CONNECTIVITY_STATE_TO_CHANNEL_CONNECTIVITY[
                        connectivity])
                if not state.delivering:
                    callbacks = _deliveries(state)
                    if callbacks:
                        _spawn_delivery(state, callbacks)
Exemplo n.º 2
0
def _poll_connectivity(state, channel, initial_try_to_connect):
    try_to_connect = initial_try_to_connect
    connectivity = channel.check_connectivity_state(try_to_connect)
    with state.lock:
        state.connectivity = (
            _common.
            CYGRPC_CONNECTIVITY_STATE_TO_CHANNEL_CONNECTIVITY[connectivity])
        callbacks = tuple(
            callback for callback, unused_but_known_to_be_none_connectivity in
            state.callbacks_and_connectivities)
        for callback_and_connectivity in state.callbacks_and_connectivities:
            callback_and_connectivity[1] = state.connectivity
        if callbacks:
            _spawn_delivery(state, callbacks)
    while True:
        event = channel.watch_connectivity_state(connectivity,
                                                 time.time() + 0.2)
        cygrpc.block_if_fork_in_progress(state)
        with state.lock:
            if not state.callbacks_and_connectivities and not state.try_to_connect:
                state.polling = False
                state.connectivity = None
                break
            try_to_connect = state.try_to_connect
            state.try_to_connect = False
        if event.success or try_to_connect:
            connectivity = channel.check_connectivity_state(try_to_connect)
            with state.lock:
                state.connectivity = (
                    _common.CYGRPC_CONNECTIVITY_STATE_TO_CHANNEL_CONNECTIVITY[
                        connectivity])
                if not state.delivering:
                    callbacks = _deliveries(state)
                    if callbacks:
                        _spawn_delivery(state, callbacks)
Exemplo n.º 3
0
 def consume_request_iterator():  # pylint: disable=too-many-branches
     while True:
         return_from_user_request_generator_invoked = False
         try:
             # The thread may die in user-code. Do not block fork for this.
             cygrpc.enter_user_request_generator()
             request = next(request_iterator)
         except StopIteration:
             break
         except Exception:  # pylint: disable=broad-except
             cygrpc.return_from_user_request_generator()
             return_from_user_request_generator_invoked = True
             code = grpc.StatusCode.UNKNOWN
             details = 'Exception iterating requests!'
             _LOGGER.exception(details)
             call.cancel(_common.STATUS_CODE_TO_CYGRPC_STATUS_CODE[code],
                         details)
             _abort(state, code, details)
             return
         finally:
             if not return_from_user_request_generator_invoked:
                 cygrpc.return_from_user_request_generator()
         serialized_request = _common.serialize(request, request_serializer)
         with state.condition:
             if state.code is None and not state.cancelled:
                 if serialized_request is None:
                     code = grpc.StatusCode.INTERNAL
                     details = 'Exception serializing request!'
                     call.cancel(
                         _common.STATUS_CODE_TO_CYGRPC_STATUS_CODE[code],
                         details)
                     _abort(state, code, details)
                     return
                 else:
                     operations = (cygrpc.SendMessageOperation(
                         serialized_request, _EMPTY_FLAGS), )
                     operating = call.operate(operations, event_handler)
                     if operating:
                         state.due.add(cygrpc.OperationType.send_message)
                     else:
                         return
                     while True:
                         state.condition.wait(condition_wait_timeout)
                         cygrpc.block_if_fork_in_progress(state)
                         if state.code is None:
                             if cygrpc.OperationType.send_message not in state.due:
                                 break
                         else:
                             return
             else:
                 return
     with state.condition:
         if state.code is None:
             operations = (
                 cygrpc.SendCloseFromClientOperation(_EMPTY_FLAGS), )
             operating = call.operate(operations, event_handler)
             if operating:
                 state.due.add(cygrpc.OperationType.send_close_from_client)
Exemplo n.º 4
0
 def consume_request_iterator():  # pylint: disable=too-many-branches
     while True:
         return_from_user_request_generator_invoked = False
         try:
             # The thread may die in user-code. Do not block fork for this.
             cygrpc.enter_user_request_generator()
             request = next(request_iterator)
         except StopIteration:
             break
         except Exception:  # pylint: disable=broad-except
             cygrpc.return_from_user_request_generator()
             return_from_user_request_generator_invoked = True
             code = grpc.StatusCode.UNKNOWN
             details = 'Exception iterating requests!'
             _LOGGER.exception(details)
             call.cancel(_common.STATUS_CODE_TO_CYGRPC_STATUS_CODE[code],
                         details)
             _abort(state, code, details)
             return
         finally:
             if not return_from_user_request_generator_invoked:
                 cygrpc.return_from_user_request_generator()
         serialized_request = _common.serialize(request, request_serializer)
         with state.condition:
             if state.code is None and not state.cancelled:
                 if serialized_request is None:
                     code = grpc.StatusCode.INTERNAL
                     details = 'Exception serializing request!'
                     call.cancel(
                         _common.STATUS_CODE_TO_CYGRPC_STATUS_CODE[code],
                         details)
                     _abort(state, code, details)
                     return
                 else:
                     operations = (cygrpc.SendMessageOperation(
                         serialized_request, _EMPTY_FLAGS),)
                     operating = call.operate(operations, event_handler)
                     if operating:
                         state.due.add(cygrpc.OperationType.send_message)
                     else:
                         return
                     while True:
                         state.condition.wait(condition_wait_timeout)
                         cygrpc.block_if_fork_in_progress(state)
                         if state.code is None:
                             if cygrpc.OperationType.send_message not in state.due:
                                 break
                         else:
                             return
             else:
                 return
     with state.condition:
         if state.code is None:
             operations = (
                 cygrpc.SendCloseFromClientOperation(_EMPTY_FLAGS),)
             operating = call.operate(operations, event_handler)
             if operating:
                 state.due.add(cygrpc.OperationType.send_close_from_client)
Exemplo n.º 5
0
 def channel_spin():
     while True:
         cygrpc.block_if_fork_in_progress(state)
         event = state.channel.next_call_event()
         if event.completion_type == cygrpc.CompletionType.queue_timeout:
             continue
         call_completed = event.tag(event)
         if call_completed:
             with state.lock:
                 state.managed_calls -= 1
                 if state.managed_calls == 0:
                     return
Exemplo n.º 6
0
 def channel_spin():
     while True:
         cygrpc.block_if_fork_in_progress(state)
         event = state.channel.next_call_event()
         if event.completion_type == cygrpc.CompletionType.queue_timeout:
             continue
         call_completed = event.tag(event)
         if call_completed:
             with state.lock:
                 state.managed_calls -= 1
                 if state.managed_calls == 0:
                     return
Exemplo n.º 7
0
def _deliver(state, initial_connectivity, initial_callbacks):
    connectivity = initial_connectivity
    callbacks = initial_callbacks
    while True:
        for callback in callbacks:
            cygrpc.block_if_fork_in_progress(state)
            callable_util.call_logging_exceptions(
                callback, _CHANNEL_SUBSCRIPTION_CALLBACK_ERROR_LOG_MESSAGE,
                connectivity)
        with state.lock:
            callbacks = _deliveries(state)
            if callbacks:
                connectivity = state.connectivity
            else:
                state.delivering = False
                return
Exemplo n.º 8
0
def _deliver(state, initial_connectivity, initial_callbacks):
    connectivity = initial_connectivity
    callbacks = initial_callbacks
    while True:
        for callback in callbacks:
            cygrpc.block_if_fork_in_progress(state)
            try:
                callback(connectivity)
            except Exception:  # pylint: disable=broad-except
                _LOGGER.exception(
                    _CHANNEL_SUBSCRIPTION_CALLBACK_ERROR_LOG_MESSAGE)
        with state.lock:
            callbacks = _deliveries(state)
            if callbacks:
                connectivity = state.connectivity
            else:
                state.delivering = False
                return
Exemplo n.º 9
0
def _deliver(state, initial_connectivity, initial_callbacks):
    connectivity = initial_connectivity
    callbacks = initial_callbacks
    while True:
        for callback in callbacks:
            cygrpc.block_if_fork_in_progress(state)
            try:
                callback(connectivity)
            except Exception:  # pylint: disable=broad-except
                _LOGGER.exception(
                    _CHANNEL_SUBSCRIPTION_CALLBACK_ERROR_LOG_MESSAGE)
        with state.lock:
            callbacks = _deliveries(state)
            if callbacks:
                connectivity = state.connectivity
            else:
                state.delivering = False
                return