diff --git a/config.m4 b/config.m4
index bb30be56910..6782f94a2b2 100644
--- a/config.m4
+++ b/config.m4
@@ -184,6 +184,7 @@ if test "$PHP_GRPC" != "no"; then
src/core/lib/iomgr/tcp_server_windows.cc \
src/core/lib/iomgr/tcp_uv.cc \
src/core/lib/iomgr/tcp_windows.cc \
+ src/core/lib/iomgr/threadpool/mpmcqueue.cc \
src/core/lib/iomgr/time_averaged_stats.cc \
src/core/lib/iomgr/timer.cc \
src/core/lib/iomgr/timer_custom.cc \
@@ -726,6 +727,7 @@ if test "$PHP_GRPC" != "no"; then
PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/gprpp)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/http)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/iomgr)
+ PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/iomgr/threadpool)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/json)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/profiling)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/context)
diff --git a/config.w32 b/config.w32
index c9faa8d9ac8..8bff737f51f 100644
--- a/config.w32
+++ b/config.w32
@@ -159,6 +159,7 @@ if (PHP_GRPC != "no") {
"src\\core\\lib\\iomgr\\tcp_server_windows.cc " +
"src\\core\\lib\\iomgr\\tcp_uv.cc " +
"src\\core\\lib\\iomgr\\tcp_windows.cc " +
+ "src\\core\\lib\\iomgr\\threadpool\\mpmcqueue.cc " +
"src\\core\\lib\\iomgr\\time_averaged_stats.cc " +
"src\\core\\lib\\iomgr\\timer.cc " +
"src\\core\\lib\\iomgr\\timer_custom.cc " +
@@ -739,6 +740,7 @@ if (PHP_GRPC != "no") {
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\gprpp");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\http");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\iomgr");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\iomgr\\threadpool");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\json");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\profiling");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security");
diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec
index 18ed5f89102..55e7e9340a1 100644
--- a/gRPC-C++.podspec
+++ b/gRPC-C++.podspec
@@ -507,6 +507,7 @@ Pod::Spec.new do |s|
'src/core/lib/iomgr/tcp_server.h',
'src/core/lib/iomgr/tcp_server_utils_posix.h',
'src/core/lib/iomgr/tcp_windows.h',
+ 'src/core/lib/iomgr/threadpool/mpmcqueue.h',
'src/core/lib/iomgr/time_averaged_stats.h',
'src/core/lib/iomgr/timer.h',
'src/core/lib/iomgr/timer_custom.h',
@@ -711,6 +712,7 @@ Pod::Spec.new do |s|
'src/core/lib/iomgr/tcp_server.h',
'src/core/lib/iomgr/tcp_server_utils_posix.h',
'src/core/lib/iomgr/tcp_windows.h',
+ 'src/core/lib/iomgr/threadpool/mpmcqueue.h',
'src/core/lib/iomgr/time_averaged_stats.h',
'src/core/lib/iomgr/timer.h',
'src/core/lib/iomgr/timer_custom.h',
diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec
index 85add8fb7a2..56b3d5b0955 100644
--- a/gRPC-Core.podspec
+++ b/gRPC-Core.podspec
@@ -477,6 +477,7 @@ Pod::Spec.new do |s|
'src/core/lib/iomgr/tcp_server.h',
'src/core/lib/iomgr/tcp_server_utils_posix.h',
'src/core/lib/iomgr/tcp_windows.h',
+ 'src/core/lib/iomgr/threadpool/mpmcqueue.h',
'src/core/lib/iomgr/time_averaged_stats.h',
'src/core/lib/iomgr/timer.h',
'src/core/lib/iomgr/timer_custom.h',
@@ -646,6 +647,7 @@ Pod::Spec.new do |s|
'src/core/lib/iomgr/tcp_server_windows.cc',
'src/core/lib/iomgr/tcp_uv.cc',
'src/core/lib/iomgr/tcp_windows.cc',
+ 'src/core/lib/iomgr/threadpool/mpmcqueue.cc',
'src/core/lib/iomgr/time_averaged_stats.cc',
'src/core/lib/iomgr/timer.cc',
'src/core/lib/iomgr/timer_custom.cc',
@@ -1130,6 +1132,7 @@ Pod::Spec.new do |s|
'src/core/lib/iomgr/tcp_server.h',
'src/core/lib/iomgr/tcp_server_utils_posix.h',
'src/core/lib/iomgr/tcp_windows.h',
+ 'src/core/lib/iomgr/threadpool/mpmcqueue.h',
'src/core/lib/iomgr/time_averaged_stats.h',
'src/core/lib/iomgr/timer.h',
'src/core/lib/iomgr/timer_custom.h',
diff --git a/grpc.gemspec b/grpc.gemspec
index e9d215bf10f..0e21836c8d5 100644
--- a/grpc.gemspec
+++ b/grpc.gemspec
@@ -411,6 +411,7 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/iomgr/tcp_server.h )
s.files += %w( src/core/lib/iomgr/tcp_server_utils_posix.h )
s.files += %w( src/core/lib/iomgr/tcp_windows.h )
+ s.files += %w( src/core/lib/iomgr/threadpool/mpmcqueue.h )
s.files += %w( src/core/lib/iomgr/time_averaged_stats.h )
s.files += %w( src/core/lib/iomgr/timer.h )
s.files += %w( src/core/lib/iomgr/timer_custom.h )
@@ -580,6 +581,7 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/iomgr/tcp_server_windows.cc )
s.files += %w( src/core/lib/iomgr/tcp_uv.cc )
s.files += %w( src/core/lib/iomgr/tcp_windows.cc )
+ s.files += %w( src/core/lib/iomgr/threadpool/mpmcqueue.cc )
s.files += %w( src/core/lib/iomgr/time_averaged_stats.cc )
s.files += %w( src/core/lib/iomgr/timer.cc )
s.files += %w( src/core/lib/iomgr/timer_custom.cc )
diff --git a/grpc.gyp b/grpc.gyp
index 6268bed7bb0..f64c80c2008 100644
--- a/grpc.gyp
+++ b/grpc.gyp
@@ -366,6 +366,7 @@
'src/core/lib/iomgr/tcp_server_windows.cc',
'src/core/lib/iomgr/tcp_uv.cc',
'src/core/lib/iomgr/tcp_windows.cc',
+ 'src/core/lib/iomgr/threadpool/mpmcqueue.cc',
'src/core/lib/iomgr/time_averaged_stats.cc',
'src/core/lib/iomgr/timer.cc',
'src/core/lib/iomgr/timer_custom.cc',
@@ -742,6 +743,7 @@
'src/core/lib/iomgr/tcp_server_windows.cc',
'src/core/lib/iomgr/tcp_uv.cc',
'src/core/lib/iomgr/tcp_windows.cc',
+ 'src/core/lib/iomgr/threadpool/mpmcqueue.cc',
'src/core/lib/iomgr/time_averaged_stats.cc',
'src/core/lib/iomgr/timer.cc',
'src/core/lib/iomgr/timer_custom.cc',
@@ -992,6 +994,7 @@
'src/core/lib/iomgr/tcp_server_windows.cc',
'src/core/lib/iomgr/tcp_uv.cc',
'src/core/lib/iomgr/tcp_windows.cc',
+ 'src/core/lib/iomgr/threadpool/mpmcqueue.cc',
'src/core/lib/iomgr/time_averaged_stats.cc',
'src/core/lib/iomgr/timer.cc',
'src/core/lib/iomgr/timer_custom.cc',
@@ -1218,6 +1221,7 @@
'src/core/lib/iomgr/tcp_server_windows.cc',
'src/core/lib/iomgr/tcp_uv.cc',
'src/core/lib/iomgr/tcp_windows.cc',
+ 'src/core/lib/iomgr/threadpool/mpmcqueue.cc',
'src/core/lib/iomgr/time_averaged_stats.cc',
'src/core/lib/iomgr/timer.cc',
'src/core/lib/iomgr/timer_custom.cc',
diff --git a/package.xml b/package.xml
index fd712698a62..77162f3d366 100644
--- a/package.xml
+++ b/package.xml
@@ -416,6 +416,7 @@
+
@@ -585,6 +586,7 @@
+
diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal
index 9b0f8f9fcd7..e5e78ffbb4b 100644
--- a/tools/doxygen/Doxyfile.c++.internal
+++ b/tools/doxygen/Doxyfile.c++.internal
@@ -1172,6 +1172,7 @@ src/core/lib/iomgr/tcp_posix.h \
src/core/lib/iomgr/tcp_server.h \
src/core/lib/iomgr/tcp_server_utils_posix.h \
src/core/lib/iomgr/tcp_windows.h \
+src/core/lib/iomgr/threadpool/mpmcqueue.h \
src/core/lib/iomgr/time_averaged_stats.h \
src/core/lib/iomgr/timer.h \
src/core/lib/iomgr/timer_custom.h \
diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal
index 7768bca30f5..83a9315d5af 100644
--- a/tools/doxygen/Doxyfile.core.internal
+++ b/tools/doxygen/Doxyfile.core.internal
@@ -1331,6 +1331,8 @@ src/core/lib/iomgr/tcp_server_windows.cc \
src/core/lib/iomgr/tcp_uv.cc \
src/core/lib/iomgr/tcp_windows.cc \
src/core/lib/iomgr/tcp_windows.h \
+src/core/lib/iomgr/threadpool/mpmcqueue.cc \
+src/core/lib/iomgr/threadpool/mpmcqueue.h \
src/core/lib/iomgr/time_averaged_stats.cc \
src/core/lib/iomgr/time_averaged_stats.h \
src/core/lib/iomgr/timer.cc \