Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 7 additions & 37 deletions mono/metadata/mempool.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

#include "mempool.h"
#include "mempool-internals.h"
#include "utils/mono-compiler.h"
#include "utils/unlocked.h"

/*
* MonoMemPool is for fast allocation of memory. We free
Expand Down Expand Up @@ -78,7 +78,7 @@ struct _MonoMemPool {
} d;
};

static long total_bytes_allocated = 0;
static gint64 total_bytes_allocated = 0;

/**
* mono_mempool_new:
Expand All @@ -93,19 +93,9 @@ mono_mempool_new (void)

/**
* mono_mempool_new_size:
*
* clang's ThreadSanitizer detects races of total_bytes_allocated and pool->d.allocated throughout the functions
* * mono_mempool_alloc
* * mono_mempool_new_size
* * mono_mempool_destroy
* while these races could lead to wrong values, total_bytes_allocated is just used for debugging / reporting and since
* the mempool.c functions are called quite often, a discussion led the the conclusion of ignoring these races:
* https://bugzilla.xamarin.com/show_bug.cgi?id=57936
*
* \param initial_size the amount of memory to initially reserve for the memory pool.
* \returns a new memory pool with a specific initial memory reservation.
*/
MONO_NO_SANITIZE_THREAD
MonoMemPool *
mono_mempool_new_size (int initial_size)
{
Expand All @@ -125,32 +115,22 @@ mono_mempool_new_size (int initial_size)
pool->pos = (guint8*)pool + SIZEOF_MEM_POOL; // Start after header
pool->end = (guint8*)pool + initial_size; // End at end of allocated space
pool->d.allocated = pool->size = initial_size;
total_bytes_allocated += initial_size;
UnlockedAdd64 (&total_bytes_allocated, initial_size);
return pool;
}

/**
* mono_mempool_destroy:
*
* clang's ThreadSanitizer detects races of total_bytes_allocated and pool->d.allocated throughout the functions
* * mono_mempool_alloc
* * mono_mempool_new_size
* * mono_mempool_destroy
* while these races could lead to wrong values, total_bytes_allocated is just used for debugging / reporting and since
* the mempool.c functions are called quite often, a discussion led the the conclusion of ignoring these races:
* https://bugzilla.xamarin.com/show_bug.cgi?id=57936
*
* \param pool the memory pool to destroy
*
* Free all memory associated with this pool.
*/
MONO_NO_SANITIZE_THREAD
void
mono_mempool_destroy (MonoMemPool *pool)
{
MonoMemPool *p, *n;

total_bytes_allocated -= pool->d.allocated;
UnlockedSubtract64 (&total_bytes_allocated, pool->d.allocated);

p = pool;
while (p) {
Expand Down Expand Up @@ -272,23 +252,13 @@ get_next_size (MonoMemPool *pool, int size)

/**
* mono_mempool_alloc:
*
* clang's ThreadSanitizer detects races of total_bytes_allocated and pool->d.allocated throughout the functions
* * mono_mempool_alloc
* * mono_mempool_new_size
* * mono_mempool_destroy
* while these races could lead to wrong values, total_bytes_allocated is just used for debugging / reporting and since
* the mempool.c functions are called quite often, a discussion led the the conclusion of ignoring these races:
* https://bugzilla.xamarin.com/show_bug.cgi?id=57936
*
* \param pool the memory pool to use
* \param size size of the memory block
*
* Allocates a new block of memory in \p pool .
*
* \returns the address of a newly allocated memory block.
*/
MONO_NO_SANITIZE_THREAD
gpointer
mono_mempool_alloc (MonoMemPool *pool, guint size)
{
Expand Down Expand Up @@ -318,7 +288,7 @@ mono_mempool_alloc (MonoMemPool *pool, guint size)
np->size = new_size;
pool->next = np;
pool->d.allocated += new_size;
total_bytes_allocated += new_size;
UnlockedAdd64 (&total_bytes_allocated, new_size);

rval = (guint8*)np + SIZEOF_MEM_POOL;
} else {
Expand All @@ -332,7 +302,7 @@ mono_mempool_alloc (MonoMemPool *pool, guint size)
pool->pos = (guint8*)np + SIZEOF_MEM_POOL;
pool->end = (guint8*)np + new_size;
pool->d.allocated += new_size;
total_bytes_allocated += new_size;
UnlockedAdd64 (&total_bytes_allocated, new_size);

rval = pool->pos;
pool->pos += size;
Expand Down Expand Up @@ -462,5 +432,5 @@ mono_mempool_get_allocated (MonoMemPool *pool)
long
mono_mempool_get_bytes_allocated (void)
{
return total_bytes_allocated;
return UnlockedRead64 (&total_bytes_allocated);
}
21 changes: 21 additions & 0 deletions mono/utils/unlocked.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,25 @@ UnlockedIncrementSize (gsize *val)
return ++*val;
}

MONO_UNLOCKED_ATTRS
gint64
UnlockedAdd64 (gint64 *dest, gint64 add)
{
return *dest += add;
}

MONO_UNLOCKED_ATTRS
gint64
UnlockedSubtract64 (gint64 *dest, gint64 sub)
{
return *dest -= sub;
}

MONO_UNLOCKED_ATTRS
gint64
UnlockedRead64 (gint64 *src)
{
return *src;
}

#endif /* _UNLOCKED_H_ */