@@ -387,17 +387,25 @@ class connection_base {
387387 // / Cancels specific operations.
388388 void cancel (operation op)
389389 {
390- // TODO: Simplify
391390 switch (op) {
392391 case operation::resolve:
393392 resv_.cancel ();
394393 break ;
395394 case operation::ssl_handshake:
396395 ssl_handshaker_.cancel ();
397396 break ;
397+ case operation::exec:
398+ cancel_unwritten_requests ();
399+ break ;
398400 case operation::reconnection:
399401 cfg_.reconnect_wait_interval = std::chrono::seconds::zero ();
400402 break ;
403+ case operation::run:
404+ cancel_run ();
405+ break ;
406+ case operation::receive:
407+ receive_channel_.cancel ();
408+ break ;
401409 case operation::health_check:
402410 health_checker_.cancel ();
403411 break ;
@@ -406,18 +414,12 @@ class connection_base {
406414 ssl_handshaker_.cancel ();
407415 cfg_.reconnect_wait_interval = std::chrono::seconds::zero ();
408416 health_checker_.cancel ();
417+ cancel_run (); // run
418+ receive_channel_.cancel (); // receive
419+ cancel_unwritten_requests (); // exec
409420 break ;
410421 default : /* ignore */ ;
411422 }
412-
413- if (op == operation::all) {
414- cancel_impl (operation::run);
415- cancel_impl (operation::receive);
416- cancel_impl (operation::exec);
417- return ;
418- }
419-
420- cancel_impl (op);
421423 }
422424
423425 template <class Response , class CompletionToken >
@@ -561,32 +563,18 @@ class connection_base {
561563 return ret;
562564 }
563565
564- void cancel_impl (operation op )
566+ void cancel_run ( )
565567 {
566- switch (op) {
567- case operation::exec:
568- {
569- cancel_unwritten_requests ();
570- } break ;
571- case operation::run:
572- {
573- // Protects the code below from being called more than
574- // once, see https://github.com/boostorg/redis/issues/181
575- if (std::exchange (cancel_run_called_, true )) {
576- return ;
577- }
578-
579- close ();
580- writer_timer_.cancel ();
581- receive_channel_.cancel ();
582- cancel_on_conn_lost ();
583- } break ;
584- case operation::receive:
585- {
586- receive_channel_.cancel ();
587- } break ;
588- default : /* ignore */ ;
568+ // Protects the code below from being called more than
569+ // once, see https://github.com/boostorg/redis/issues/181
570+ if (std::exchange (cancel_run_called_, true )) {
571+ return ;
589572 }
573+
574+ close ();
575+ writer_timer_.cancel ();
576+ receive_channel_.cancel ();
577+ cancel_on_conn_lost ();
590578 }
591579
592580 void on_write ()
0 commit comments