aboutsummaryrefslogtreecommitdiff
path: root/libitm/util.cc
diff options
context:
space:
mode:
authorH.J. Lu <hongjiu.lu@intel.com>2016-04-19 17:01:11 +0000
committerH.J. Lu <hjl@gcc.gnu.org>2016-04-19 10:01:11 -0700
commit831698b8f7e479506b2f7156ce54fe95b7126c1c (patch)
tree3273b0d938e451bbc5bab2642961a56fc6ba064b /libitm/util.cc
parentd855ad89cbf9f70c1f2cd1e0eea7be4e08f769d8 (diff)
downloadgcc-831698b8f7e479506b2f7156ce54fe95b7126c1c.zip
gcc-831698b8f7e479506b2f7156ce54fe95b7126c1c.tar.gz
gcc-831698b8f7e479506b2f7156ce54fe95b7126c1c.tar.bz2
Allocate memory on cache line if requested
Since GTM::gtm_thread has gtm_thread *next_thread __attribute__((__aligned__(HW_CACHELINE_SIZE))); GTM::gtm_thread::operator new () calls xmalloc with separate_cl == true. xmalloc must return memory on cache line in this case. PR libitm/70456 * util.cc (xmalloc): Use posix_memalign to allocate memory on on cache line if requested. From-SVN: r235211
Diffstat (limited to 'libitm/util.cc')
-rw-r--r--libitm/util.cc22
1 files changed, 16 insertions, 6 deletions
diff --git a/libitm/util.cc b/libitm/util.cc
index 16e5d03..f89b2e5 100644
--- a/libitm/util.cc
+++ b/libitm/util.cc
@@ -61,12 +61,22 @@ GTM_fatal (const char *fmt, ...)
void *
xmalloc (size_t size, bool separate_cl)
{
- // TODO Use posix_memalign if separate_cl is true, or some other allocation
- // method that will avoid sharing cache lines with data used by other
- // threads.
- void *r = malloc (size);
- if (r == 0)
- GTM_fatal ("Out of memory allocating %lu bytes", (unsigned long) size);
+ void *r;
+#ifdef HAVE_POSIX_MEMALIGN
+ if (separate_cl)
+ {
+ if (posix_memalign (&r, HW_CACHELINE_SIZE, size))
+ GTM_fatal ("Out of memory allocating %lu bytes aligned on cache line",
+ (unsigned long) size);
+ }
+ else
+#endif
+ {
+ r = malloc (size);
+ if (r == 0)
+ GTM_fatal ("Out of memory allocating %lu bytes",
+ (unsigned long) size);
+ }
return r;
}