Home | History | Annotate | Line # | Download | only in internal
      1 #ifndef JEMALLOC_INTERNAL_EXP_GROW_H
      2 #define JEMALLOC_INTERNAL_EXP_GROW_H
      3 
      4 typedef struct exp_grow_s exp_grow_t;
      5 struct exp_grow_s {
      6 	/*
      7 	 * Next extent size class in a growing series to use when satisfying a
      8 	 * request via the extent hooks (only if opt_retain).  This limits the
      9 	 * number of disjoint virtual memory ranges so that extent merging can
     10 	 * be effective even if multiple arenas' extent allocation requests are
     11 	 * highly interleaved.
     12 	 *
     13 	 * retain_grow_limit is the max allowed size ind to expand (unless the
     14 	 * required size is greater).  Default is no limit, and controlled
     15 	 * through mallctl only.
     16 	 */
     17 	pszind_t next;
     18 	pszind_t limit;
     19 };
     20 
     21 static inline bool
     22 exp_grow_size_prepare(exp_grow_t *exp_grow, size_t alloc_size_min,
     23     size_t *r_alloc_size, pszind_t *r_skip) {
     24 	*r_skip = 0;
     25 	*r_alloc_size = sz_pind2sz(exp_grow->next + *r_skip);
     26 	while (*r_alloc_size < alloc_size_min) {
     27 		(*r_skip)++;
     28 		if (exp_grow->next + *r_skip  >=
     29 		    sz_psz2ind(SC_LARGE_MAXCLASS)) {
     30 			/* Outside legal range. */
     31 			return true;
     32 		}
     33 		*r_alloc_size = sz_pind2sz(exp_grow->next + *r_skip);
     34 	}
     35 	return false;
     36 }
     37 
     38 static inline void
     39 exp_grow_size_commit(exp_grow_t *exp_grow, pszind_t skip) {
     40 	if (exp_grow->next + skip + 1 <= exp_grow->limit) {
     41 		exp_grow->next += skip + 1;
     42 	} else {
     43 		exp_grow->next = exp_grow->limit;
     44 	}
     45 
     46 }
     47 
     48 void exp_grow_init(exp_grow_t *exp_grow);
     49 
     50 #endif /* JEMALLOC_INTERNAL_EXP_GROW_H */
     51