X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/71a018851ec389e3c5c68e6dda895d47f5a29c5f..972791c2823bfc1694d827b1e943eb725847e2d8:/src/xbt/mallocator.c diff --git a/src/xbt/mallocator.c b/src/xbt/mallocator.c index 469c43596a..9ac395b0c7 100644 --- a/src/xbt/mallocator.c +++ b/src/xbt/mallocator.c @@ -1,6 +1,6 @@ /* mallocator - recycle objects to avoid malloc() / free() */ -/* Copyright (c) 2006-2011. The SimGrid Team. +/* Copyright (c) 2006-2014. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -42,27 +42,24 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_mallocator, xbt, "Mallocators"); * mallocators should be protected from concurrent accesses. */ static int initialization_done = 0; -static XBT_INLINE void lock_create(xbt_mallocator_t m) +static XBT_INLINE void lock_reset(xbt_mallocator_t m) { - m->mutex = initialization_done > 1 ? xbt_os_mutex_init() : NULL; -} - -static XBT_INLINE void lock_destroy(xbt_mallocator_t m) -{ - if (m->mutex) - xbt_os_mutex_destroy(m->mutex); + m->lock = 0; } static XBT_INLINE void lock_acquire(xbt_mallocator_t m) { - if (m->mutex) - xbt_os_mutex_acquire(m->mutex); + if (initialization_done > 1) { + int *lock = &m->lock; + while (__sync_lock_test_and_set(lock, 1)) + /* nop */; + } } static XBT_INLINE void lock_release(xbt_mallocator_t m) { - if (m->mutex) - xbt_os_mutex_release(m->mutex); + if (initialization_done > 1) + __sync_lock_release(&m->lock); } /** @@ -146,7 +143,6 @@ void xbt_mallocator_free(xbt_mallocator_t m) m->free_f(m->objects[i]); } xbt_free(m->objects); - lock_destroy(m); xbt_free(m); } @@ -194,7 +190,7 @@ void *xbt_mallocator_get(xbt_mallocator_t m) if (xbt_mallocator_is_active()) { // We have to switch this mallocator from inactive to active (and then get an object) m->objects = xbt_new0(void *, m->max_size); - lock_create(m); + lock_reset(m); return xbt_mallocator_get(m); } else { object = m->new_f(); @@ -241,7 +237,7 @@ void xbt_mallocator_release(xbt_mallocator_t m, void *object) if (xbt_mallocator_is_active()) { // We have to switch this mallocator from inactive to active (and then store that object) m->objects = xbt_new0(void *, m->max_size); - lock_create(m); + lock_reset(m); xbt_mallocator_release(m,object); } else { m->free_f(object);