172bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris/*
272bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris * Copyright (C) 2014 The Android Open Source Project
372bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris *
472bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris * Licensed under the Apache License, Version 2.0 (the "License");
572bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris * you may not use this file except in compliance with the License.
672bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris * You may obtain a copy of the License at
772bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris *
872bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris *      http://www.apache.org/licenses/LICENSE-2.0
972bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris *
1072bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris * Unless required by applicable law or agreed to in writing, software
1172bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris * distributed under the License is distributed on an "AS IS" BASIS,
1272bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1372bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris * See the License for the specific language governing permissions and
1472bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris * limitations under the License.
1572bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris */
1672bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris
1703eebcb6e8762e668a0d3af6bb303cccb88c5b81Christopher Ferris#include <sys/param.h>
1872bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris#include <unistd.h>
1972bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris
2072bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris#include "jemalloc.h"
2103eebcb6e8762e668a0d3af6bb303cccb88c5b81Christopher Ferris#include "private/bionic_macros.h"
2272bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris
2372bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferrisvoid* je_pvalloc(size_t bytes) {
2491570ce987ef93f9ba2fa663a5fee1bd2525a2baElliott Hughes  size_t pagesize = getpagesize();
2503eebcb6e8762e668a0d3af6bb303cccb88c5b81Christopher Ferris  size_t size = BIONIC_ALIGN(bytes, pagesize);
2603eebcb6e8762e668a0d3af6bb303cccb88c5b81Christopher Ferris  if (size < bytes) {
2703eebcb6e8762e668a0d3af6bb303cccb88c5b81Christopher Ferris    return NULL;
2803eebcb6e8762e668a0d3af6bb303cccb88c5b81Christopher Ferris  }
2903eebcb6e8762e668a0d3af6bb303cccb88c5b81Christopher Ferris  return je_memalign(pagesize, size);
3072bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris}
3172bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris
3272bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris#ifdef je_memalign
3372bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris#undef je_memalign
3472bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris#endif
3572bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris
3672bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris// The man page for memalign says it fails if boundary is not a power of 2,
3772bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris// but this is not true. Both glibc and dlmalloc round up to the next power
3872bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris// of 2, so we'll do the same.
3972bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferrisvoid* je_memalign_round_up_boundary(size_t boundary, size_t size) {
4003eebcb6e8762e668a0d3af6bb303cccb88c5b81Christopher Ferris  if (boundary != 0) {
4103eebcb6e8762e668a0d3af6bb303cccb88c5b81Christopher Ferris    if (!powerof2(boundary)) {
4203eebcb6e8762e668a0d3af6bb303cccb88c5b81Christopher Ferris      boundary = BIONIC_ROUND_UP_POWER_OF_2(boundary);
4372bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris    }
4472bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris  } else {
4572bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris    boundary = 1;
4672bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris  }
4772bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris  return je_memalign(boundary, size);
4872bbd423579bb971dc06cdd3c06201faf3fe95e6Christopher Ferris}
49