diff --git a/src/libpmemobj/heap.c b/src/libpmemobj/heap.c
index b0e29f6b5de8e23851dedf6482fd41ee2c2e6456..36432f23a3dceeb3416f06ab0f38b47feec0ddc1 100644
--- a/src/libpmemobj/heap.c
+++ b/src/libpmemobj/heap.c
@@ -178,6 +178,21 @@ heap_thread_arena_destructor(void *arg)
 	util_fetch_and_sub64(&a->nthreads, 1);
 }
 
+/*
+ * heap_get_arena_by_id -- returns arena by id
+ */
+static struct arena *
+heap_get_arena_by_id(struct palloc_heap *heap, unsigned arena_id)
+{
+	struct heap_rt *h = heap->rt;
+
+	util_mutex_lock(&h->arenas_lock);
+	struct arena *a = VEC_ARR(&heap->rt->arenas)[arena_id - 1];
+	util_mutex_unlock(&h->arenas_lock);
+
+	return a;
+}
+
 /*
  * heap_thread_arena_assign -- (internal) assigns the least used arena
  *	to current thread
@@ -1090,11 +1105,7 @@ heap_get_narenas_auto(struct palloc_heap *heap)
 struct bucket **
 heap_get_arena_buckets(struct palloc_heap *heap, unsigned arena_id)
 {
-	struct heap_rt *h = heap->rt;
-
-	util_mutex_lock(&h->arenas_lock);
-	struct arena *a = VEC_ARR(&heap->rt->arenas)[arena_id - 1];
-	util_mutex_unlock(&h->arenas_lock);
+	struct arena *a = heap_get_arena_by_id(heap, arena_id);
 
 	return a->buckets;
 }
@@ -1105,11 +1116,7 @@ heap_get_arena_buckets(struct palloc_heap *heap, unsigned arena_id)
 int
 heap_get_arena_auto(struct palloc_heap *heap, unsigned arena_id)
 {
-	struct heap_rt *h = heap->rt;
-
-	util_mutex_lock(&h->arenas_lock);
-	struct arena *a = VEC_ARR(&heap->rt->arenas)[arena_id - 1];
-	util_mutex_unlock(&h->arenas_lock);
+	struct arena *a = heap_get_arena_by_id(heap, arena_id);
 
 	return a->automatic;
 }
@@ -1121,11 +1128,8 @@ void
 heap_set_arena_auto(struct palloc_heap *heap, unsigned arena_id,
 		int automatic)
 {
-	struct heap_rt *h = heap->rt;
+	struct arena *a = heap_get_arena_by_id(heap, arena_id);
 
-	util_mutex_lock(&h->arenas_lock);
-	struct arena *a = VEC_ARR(&heap->rt->arenas)[arena_id - 1];
-	util_mutex_unlock(&h->arenas_lock);
 	a->automatic = automatic;
 }
 
@@ -1137,10 +1141,7 @@ heap_set_arena_thread(struct palloc_heap *heap, unsigned arena_id)
 {
 	struct heap_rt *h = heap->rt;
 
-	util_mutex_lock(&h->arenas_lock);
-	struct arena *a = VEC_ARR(&heap->rt->arenas)[arena_id - 1];
-	util_mutex_unlock(&h->arenas_lock);
-
+	struct arena *a = heap_get_arena_by_id(heap, arena_id);
 	struct arena *thread_arena = os_tls_get(h->thread_arena);
 	if (thread_arena)
 		util_fetch_and_sub64(&thread_arena->nthreads, 1);