@@ -855,19 +855,28 @@ pplx::task<void> http_linux_server::register_listener(details::http_listener_imp
855
855
if (m_registered_listeners.find (listener) != m_registered_listeners.end ())
856
856
throw std::invalid_argument (" listener already registered" );
857
857
858
- m_registered_listeners[listener] = utility::details::make_unique<pplx::extensibility::reader_writer_lock_t >();
858
+ try
859
+ {
860
+ m_registered_listeners[listener] = utility::details::make_unique<pplx::extensibility::reader_writer_lock_t >();
859
861
860
- auto found_hostport_listener = m_listeners.find (hostport);
861
- if (found_hostport_listener == m_listeners.end ())
862
- {
863
- found_hostport_listener = m_listeners.insert (
864
- std::make_pair (hostport, utility::details::make_unique<details::hostport_listener>(this , hostport))).first ;
862
+ auto found_hostport_listener = m_listeners.find (hostport);
863
+ if (found_hostport_listener == m_listeners.end ())
864
+ {
865
+ found_hostport_listener = m_listeners.insert (
866
+ std::make_pair (hostport, utility::details::make_unique<details::hostport_listener>(this , hostport))).first ;
865
867
866
- if (m_started)
867
- found_hostport_listener->second ->start ();
868
- }
868
+ if (m_started)
869
+ found_hostport_listener->second ->start ();
870
+ }
869
871
870
- found_hostport_listener->second ->add_listener (path, listener);
872
+ found_hostport_listener->second ->add_listener (path, listener);
873
+ }
874
+ catch (...) // naive solution
875
+ {
876
+ m_registered_listeners.erase (listener);
877
+ m_listeners.erase (hostport);
878
+ throw ;
879
+ }
871
880
}
872
881
873
882
return pplx::task_from_result ();
0 commit comments