Lines Matching refs:sh

85  * These are the functions that must be implemented by a secure heap (sh).
277 * of "sh.minsize" units. The freelist and bitmaps are kept separately,
291 ((char*)(p) >= sh.arena && (char*)(p) < &sh.arena[sh.arena_size])
293 ((char*)(p) >= (char*)sh.freelist && (char*)(p) < (char*)&sh.freelist[sh.freelist_size])
316 static SH sh;
320 ossl_ssize_t list = sh.freelist_size - 1;
321 size_t bit = (sh.arena_size + ptr - sh.arena) / sh.minsize;
324 if (TESTBIT(sh.bittable, bit))
337 OPENSSL_assert(list >= 0 && list < sh.freelist_size);
338 OPENSSL_assert(((ptr - sh.arena) & ((sh.arena_size >> list) - 1)) == 0);
339 bit = (ONE << list) + ((ptr - sh.arena) / (sh.arena_size >> list));
340 OPENSSL_assert(bit > 0 && bit < sh.bittable_size);
348 OPENSSL_assert(list >= 0 && list < sh.freelist_size);
349 OPENSSL_assert(((ptr - sh.arena) & ((sh.arena_size >> list) - 1)) == 0);
350 bit = (ONE << list) + ((ptr - sh.arena) / (sh.arena_size >> list));
351 OPENSSL_assert(bit > 0 && bit < sh.bittable_size);
360 OPENSSL_assert(list >= 0 && list < sh.freelist_size);
361 OPENSSL_assert(((ptr - sh.arena) & ((sh.arena_size >> list) - 1)) == 0);
362 bit = (ONE << list) + ((ptr - sh.arena) / (sh.arena_size >> list));
363 OPENSSL_assert(bit > 0 && bit < sh.bittable_size);
415 memset(&sh, 0, sizeof(sh));
445 sh.arena_size = size;
446 sh.minsize = minsize;
447 sh.bittable_size = (sh.arena_size / sh.minsize) * 2;
450 if (sh.bittable_size >> 3 == 0)
453 sh.freelist_size = -1;
454 for (i = sh.bittable_size; i; i >>= 1)
455 sh.freelist_size++;
457 sh.freelist = OPENSSL_zalloc(sh.freelist_size * sizeof(char *));
458 OPENSSL_assert(sh.freelist != NULL);
459 if (sh.freelist == NULL)
462 sh.bittable = OPENSSL_zalloc(sh.bittable_size >> 3);
463 OPENSSL_assert(sh.bittable != NULL);
464 if (sh.bittable == NULL)
467 sh.bitmalloc = OPENSSL_zalloc(sh.bittable_size >> 3);
468 OPENSSL_assert(sh.bitmalloc != NULL);
469 if (sh.bitmalloc == NULL)
491 sh.map_size = pgsize + sh.arena_size + pgsize;
495 sh.map_result = mmap(NULL, sh.map_size,
501 sh.map_result = MAP_FAILED;
503 sh.map_result = mmap(NULL, sh.map_size,
509 if (sh.map_result == MAP_FAILED)
512 sh.map_result = VirtualAlloc(NULL, sh.map_size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
514 if (sh.map_result == NULL)
518 sh.arena = (char *)(sh.map_result + pgsize);
519 sh_setbit(sh.arena, 0, sh.bittable);
520 sh_add_to_list(&sh.freelist[0], sh.arena);
527 if (mprotect(sh.map_result, pgsize, PROT_NONE) < 0)
530 if (VirtualProtect(sh.map_result, pgsize, PAGE_NOACCESS, &flOldProtect) == FALSE)
535 aligned = (pgsize + sh.arena_size + (pgsize - 1)) & ~(pgsize - 1);
537 if (mprotect(sh.map_result + aligned, pgsize, PROT_NONE) < 0)
540 if (VirtualProtect(sh.map_result + aligned, pgsize, PAGE_NOACCESS, &flOldProtect) == FALSE)
545 if (syscall(SYS_mlock2, sh.arena, sh.arena_size, MLOCK_ONFAULT) < 0) {
547 if (mlock(sh.arena, sh.arena_size) < 0)
554 if (VirtualLock(sh.arena, sh.arena_size) == FALSE)
557 if (mlock(sh.arena, sh.arena_size) < 0)
561 if (madvise(sh.arena, sh.arena_size, MADV_DONTDUMP) < 0)
574 OPENSSL_free(sh.freelist);
575 OPENSSL_free(sh.bittable);
576 OPENSSL_free(sh.bitmalloc);
578 if (sh.map_result != MAP_FAILED && sh.map_size)
579 munmap(sh.map_result, sh.map_size);
581 if (sh.map_result != NULL && sh.map_size)
582 VirtualFree(sh.map_result, 0, MEM_RELEASE);
584 memset(&sh, 0, sizeof(sh));
597 bit = (ONE << list) + (ptr - sh.arena) / (sh.arena_size >> list);
600 if (TESTBIT(sh.bittable, bit) && !TESTBIT(sh.bitmalloc, bit))
601 chunk = sh.arena + ((bit & ((ONE << list) - 1)) * (sh.arena_size >> list));
612 if (size > sh.arena_size)
615 list = sh.freelist_size - 1;
616 for (i = sh.minsize; i < size; i <<= 1)
623 if (sh.freelist[slist] != NULL)
630 char *temp = sh.freelist[slist];
633 OPENSSL_assert(!sh_testbit(temp, slist, sh.bitmalloc));
634 sh_clearbit(temp, slist, sh.bittable);
636 OPENSSL_assert(temp != sh.freelist[slist]);
642 OPENSSL_assert(!sh_testbit(temp, slist, sh.bitmalloc));
643 sh_setbit(temp, slist, sh.bittable);
644 sh_add_to_list(&sh.freelist[slist], temp);
645 OPENSSL_assert(sh.freelist[slist] == temp);
648 temp += sh.arena_size >> slist;
649 OPENSSL_assert(!sh_testbit(temp, slist, sh.bitmalloc));
650 sh_setbit(temp, slist, sh.bittable);
651 sh_add_to_list(&sh.freelist[slist], temp);
652 OPENSSL_assert(sh.freelist[slist] == temp);
654 OPENSSL_assert(temp-(sh.arena_size >> slist) == sh_find_my_buddy(temp, slist));
658 chunk = sh.freelist[list];
659 OPENSSL_assert(sh_testbit(chunk, list, sh.bittable));
660 sh_setbit(chunk, list, sh.bitmalloc);
683 OPENSSL_assert(sh_testbit(ptr, list, sh.bittable));
684 sh_clearbit(ptr, list, sh.bitmalloc);
685 sh_add_to_list(&sh.freelist[list], ptr);
691 OPENSSL_assert(!sh_testbit(ptr, list, sh.bitmalloc));
692 sh_clearbit(ptr, list, sh.bittable);
694 OPENSSL_assert(!sh_testbit(ptr, list, sh.bitmalloc));
695 sh_clearbit(buddy, list, sh.bittable);
705 OPENSSL_assert(!sh_testbit(ptr, list, sh.bitmalloc));
706 sh_setbit(ptr, list, sh.bittable);
707 sh_add_to_list(&sh.freelist[list], ptr);
708 OPENSSL_assert(sh.freelist[list] == ptr);
720 OPENSSL_assert(sh_testbit(ptr, list, sh.bittable));
721 return sh.arena_size / (ONE << list);