Commit a842f955 authored by Geoff Simmons's avatar Geoff Simmons

prepend free lists returned to the reader thread, to promote re-use

parent 91b391b6
...@@ -39,6 +39,18 @@ ...@@ -39,6 +39,18 @@
#include "vas.h" #include "vas.h"
#include "miniobj.h" #include "miniobj.h"
/* Preprend head2 before head1, result in head1, head2 empty afterward */
#define VSTAILQ_PREPEND(head1, head2) do { \
if (VSTAILQ_EMPTY((head2))) \
break; \
if (VSTAILQ_EMPTY((head1))) \
(head1)->vstqh_last = (head2)->vstqh_last; \
else \
*(head2)->vstqh_last = VSTAILQ_FIRST((head1)); \
VSTAILQ_FIRST((head1)) = VSTAILQ_FIRST((head2)); \
VSTAILQ_INIT((head2)); \
} while (0)
static void static void
data_Cleanup(void) data_Cleanup(void)
{ {
...@@ -122,7 +134,7 @@ DATA_Take_Freelist(struct freehead_s *dst) ...@@ -122,7 +134,7 @@ DATA_Take_Freelist(struct freehead_s *dst)
AZ(pthread_mutex_lock(&dtbl.freelist_lock)); AZ(pthread_mutex_lock(&dtbl.freelist_lock));
nfree = dtbl.nfree; nfree = dtbl.nfree;
dtbl.nfree = 0; dtbl.nfree = 0;
VSTAILQ_CONCAT(dst, &dtbl.freehead); VSTAILQ_PREPEND(dst, &dtbl.freehead);
AZ(pthread_mutex_unlock(&dtbl.freelist_lock)); AZ(pthread_mutex_unlock(&dtbl.freelist_lock));
return nfree; return nfree;
} }
...@@ -136,7 +148,7 @@ void ...@@ -136,7 +148,7 @@ void
DATA_Return_Freelist(struct freehead_s *returned, unsigned nreturned) DATA_Return_Freelist(struct freehead_s *returned, unsigned nreturned)
{ {
AZ(pthread_mutex_lock(&dtbl.freelist_lock)); AZ(pthread_mutex_lock(&dtbl.freelist_lock));
VSTAILQ_CONCAT(&dtbl.freehead, returned); VSTAILQ_PREPEND(&dtbl.freehead, returned);
dtbl.nfree += nreturned; dtbl.nfree += nreturned;
AZ(pthread_mutex_unlock(&dtbl.freelist_lock)); AZ(pthread_mutex_unlock(&dtbl.freelist_lock));
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment