# # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # $:.unshift File.dirname(__FILE__) + '/../lib' require 'thrift' $:.unshift File.dirname(__FILE__) + "/gen-rb" require 'benchmark_service' module Server include Thrift class BenchmarkHandler # 1-based index into the fibonacci sequence def fibonacci(n) seq = [1, 1] 3.upto(n) do seq << seq[-1] + seq[-2] end seq[n-1] # n is 1-based end end def self.start_server(host, port, serverClass) handler = BenchmarkHandler.new processor = ThriftBenchmark::BenchmarkService::Processor.new(handler) transport = ServerSocket.new(host, port) transport_factory = FramedTransportFactory.new args = [processor, transport, transport_factory, nil, 20] if serverClass == NonblockingServer logger = Logger.new(STDERR) logger.level = Logger::WARN args << logger end server = serverClass.new(*args) @server_thread = Thread.new do server.serve end @server = server end def self.shutdown return if @server.nil? if @server.respond_to? :shutdown @server.shutdown else @server_thread.kill end end end def resolve_const(const) const and const.split('::').inject(Object) { |k,c| k.const_get(c) } end host, port, serverklass = ARGV Server.start_server(host, port.to_i, resolve_const(serverklass)) # let our host know that the interpreter has started # ideally we'd wait until the server was serving, but we don't have a hook for that Marshal.dump(:started, STDOUT) STDOUT.flush Marshal.load(STDIN) # wait until we're instructed to shut down Server.shutdown