anchor.diff:  -spec(unregister_service(proto_id()) -> ok).
   unregister_service(ProtocolId) ->
       gen_server:cast(?SERVER, {unregister_service, ProtocolId}).
  +
  +%% @doc Blocking version of unregister_service.
  +-spec sync_unregister_service(proto_id()) -> ok.
  +sync_unregister_service(ProtocolId) ->
  +    gen_server:call(?SERVER, {unregister_service, ProtocolId}).
   
   %% @doc True if the given protocal id is registered.
   -spec(is_registered(proto_id()) -> boolean()).
  
positive.code:             gen_server:start_link({local, ?SERVER}, ?MODULE, Args, Options)
      end.
  
  %% @doc Once a protocol specification is registered, it will be kept available
  %% by the Service Manager. Note that the callee is responsible for taking
  %% ownership of the socket via Transport:controlling_process(Socket, Pid).
  %% Only the strategy of `round_robin' is supported; it's arg is ignored.
  -spec(register_service(hostspec(), service_scheduler_strategy()) -> ok).
  register_service(HostProtocol, Strategy) ->
      %% only one strategy is supported as yet
      {round_robin, _NB} = Strategy,
      gen_server:cast(?SERVER, {register_service, HostProtocol, Strategy}).
  
  %% @doc Unregister the given protocol-id. Existing connections for this
  %% protocol are not killed. New connections for this protocol will not be
  
negative.code:                                 ?MODULE, SubProtocols),
      lager:info("Service manager: listening on ~s:~p", [IP, Port]),
      {ok, Pid}.
  
  %% @doc Register a service, and store.
  handle_register_service(Protocol, Strategy, Services) ->
      {{ProtocolId,_Revs},_Rest} = Protocol,
      orddict:store(ProtocolId, {Protocol, Strategy}, Services).
  
  %% @doc Unregister service.
  handle_unregister_service(ProtocolId, Services) ->
      orddict:erase(ProtocolId, Services).
  