diff --git a/Makefile.in b/Makefile.in
index 7f07d967..2802f7f2 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -127,6 +127,7 @@ C_SRCS := $(srcroot)src/jemalloc.c \
$(srcroot)src/nstime.c \
$(srcroot)src/pa.c \
$(srcroot)src/pa_extra.c \
+ $(srcroot)src/pac.c \
$(srcroot)src/pages.c \
$(srcroot)src/peak_event.c \
$(srcroot)src/prof.c \
diff --git a/include/jemalloc/internal/pac.h b/include/jemalloc/internal/pac.h
index bd1c8566..5eb1e80e 100644
--- a/include/jemalloc/internal/pac.h
+++ b/include/jemalloc/internal/pac.h
@@ -24,4 +24,7 @@ struct pac_s {
edata_cache_t *edata_cache;
};
+bool pac_init(tsdn_t *tsdn, pac_t *pac, unsigned ind,
+ edata_cache_t *edata_cache);
+
#endif /* JEMALLOC_INTERNAL_PAC_H */
diff --git a/msvc/projects/vc2015/jemalloc/jemalloc.vcxproj b/msvc/projects/vc2015/jemalloc/jemalloc.vcxproj
index 00ea2beb..fe147790 100644
--- a/msvc/projects/vc2015/jemalloc/jemalloc.vcxproj
+++ b/msvc/projects/vc2015/jemalloc/jemalloc.vcxproj
@@ -68,6 +68,7 @@
+
diff --git a/msvc/projects/vc2015/jemalloc/jemalloc.vcxproj.filters b/msvc/projects/vc2015/jemalloc/jemalloc.vcxproj.filters
index 0bcb45a8..4b7b6baf 100644
--- a/msvc/projects/vc2015/jemalloc/jemalloc.vcxproj.filters
+++ b/msvc/projects/vc2015/jemalloc/jemalloc.vcxproj.filters
@@ -88,6 +88,9 @@
Source Files
+
+ Source Files
+
Source Files
diff --git a/msvc/projects/vc2017/jemalloc/jemalloc.vcxproj b/msvc/projects/vc2017/jemalloc/jemalloc.vcxproj
index 446ea606..6bd43c78 100644
--- a/msvc/projects/vc2017/jemalloc/jemalloc.vcxproj
+++ b/msvc/projects/vc2017/jemalloc/jemalloc.vcxproj
@@ -68,6 +68,7 @@
+
diff --git a/msvc/projects/vc2017/jemalloc/jemalloc.vcxproj.filters b/msvc/projects/vc2017/jemalloc/jemalloc.vcxproj.filters
index 0bcb45a8..4b7b6baf 100644
--- a/msvc/projects/vc2017/jemalloc/jemalloc.vcxproj.filters
+++ b/msvc/projects/vc2017/jemalloc/jemalloc.vcxproj.filters
@@ -88,6 +88,9 @@
Source Files
+
+ Source Files
+
Source Files
diff --git a/src/pa.c b/src/pa.c
index f37337de..f8fa9222 100644
--- a/src/pa.c
+++ b/src/pa.c
@@ -26,39 +26,12 @@ pa_shard_init(tsdn_t *tsdn, pa_shard_t *shard, emap_t *emap, base_t *base,
nstime_t *cur_time, ssize_t dirty_decay_ms, ssize_t muzzy_decay_ms) {
/* This will change eventually, but for now it should hold. */
assert(base_ind_get(base) == ind);
- /*
- * Delay coalescing for dirty extents despite the disruptive effect on
- * memory layout for best-fit extent allocation, since cached extents
- * are likely to be reused soon after deallocation, and the cost of
- * merging/splitting extents is non-trivial.
- */
- if (ecache_init(tsdn, &shard->pac.ecache_dirty, extent_state_dirty, ind,
- /* delay_coalesce */ true)) {
- return true;
- }
- /*
- * Coalesce muzzy extents immediately, because operations on them are in
- * the critical path much less often than for dirty extents.
- */
- if (ecache_init(tsdn, &shard->pac.ecache_muzzy, extent_state_muzzy, ind,
- /* delay_coalesce */ false)) {
- return true;
- }
- /*
- * Coalesce retained extents immediately, in part because they will
- * never be evicted (and therefore there's no opportunity for delayed
- * coalescing), but also because operations on retained extents are not
- * in the critical path.
- */
- if (ecache_init(tsdn, &shard->pac.ecache_retained, extent_state_retained,
- ind, /* delay_coalesce */ false)) {
- return true;
- }
if (edata_cache_init(&shard->edata_cache, base)) {
return true;
}
- shard->pac.edata_cache = &shard->edata_cache;
-
+ if (pac_init(tsdn, &shard->pac, ind, &shard->edata_cache)) {
+ return true;
+ }
if (ecache_grow_init(tsdn, &shard->ecache_grow)) {
return true;
}
diff --git a/src/pac.c b/src/pac.c
new file mode 100644
index 00000000..746bd4c8
--- /dev/null
+++ b/src/pac.c
@@ -0,0 +1,39 @@
+#include "jemalloc/internal/jemalloc_preamble.h"
+#include "jemalloc/internal/jemalloc_internal_includes.h"
+
+#include "jemalloc/internal/pac.h"
+
+bool
+pac_init(tsdn_t *tsdn, pac_t *pac, unsigned ind, edata_cache_t *edata_cache) {
+ /*
+ * Delay coalescing for dirty extents despite the disruptive effect on
+ * memory layout for best-fit extent allocation, since cached extents
+ * are likely to be reused soon after deallocation, and the cost of
+ * merging/splitting extents is non-trivial.
+ */
+ if (ecache_init(tsdn, &pac->ecache_dirty, extent_state_dirty, ind,
+ /* delay_coalesce */ true)) {
+ return true;
+ }
+ /*
+ * Coalesce muzzy extents immediately, because operations on them are in
+ * the critical path much less often than for dirty extents.
+ */
+ if (ecache_init(tsdn, &pac->ecache_muzzy, extent_state_muzzy, ind,
+ /* delay_coalesce */ false)) {
+ return true;
+ }
+ /*
+ * Coalesce retained extents immediately, in part because they will
+ * never be evicted (and therefore there's no opportunity for delayed
+ * coalescing), but also because operations on retained extents are not
+ * in the critical path.
+ */
+ if (ecache_init(tsdn, &pac->ecache_retained, extent_state_retained,
+ ind, /* delay_coalesce */ false)) {
+ return true;
+ }
+
+ pac->edata_cache = edata_cache;
+ return false;
+}