def new_brb_out_request(meth, *args, &blck)
      Thread.current[:brb_nb_out] ||= 0
      Thread.current[:brb_nb_out] += 1

      raise BrBCallbackWithBlockingMethodException.new if is_brb_request_blocking?(meth) and block_given?

      block = (is_brb_request_blocking?(meth) or block_given?) ? Thread.current.to_s.to_sym : nil
      if block
        args << block 
        args << Thread.current[:brb_nb_out]
      end
      
      if block_given?
        # Simulate a method with _block in order to make BrB send the answer
        meth = "#{meth}_block".to_sym
      end

      args.size > 0 ? brb_send([MessageRequestCode, meth, args]) : brb_send([MessageRequestCode, meth])

      if block_given?
        # Declare the callback
        declare_callback(block, Thread.current[:brb_nb_out], &blck)

      elsif block # Block until the request return

        #TimeMonitor.instance.watch_thread!(@timeout_rcv_value || 45)
        begin
          r = recv(block, Thread.current[:brb_nb_out], &blck)
        rescue Exception => e
          raise e
        ensure
          #TimeMonitor.instance.remove_thread!
        end
        if r.kind_of? Exception
          raise r
        end
        return r
      end

      nil
    end
def new_brb_out_request(meth, *args, &blck)
      Thread.current[:brb_nb_out] ||= 0
      Thread.current[:brb_nb_out] += 1

      raise BrBCallbackWithBlockingMethodException.new if is_brb_request_blocking?(meth) and block_given?

      block = (is_brb_request_blocking?(meth) or block_given?) ? Thread.current.to_s.to_sym : nil
      if block
        args << block 
        args << Thread.current[:brb_nb_out]
      end
      
      if block_given?
        # Simulate a method with _block in order to make BrB send the answer
        meth = "#{meth}_block".to_sym
      end

      args.size > 0 ? brb_send([MessageRequestCode, meth, args]) : brb_send([MessageRequestCode, meth])

      if block_given?
        # Declare the callback
        declare_callback(block, Thread.current[:brb_nb_out], &blck)

      elsif block # Block until the request return

        #TimeMonitor.instance.watch_thread!(@timeout_rcv_value || 45)
        begin
          r = recv(block, Thread.current[:brb_nb_out], &blck)
        rescue Exception => e
          raise e
        ensure
          #TimeMonitor.instance.remove_thread!
        end
        if r.kind_of? Exception
          raise r
        end
        return r
      end

      nil
    end
Execute a request on a distant object