/* ** Get system page size */ static void GetPageSize(void) { PRInt32 pageSize; /* Get page size */ #ifdef XP_UNIX #if defined SUNOS4 || defined LINUX || defined BSDI || defined AIX \ || defined FREEBSD _pr_pageSize = getpagesize(); #elif defined(HPUX) /* I have no idea. Don't get me started. --Rob */ _pr_pageSize = sysconf(_SC_PAGE_SIZE); #else _pr_pageSize = sysconf(_SC_PAGESIZE); #endif #endif /* XP_UNIX */ #ifdef XP_MAC _pr_pageSize = 4096; #endif /* XP_MAC */ #ifdef XP_PC #ifdef _WIN32 SYSTEM_INFO info; GetSystemInfo(&info); _pr_pageSize = info.dwPageSize; #else _pr_pageSize = 4096; #endif #endif /* XP_PC */ pageSize = _pr_pageSize; PR_CEILING_LOG2(_pr_pageShift, pageSize); }
PRBool nsVoidArray::GrowArrayBy(PRInt32 aGrowBy) { // We have to grow the array. Grow by kMinGrowArrayBy slots if we're // smaller than kLinearThreshold bytes, or a power of two if we're // larger. This is much more efficient with most memory allocators, // especially if it's very large, or of the allocator is binned. if (aGrowBy < kMinGrowArrayBy) aGrowBy = kMinGrowArrayBy; PRUint32 newCapacity = GetArraySize() + aGrowBy; // Minimum increase PRUint32 newSize = SIZEOF_IMPL(newCapacity); if (newSize >= (PRUint32) kLinearThreshold) { // newCount includes enough space for at least kMinGrowArrayBy new // slots. Select the next power-of-two size in bytes above or // equal to that. // Also, limit the increase in size to about a VM page or two. if (GetArraySize() >= kMaxGrowArrayBy) { newCapacity = GetArraySize() + PR_MAX(kMaxGrowArrayBy,aGrowBy); newSize = SIZEOF_IMPL(newCapacity); } else { PR_CEILING_LOG2(newSize, newSize); newCapacity = CAPACITYOF_IMPL(PR_BIT(newSize)); } } // frees old mImpl IF this succeeds if (!SizeTo(newCapacity)) return PR_FALSE; return PR_TRUE; }
/* ** Compute the log of the least power of 2 greater than or equal to n */ NSPR_API(PRIntn) PR_CeilingLog2(PRUint32 i) { PRIntn r; PR_CEILING_LOG2(r,i); return r; }