def execute(path, method, args)
      thread = Thread.current
      tag = "#{Time.now.to_f}:#{thread.object_id}"
      
      @semaphore.synchronize {
        # since this client can't multiplex, we set the tag to nil
        @socket.write(MarilynRPC::MailFactory.build_call(tag, path, method, args))
        
        # lets write our self to the list of waining threads
        @threads[tag] = thread
      }
      
      # stop the current thread, the thread will be started after the response
      # arrived
      Thread.stop

      # get mail from responses
      mail = thread[MAIL_KEY]

      if mail.is_a? MarilynRPC::CallResponseMail
        mail.result
      else
        raise MarilynError.new # raise exception to capture the client backtrace
      end
    rescue MarilynError => exception
      # add local and remote trace together and reraise the original exception
      backtrace = []
      backtrace += exception.backtrace
      backtrace += mail.exception.backtrace
      mail.exception.set_backtrace(backtrace)
      raise mail.exception
    end
def execute(path, method, args)
      thread = Thread.current
      tag = "#{Time.now.to_f}:#{thread.object_id}"
      
      @semaphore.synchronize {
        # since this client can't multiplex, we set the tag to nil
        @socket.write(MarilynRPC::MailFactory.build_call(tag, path, method, args))
        
        # lets write our self to the list of waining threads
        @threads[tag] = thread
      }
      
      # stop the current thread, the thread will be started after the response
      # arrived
      Thread.stop

      # get mail from responses
      mail = thread[MAIL_KEY]

      if mail.is_a? MarilynRPC::CallResponseMail
        mail.result
      else
        raise MarilynError.new # raise exception to capture the client backtrace
      end
    rescue MarilynError => exception
      # add local and remote trace together and reraise the original exception
      backtrace = []
      backtrace += exception.backtrace
      backtrace += mail.exception.backtrace
      mail.exception.set_backtrace(backtrace)
      raise mail.exception
    end
Executes a client call blocking. To issue an async call one needs to
 have start separate threads. THe Native client uses then multiplexing to
 avoid the other threads blocking.
 @api private
 @param [Object] path the path to identifiy the service
 @param [Symbol, String] method the method name to call on the service
 @param [Array<Object>] args the arguments that are passed to the remote
   side
 @return [Object] the result of the call