mirror of
https://github.com/jemalloc/jemalloc.git
synced 2026-05-14 17:06:22 +03:00
46 lines
1.5 KiB
C
46 lines
1.5 KiB
C
#ifndef JEMALLOC_INTERNAL_BATCHER_H
|
|
#define JEMALLOC_INTERNAL_BATCHER_H
|
|
|
|
#include "jemalloc/internal/jemalloc_preamble.h"
|
|
#include "jemalloc/internal/atomic.h"
|
|
#include "jemalloc/internal/mutex.h"
|
|
|
|
#define BATCHER_NO_IDX ((size_t) - 1)
|
|
|
|
typedef struct batcher_s batcher_t;
|
|
struct batcher_s {
|
|
/*
|
|
* Optimize for locality -- nelems_max and nelems are always touched
|
|
* togehter, along with the front of the mutex. The end of the mutex is
|
|
* only touched if there's contention.
|
|
*/
|
|
atomic_zu_t nelems;
|
|
size_t nelems_max;
|
|
size_t npushes;
|
|
malloc_mutex_t mtx;
|
|
};
|
|
|
|
void batcher_init(batcher_t *batcher, size_t nelems_max);
|
|
|
|
/*
|
|
* Returns an index (into some user-owned array) to use for pushing, or
|
|
* BATCHER_NO_IDX if no index is free. If the former, the caller must call
|
|
* batcher_push_end once done.
|
|
*/
|
|
size_t batcher_push_begin(
|
|
tsdn_t *tsdn, batcher_t *batcher, size_t elems_to_push);
|
|
void batcher_push_end(tsdn_t *tsdn, batcher_t *batcher);
|
|
|
|
/*
|
|
* Returns the number of items to pop, or BATCHER_NO_IDX if there are none.
|
|
* If the former, must be followed by a call to batcher_pop_end.
|
|
*/
|
|
size_t batcher_pop_begin(tsdn_t *tsdn, batcher_t *batcher);
|
|
size_t batcher_pop_get_pushes(tsdn_t *tsdn, batcher_t *batcher);
|
|
void batcher_pop_end(tsdn_t *tsdn, batcher_t *batcher);
|
|
|
|
void batcher_prefork(tsdn_t *tsdn, batcher_t *batcher);
|
|
void batcher_postfork_parent(tsdn_t *tsdn, batcher_t *batcher);
|
|
void batcher_postfork_child(tsdn_t *tsdn, batcher_t *batcher);
|
|
|
|
#endif /* JEMALLOC_INTERNAL_BATCHER_H */
|