diff --git a/mysql-test/suite/perfschema/r/nesting.result b/mysql-test/suite/perfschema/r/nesting.result
index f1f872f95f9a9051bc0af0255d3177c61b5146fa..2bf65c30e4a4b48a8e7765bbef729cd92040d888 100644
--- a/mysql-test/suite/perfschema/r/nesting.result
+++ b/mysql-test/suite/perfschema/r/nesting.result
@@ -107,7 +107,7 @@ and (end_event_id <= @marker_end)
 ) all_events
 order by relative_event_id asc;
 relative_event_id	relative_end_event_id	event_name	comment	nesting_event_type	relative_nesting_event_id
-0	19	statement/sql/select	select "MARKER_BEGIN" as marker	NULL	NULL
+0	18	statement/sql/select	select "MARKER_BEGIN" as marker	NULL	NULL
 1	4	stage/sql/init	(stage)	STATEMENT	0
 2	2	wait/io/socket/sql/client_connection	recv	STAGE	1
 3	3	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	1
@@ -124,125 +124,118 @@ relative_event_id	relative_end_event_id	event_name	comment	nesting_event_type	re
 14	14	stage/sql/freeing items	(stage)	STATEMENT	0
 15	15	wait/io/socket/sql/client_connection	send	STATEMENT	0
 16	16	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STATEMENT	0
-17	17	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STATEMENT	0
-18	19	stage/sql/cleaning up	(stage)	STATEMENT	0
-19	19	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	18
-20	20	idle	idle	NULL	NULL
-21	40	statement/sql/select	select "This is simple statement one" as payload	NULL	NULL
-22	25	stage/sql/init	(stage)	STATEMENT	21
-23	23	wait/io/socket/sql/client_connection	recv	STAGE	22
-24	24	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	22
-25	25	wait/io/file/sql/query_log	write	STAGE	22
-26	26	stage/sql/checking permissions	(stage)	STATEMENT	21
-27	27	stage/sql/Opening tables	(stage)	STATEMENT	21
-28	28	stage/sql/After opening tables	(stage)	STATEMENT	21
-29	29	stage/sql/init	(stage)	STATEMENT	21
-30	30	stage/sql/optimizing	(stage)	STATEMENT	21
-31	31	stage/sql/executing	(stage)	STATEMENT	21
-32	32	stage/sql/end	(stage)	STATEMENT	21
-33	33	stage/sql/query end	(stage)	STATEMENT	21
-34	34	stage/sql/closing tables	(stage)	STATEMENT	21
-35	35	stage/sql/freeing items	(stage)	STATEMENT	21
-36	36	wait/io/socket/sql/client_connection	send	STATEMENT	21
-37	37	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STATEMENT	21
-38	38	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STATEMENT	21
-39	40	stage/sql/cleaning up	(stage)	STATEMENT	21
-40	40	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	39
-41	41	idle	idle	NULL	NULL
-42	61	statement/sql/select	select "This is simple statement two" as payload	NULL	NULL
-43	46	stage/sql/init	(stage)	STATEMENT	42
-44	44	wait/io/socket/sql/client_connection	recv	STAGE	43
-45	45	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	43
-46	46	wait/io/file/sql/query_log	write	STAGE	43
-47	47	stage/sql/checking permissions	(stage)	STATEMENT	42
-48	48	stage/sql/Opening tables	(stage)	STATEMENT	42
-49	49	stage/sql/After opening tables	(stage)	STATEMENT	42
-50	50	stage/sql/init	(stage)	STATEMENT	42
-51	51	stage/sql/optimizing	(stage)	STATEMENT	42
-52	52	stage/sql/executing	(stage)	STATEMENT	42
-53	53	stage/sql/end	(stage)	STATEMENT	42
-54	54	stage/sql/query end	(stage)	STATEMENT	42
-55	55	stage/sql/closing tables	(stage)	STATEMENT	42
-56	56	stage/sql/freeing items	(stage)	STATEMENT	42
-57	57	wait/io/socket/sql/client_connection	send	STATEMENT	42
-58	58	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STATEMENT	42
-59	59	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STATEMENT	42
-60	61	stage/sql/cleaning up	(stage)	STATEMENT	42
-61	61	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	60
-62	62	idle	idle	NULL	NULL
-63	80	statement/sql/select	select "This is the first part of a multi query" as payload;
+17	18	stage/sql/cleaning up	(stage)	STATEMENT	0
+18	18	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	17
+19	19	idle	idle	NULL	NULL
+20	38	statement/sql/select	select "This is simple statement one" as payload	NULL	NULL
+21	24	stage/sql/init	(stage)	STATEMENT	20
+22	22	wait/io/socket/sql/client_connection	recv	STAGE	21
+23	23	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	21
+24	24	wait/io/file/sql/query_log	write	STAGE	21
+25	25	stage/sql/checking permissions	(stage)	STATEMENT	20
+26	26	stage/sql/Opening tables	(stage)	STATEMENT	20
+27	27	stage/sql/After opening tables	(stage)	STATEMENT	20
+28	28	stage/sql/init	(stage)	STATEMENT	20
+29	29	stage/sql/optimizing	(stage)	STATEMENT	20
+30	30	stage/sql/executing	(stage)	STATEMENT	20
+31	31	stage/sql/end	(stage)	STATEMENT	20
+32	32	stage/sql/query end	(stage)	STATEMENT	20
+33	33	stage/sql/closing tables	(stage)	STATEMENT	20
+34	34	stage/sql/freeing items	(stage)	STATEMENT	20
+35	35	wait/io/socket/sql/client_connection	send	STATEMENT	20
+36	36	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STATEMENT	20
+37	38	stage/sql/cleaning up	(stage)	STATEMENT	20
+38	38	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	37
+39	39	idle	idle	NULL	NULL
+40	58	statement/sql/select	select "This is simple statement two" as payload	NULL	NULL
+41	44	stage/sql/init	(stage)	STATEMENT	40
+42	42	wait/io/socket/sql/client_connection	recv	STAGE	41
+43	43	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	41
+44	44	wait/io/file/sql/query_log	write	STAGE	41
+45	45	stage/sql/checking permissions	(stage)	STATEMENT	40
+46	46	stage/sql/Opening tables	(stage)	STATEMENT	40
+47	47	stage/sql/After opening tables	(stage)	STATEMENT	40
+48	48	stage/sql/init	(stage)	STATEMENT	40
+49	49	stage/sql/optimizing	(stage)	STATEMENT	40
+50	50	stage/sql/executing	(stage)	STATEMENT	40
+51	51	stage/sql/end	(stage)	STATEMENT	40
+52	52	stage/sql/query end	(stage)	STATEMENT	40
+53	53	stage/sql/closing tables	(stage)	STATEMENT	40
+54	54	stage/sql/freeing items	(stage)	STATEMENT	40
+55	55	wait/io/socket/sql/client_connection	send	STATEMENT	40
+56	56	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STATEMENT	40
+57	58	stage/sql/cleaning up	(stage)	STATEMENT	40
+58	58	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	57
+59	59	idle	idle	NULL	NULL
+60	76	statement/sql/select	select "This is the first part of a multi query" as payload;
 select "And this is the second part of a multi query" as payload;
 select "With a third part to make things complete" as payload	NULL	NULL
-64	67	stage/sql/init	(stage)	STATEMENT	63
-65	65	wait/io/socket/sql/client_connection	recv	STAGE	64
-66	66	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	64
-67	67	wait/io/file/sql/query_log	write	STAGE	64
-68	68	stage/sql/checking permissions	(stage)	STATEMENT	63
-69	69	stage/sql/Opening tables	(stage)	STATEMENT	63
-70	70	stage/sql/After opening tables	(stage)	STATEMENT	63
-71	71	stage/sql/init	(stage)	STATEMENT	63
-72	72	stage/sql/optimizing	(stage)	STATEMENT	63
-73	73	stage/sql/executing	(stage)	STATEMENT	63
-74	74	stage/sql/end	(stage)	STATEMENT	63
-75	75	stage/sql/query end	(stage)	STATEMENT	63
-76	76	stage/sql/closing tables	(stage)	STATEMENT	63
-77	80	stage/sql/freeing items	(stage)	STATEMENT	63
-78	78	wait/io/socket/sql/client_connection	send	STAGE	77
-79	79	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	77
-80	80	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	77
-81	96	statement/sql/select	select "And this is the second part of a multi query" as payload;
+61	64	stage/sql/init	(stage)	STATEMENT	60
+62	62	wait/io/socket/sql/client_connection	recv	STAGE	61
+63	63	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	61
+64	64	wait/io/file/sql/query_log	write	STAGE	61
+65	65	stage/sql/checking permissions	(stage)	STATEMENT	60
+66	66	stage/sql/Opening tables	(stage)	STATEMENT	60
+67	67	stage/sql/After opening tables	(stage)	STATEMENT	60
+68	68	stage/sql/init	(stage)	STATEMENT	60
+69	69	stage/sql/optimizing	(stage)	STATEMENT	60
+70	70	stage/sql/executing	(stage)	STATEMENT	60
+71	71	stage/sql/end	(stage)	STATEMENT	60
+72	72	stage/sql/query end	(stage)	STATEMENT	60
+73	73	stage/sql/closing tables	(stage)	STATEMENT	60
+74	76	stage/sql/freeing items	(stage)	STATEMENT	60
+75	75	wait/io/socket/sql/client_connection	send	STAGE	74
+76	76	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	74
+77	91	statement/sql/select	select "And this is the second part of a multi query" as payload;
 select "With a third part to make things complete" as payload	NULL	NULL
-82	83	stage/sql/init	(stage)	STATEMENT	81
-83	83	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	82
-84	84	stage/sql/checking permissions	(stage)	STATEMENT	81
-85	85	stage/sql/Opening tables	(stage)	STATEMENT	81
-86	86	stage/sql/After opening tables	(stage)	STATEMENT	81
-87	87	stage/sql/init	(stage)	STATEMENT	81
-88	88	stage/sql/optimizing	(stage)	STATEMENT	81
-89	89	stage/sql/executing	(stage)	STATEMENT	81
-90	90	stage/sql/end	(stage)	STATEMENT	81
-91	91	stage/sql/query end	(stage)	STATEMENT	81
-92	92	stage/sql/closing tables	(stage)	STATEMENT	81
-93	96	stage/sql/freeing items	(stage)	STATEMENT	81
-94	94	wait/io/socket/sql/client_connection	send	STAGE	93
-95	95	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	93
-96	96	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	93
-97	114	statement/sql/select	select "With a third part to make things complete" as payload	NULL	NULL
-98	99	stage/sql/init	(stage)	STATEMENT	97
-99	99	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	98
-100	100	stage/sql/checking permissions	(stage)	STATEMENT	97
-101	101	stage/sql/Opening tables	(stage)	STATEMENT	97
-102	102	stage/sql/After opening tables	(stage)	STATEMENT	97
-103	103	stage/sql/init	(stage)	STATEMENT	97
-104	104	stage/sql/optimizing	(stage)	STATEMENT	97
-105	105	stage/sql/executing	(stage)	STATEMENT	97
-106	106	stage/sql/end	(stage)	STATEMENT	97
-107	107	stage/sql/query end	(stage)	STATEMENT	97
-108	108	stage/sql/closing tables	(stage)	STATEMENT	97
-109	109	stage/sql/freeing items	(stage)	STATEMENT	97
-110	110	wait/io/socket/sql/client_connection	send	STATEMENT	97
-111	111	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STATEMENT	97
-112	112	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STATEMENT	97
-113	114	stage/sql/cleaning up	(stage)	STATEMENT	97
-114	114	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	113
-115	115	idle	idle	NULL	NULL
-116	135	statement/sql/select	select "MARKER_END" as marker	NULL	NULL
-117	120	stage/sql/init	(stage)	STATEMENT	116
-118	118	wait/io/socket/sql/client_connection	recv	STAGE	117
-119	119	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	117
-120	120	wait/io/file/sql/query_log	write	STAGE	117
-121	121	stage/sql/checking permissions	(stage)	STATEMENT	116
-122	122	stage/sql/Opening tables	(stage)	STATEMENT	116
-123	123	stage/sql/After opening tables	(stage)	STATEMENT	116
-124	124	stage/sql/init	(stage)	STATEMENT	116
-125	125	stage/sql/optimizing	(stage)	STATEMENT	116
-126	126	stage/sql/executing	(stage)	STATEMENT	116
-127	127	stage/sql/end	(stage)	STATEMENT	116
-128	128	stage/sql/query end	(stage)	STATEMENT	116
-129	129	stage/sql/closing tables	(stage)	STATEMENT	116
-130	130	stage/sql/freeing items	(stage)	STATEMENT	116
-131	131	wait/io/socket/sql/client_connection	send	STATEMENT	116
-132	132	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STATEMENT	116
-133	133	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STATEMENT	116
-134	135	stage/sql/cleaning up	(stage)	STATEMENT	116
-135	135	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	134
+78	79	stage/sql/init	(stage)	STATEMENT	77
+79	79	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	78
+80	80	stage/sql/checking permissions	(stage)	STATEMENT	77
+81	81	stage/sql/Opening tables	(stage)	STATEMENT	77
+82	82	stage/sql/After opening tables	(stage)	STATEMENT	77
+83	83	stage/sql/init	(stage)	STATEMENT	77
+84	84	stage/sql/optimizing	(stage)	STATEMENT	77
+85	85	stage/sql/executing	(stage)	STATEMENT	77
+86	86	stage/sql/end	(stage)	STATEMENT	77
+87	87	stage/sql/query end	(stage)	STATEMENT	77
+88	88	stage/sql/closing tables	(stage)	STATEMENT	77
+89	91	stage/sql/freeing items	(stage)	STATEMENT	77
+90	90	wait/io/socket/sql/client_connection	send	STAGE	89
+91	91	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	89
+92	108	statement/sql/select	select "With a third part to make things complete" as payload	NULL	NULL
+93	94	stage/sql/init	(stage)	STATEMENT	92
+94	94	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	93
+95	95	stage/sql/checking permissions	(stage)	STATEMENT	92
+96	96	stage/sql/Opening tables	(stage)	STATEMENT	92
+97	97	stage/sql/After opening tables	(stage)	STATEMENT	92
+98	98	stage/sql/init	(stage)	STATEMENT	92
+99	99	stage/sql/optimizing	(stage)	STATEMENT	92
+100	100	stage/sql/executing	(stage)	STATEMENT	92
+101	101	stage/sql/end	(stage)	STATEMENT	92
+102	102	stage/sql/query end	(stage)	STATEMENT	92
+103	103	stage/sql/closing tables	(stage)	STATEMENT	92
+104	104	stage/sql/freeing items	(stage)	STATEMENT	92
+105	105	wait/io/socket/sql/client_connection	send	STATEMENT	92
+106	106	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STATEMENT	92
+107	108	stage/sql/cleaning up	(stage)	STATEMENT	92
+108	108	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	107
+109	109	idle	idle	NULL	NULL
+110	128	statement/sql/select	select "MARKER_END" as marker	NULL	NULL
+111	114	stage/sql/init	(stage)	STATEMENT	110
+112	112	wait/io/socket/sql/client_connection	recv	STAGE	111
+113	113	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	111
+114	114	wait/io/file/sql/query_log	write	STAGE	111
+115	115	stage/sql/checking permissions	(stage)	STATEMENT	110
+116	116	stage/sql/Opening tables	(stage)	STATEMENT	110
+117	117	stage/sql/After opening tables	(stage)	STATEMENT	110
+118	118	stage/sql/init	(stage)	STATEMENT	110
+119	119	stage/sql/optimizing	(stage)	STATEMENT	110
+120	120	stage/sql/executing	(stage)	STATEMENT	110
+121	121	stage/sql/end	(stage)	STATEMENT	110
+122	122	stage/sql/query end	(stage)	STATEMENT	110
+123	123	stage/sql/closing tables	(stage)	STATEMENT	110
+124	124	stage/sql/freeing items	(stage)	STATEMENT	110
+125	125	wait/io/socket/sql/client_connection	send	STATEMENT	110
+126	126	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STATEMENT	110
+127	128	stage/sql/cleaning up	(stage)	STATEMENT	110
+128	128	wait/synch/mutex/sql/THD::LOCK_thd_data	lock	STAGE	127
diff --git a/sql/my_apc.cc b/sql/my_apc.cc
index 17660688be014816475dedcbb48dba153fd81710..91f5cd3f39ca51d446b5545d1b8dc251bed1fd28 100644
--- a/sql/my_apc.cc
+++ b/sql/my_apc.cc
@@ -41,45 +41,6 @@ void Apc_target::init(mysql_mutex_t *target_mutex)
 }
 
 
-/* 
-  Destroy the target. The target must be disabled when this call is made.
-*/
-void Apc_target::destroy()
-{
-  DBUG_ASSERT(!enabled);
-}
-
-
-/* 
-  Enter ther state where the target is available for serving APC requests
-*/
-void Apc_target::enable()
-{
-  /* Ok to do without getting/releasing the mutex: */
-  enabled++;
-}
-
-
-/* 
-  Make the target unavailable for serving APC requests. 
-  
-  @note
-    This call will serve all requests that were already enqueued
-*/
-
-void Apc_target::disable()
-{
-  bool process= FALSE;
-  DBUG_ASSERT(enabled);
-  mysql_mutex_lock(LOCK_thd_data_ptr);
-  if (!(--enabled))
-    process= TRUE;
-  mysql_mutex_unlock(LOCK_thd_data_ptr);
-  if (process)
-    process_apc_requests();
-}
-
-
 /* [internal] Put request qe into the request list */
 
 void Apc_target::enqueue_request(Call_request *qe)
diff --git a/sql/my_apc.h b/sql/my_apc.h
index dfeef5eb8ac027875a3d2abda3523b25b075b3b0..20b1ee4c4ec5d78350c0a8e81708b5065c9fa863 100644
--- a/sql/my_apc.h
+++ b/sql/my_apc.h
@@ -50,10 +50,29 @@ public:
   ~Apc_target() { DBUG_ASSERT(!enabled && !apc_calls);}
 
   void init(mysql_mutex_t *target_mutex);
-  void destroy();
-  void enable();
-  void disable();
-  
+
+  /* Destroy the target. The target must be disabled when this call is made. */
+  void destroy() { DBUG_ASSERT(!enabled); }
+
+  /* Enter ther state where the target is available for serving APC requests */
+  void enable() { enabled++; }
+
+  /*
+    Make the target unavailable for serving APC requests.
+
+    @note
+      This call will serve all requests that were already enqueued
+  */
+  void disable()
+  {
+    DBUG_ASSERT(enabled);
+    mysql_mutex_lock(LOCK_thd_data_ptr);
+    bool process= !--enabled && have_apc_requests();
+    mysql_mutex_unlock(LOCK_thd_data_ptr);
+    if (unlikely(process))
+      process_apc_requests();
+  }
+
   void process_apc_requests();
   /* 
     A lightweight function, intended to be used in frequent checks like this: