Implement ticker.
Implement ticker, which provides a simple API for ticking off some number of events before indicating that the ticker has hit its limit.
This commit is contained in:
parent
94451d184b
commit
9998000b2b
@ -85,8 +85,8 @@ C_SRCS := $(srcroot)src/jemalloc.c $(srcroot)src/arena.c \
|
|||||||
$(srcroot)src/extent.c $(srcroot)src/hash.c $(srcroot)src/huge.c \
|
$(srcroot)src/extent.c $(srcroot)src/hash.c $(srcroot)src/huge.c \
|
||||||
$(srcroot)src/mb.c $(srcroot)src/mutex.c $(srcroot)src/pages.c \
|
$(srcroot)src/mb.c $(srcroot)src/mutex.c $(srcroot)src/pages.c \
|
||||||
$(srcroot)src/prof.c $(srcroot)src/quarantine.c $(srcroot)src/rtree.c \
|
$(srcroot)src/prof.c $(srcroot)src/quarantine.c $(srcroot)src/rtree.c \
|
||||||
$(srcroot)src/stats.c $(srcroot)src/tcache.c $(srcroot)src/time.c \
|
$(srcroot)src/stats.c $(srcroot)src/tcache.c $(srcroot)src/ticker.c \
|
||||||
$(srcroot)src/tsd.c $(srcroot)src/util.c
|
$(srcroot)src/time.c $(srcroot)src/tsd.c $(srcroot)src/util.c
|
||||||
ifeq ($(enable_valgrind), 1)
|
ifeq ($(enable_valgrind), 1)
|
||||||
C_SRCS += $(srcroot)src/valgrind.c
|
C_SRCS += $(srcroot)src/valgrind.c
|
||||||
endif
|
endif
|
||||||
@ -143,6 +143,7 @@ TESTS_UNIT := $(srcroot)test/unit/atomic.c \
|
|||||||
$(srcroot)test/unit/SFMT.c \
|
$(srcroot)test/unit/SFMT.c \
|
||||||
$(srcroot)test/unit/size_classes.c \
|
$(srcroot)test/unit/size_classes.c \
|
||||||
$(srcroot)test/unit/stats.c \
|
$(srcroot)test/unit/stats.c \
|
||||||
|
$(srcroot)test/unit/ticker.c \
|
||||||
$(srcroot)test/unit/time.c \
|
$(srcroot)test/unit/time.c \
|
||||||
$(srcroot)test/unit/tsd.c \
|
$(srcroot)test/unit/tsd.c \
|
||||||
$(srcroot)test/unit/util.c \
|
$(srcroot)test/unit/util.c \
|
||||||
|
@ -361,6 +361,7 @@ typedef unsigned szind_t;
|
|||||||
#include "jemalloc/internal/util.h"
|
#include "jemalloc/internal/util.h"
|
||||||
#include "jemalloc/internal/atomic.h"
|
#include "jemalloc/internal/atomic.h"
|
||||||
#include "jemalloc/internal/prng.h"
|
#include "jemalloc/internal/prng.h"
|
||||||
|
#include "jemalloc/internal/ticker.h"
|
||||||
#include "jemalloc/internal/ckh.h"
|
#include "jemalloc/internal/ckh.h"
|
||||||
#include "jemalloc/internal/size_classes.h"
|
#include "jemalloc/internal/size_classes.h"
|
||||||
#include "jemalloc/internal/stats.h"
|
#include "jemalloc/internal/stats.h"
|
||||||
@ -390,6 +391,7 @@ typedef unsigned szind_t;
|
|||||||
#include "jemalloc/internal/util.h"
|
#include "jemalloc/internal/util.h"
|
||||||
#include "jemalloc/internal/atomic.h"
|
#include "jemalloc/internal/atomic.h"
|
||||||
#include "jemalloc/internal/prng.h"
|
#include "jemalloc/internal/prng.h"
|
||||||
|
#include "jemalloc/internal/ticker.h"
|
||||||
#include "jemalloc/internal/ckh.h"
|
#include "jemalloc/internal/ckh.h"
|
||||||
#include "jemalloc/internal/size_classes.h"
|
#include "jemalloc/internal/size_classes.h"
|
||||||
#include "jemalloc/internal/stats.h"
|
#include "jemalloc/internal/stats.h"
|
||||||
@ -476,6 +478,7 @@ void jemalloc_postfork_child(void);
|
|||||||
#include "jemalloc/internal/util.h"
|
#include "jemalloc/internal/util.h"
|
||||||
#include "jemalloc/internal/atomic.h"
|
#include "jemalloc/internal/atomic.h"
|
||||||
#include "jemalloc/internal/prng.h"
|
#include "jemalloc/internal/prng.h"
|
||||||
|
#include "jemalloc/internal/ticker.h"
|
||||||
#include "jemalloc/internal/ckh.h"
|
#include "jemalloc/internal/ckh.h"
|
||||||
#include "jemalloc/internal/size_classes.h"
|
#include "jemalloc/internal/size_classes.h"
|
||||||
#include "jemalloc/internal/stats.h"
|
#include "jemalloc/internal/stats.h"
|
||||||
@ -505,6 +508,7 @@ void jemalloc_postfork_child(void);
|
|||||||
#include "jemalloc/internal/util.h"
|
#include "jemalloc/internal/util.h"
|
||||||
#include "jemalloc/internal/atomic.h"
|
#include "jemalloc/internal/atomic.h"
|
||||||
#include "jemalloc/internal/prng.h"
|
#include "jemalloc/internal/prng.h"
|
||||||
|
#include "jemalloc/internal/ticker.h"
|
||||||
#include "jemalloc/internal/ckh.h"
|
#include "jemalloc/internal/ckh.h"
|
||||||
#include "jemalloc/internal/size_classes.h"
|
#include "jemalloc/internal/size_classes.h"
|
||||||
#include "jemalloc/internal/stats.h"
|
#include "jemalloc/internal/stats.h"
|
||||||
|
@ -460,8 +460,11 @@ tcaches_get
|
|||||||
tcache_stats_merge
|
tcache_stats_merge
|
||||||
thread_allocated_cleanup
|
thread_allocated_cleanup
|
||||||
thread_deallocated_cleanup
|
thread_deallocated_cleanup
|
||||||
|
ticker_copy
|
||||||
ticker_init
|
ticker_init
|
||||||
|
ticker_read
|
||||||
ticker_tick
|
ticker_tick
|
||||||
|
ticker_ticks
|
||||||
time_add
|
time_add
|
||||||
time_compare
|
time_compare
|
||||||
time_copy
|
time_copy
|
||||||
|
75
include/jemalloc/internal/ticker.h
Normal file
75
include/jemalloc/internal/ticker.h
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/******************************************************************************/
|
||||||
|
#ifdef JEMALLOC_H_TYPES
|
||||||
|
|
||||||
|
typedef struct ticker_s ticker_t;
|
||||||
|
|
||||||
|
#endif /* JEMALLOC_H_TYPES */
|
||||||
|
/******************************************************************************/
|
||||||
|
#ifdef JEMALLOC_H_STRUCTS
|
||||||
|
|
||||||
|
struct ticker_s {
|
||||||
|
int32_t tick;
|
||||||
|
int32_t nticks;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* JEMALLOC_H_STRUCTS */
|
||||||
|
/******************************************************************************/
|
||||||
|
#ifdef JEMALLOC_H_EXTERNS
|
||||||
|
|
||||||
|
#endif /* JEMALLOC_H_EXTERNS */
|
||||||
|
/******************************************************************************/
|
||||||
|
#ifdef JEMALLOC_H_INLINES
|
||||||
|
|
||||||
|
#ifndef JEMALLOC_ENABLE_INLINE
|
||||||
|
void ticker_init(ticker_t *ticker, int32_t nticks);
|
||||||
|
void ticker_copy(ticker_t *ticker, const ticker_t *other);
|
||||||
|
int32_t ticker_read(const ticker_t *ticker);
|
||||||
|
bool ticker_ticks(ticker_t *ticker, int32_t nticks);
|
||||||
|
bool ticker_tick(ticker_t *ticker);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_TICKER_C_))
|
||||||
|
JEMALLOC_INLINE void
|
||||||
|
ticker_init(ticker_t *ticker, int32_t nticks)
|
||||||
|
{
|
||||||
|
|
||||||
|
ticker->tick = nticks;
|
||||||
|
ticker->nticks = nticks;
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_INLINE void
|
||||||
|
ticker_copy(ticker_t *ticker, const ticker_t *other)
|
||||||
|
{
|
||||||
|
|
||||||
|
*ticker = *other;
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_INLINE int32_t
|
||||||
|
ticker_read(const ticker_t *ticker)
|
||||||
|
{
|
||||||
|
|
||||||
|
return (ticker->tick);
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_INLINE bool
|
||||||
|
ticker_ticks(ticker_t *ticker, int32_t nticks)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (unlikely(ticker->tick < nticks)) {
|
||||||
|
ticker->tick = ticker->nticks;
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
ticker->tick -= nticks;
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_INLINE bool
|
||||||
|
ticker_tick(ticker_t *ticker)
|
||||||
|
{
|
||||||
|
|
||||||
|
return (ticker_ticks(ticker, 1));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* JEMALLOC_H_INLINES */
|
||||||
|
/******************************************************************************/
|
2
src/ticker.c
Normal file
2
src/ticker.c
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#define JEMALLOC_TICKER_C_
|
||||||
|
#include "jemalloc/internal/jemalloc_internal.h"
|
76
test/unit/ticker.c
Normal file
76
test/unit/ticker.c
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
#include "test/jemalloc_test.h"
|
||||||
|
|
||||||
|
TEST_BEGIN(test_ticker_tick)
|
||||||
|
{
|
||||||
|
#define NREPS 2
|
||||||
|
#define NTICKS 3
|
||||||
|
ticker_t ticker;
|
||||||
|
int32_t i, j;
|
||||||
|
|
||||||
|
ticker_init(&ticker, NTICKS);
|
||||||
|
for (i = 0; i < NREPS; i++) {
|
||||||
|
for (j = 0; j < NTICKS; j++) {
|
||||||
|
assert_u_eq(ticker_read(&ticker), NTICKS - j,
|
||||||
|
"Unexpected ticker value (i=%d, j=%d)", i, j);
|
||||||
|
assert_false(ticker_tick(&ticker),
|
||||||
|
"Unexpected ticker fire (i=%d, j=%d)", i, j);
|
||||||
|
}
|
||||||
|
assert_u32_eq(ticker_read(&ticker), 0,
|
||||||
|
"Expected ticker depletion");
|
||||||
|
assert_true(ticker_tick(&ticker),
|
||||||
|
"Expected ticker fire (i=%d)", i);
|
||||||
|
assert_u32_eq(ticker_read(&ticker), NTICKS,
|
||||||
|
"Expected ticker reset");
|
||||||
|
}
|
||||||
|
#undef NTICKS
|
||||||
|
}
|
||||||
|
TEST_END
|
||||||
|
|
||||||
|
TEST_BEGIN(test_ticker_ticks)
|
||||||
|
{
|
||||||
|
#define NTICKS 3
|
||||||
|
ticker_t ticker;
|
||||||
|
|
||||||
|
ticker_init(&ticker, NTICKS);
|
||||||
|
|
||||||
|
assert_u_eq(ticker_read(&ticker), NTICKS, "Unexpected ticker value");
|
||||||
|
assert_false(ticker_ticks(&ticker, NTICKS), "Unexpected ticker fire");
|
||||||
|
assert_u_eq(ticker_read(&ticker), 0, "Unexpected ticker value");
|
||||||
|
assert_true(ticker_ticks(&ticker, NTICKS), "Expected ticker fire");
|
||||||
|
assert_u_eq(ticker_read(&ticker), NTICKS, "Unexpected ticker value");
|
||||||
|
|
||||||
|
assert_true(ticker_ticks(&ticker, NTICKS + 1), "Expected ticker fire");
|
||||||
|
assert_u_eq(ticker_read(&ticker), NTICKS, "Unexpected ticker value");
|
||||||
|
#undef NTICKS
|
||||||
|
}
|
||||||
|
TEST_END
|
||||||
|
|
||||||
|
TEST_BEGIN(test_ticker_copy)
|
||||||
|
{
|
||||||
|
#define NTICKS 3
|
||||||
|
ticker_t ta, tb;
|
||||||
|
|
||||||
|
ticker_init(&ta, NTICKS);
|
||||||
|
ticker_copy(&tb, &ta);
|
||||||
|
assert_u_eq(ticker_read(&tb), NTICKS, "Unexpected ticker value");
|
||||||
|
assert_true(ticker_ticks(&tb, NTICKS + 1), "Expected ticker fire");
|
||||||
|
assert_u_eq(ticker_read(&tb), NTICKS, "Unexpected ticker value");
|
||||||
|
|
||||||
|
ticker_tick(&ta);
|
||||||
|
ticker_copy(&tb, &ta);
|
||||||
|
assert_u_eq(ticker_read(&tb), NTICKS - 1, "Unexpected ticker value");
|
||||||
|
assert_true(ticker_ticks(&tb, NTICKS), "Expected ticker fire");
|
||||||
|
assert_u_eq(ticker_read(&tb), NTICKS, "Unexpected ticker value");
|
||||||
|
#undef NTICKS
|
||||||
|
}
|
||||||
|
TEST_END
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
return (test(
|
||||||
|
test_ticker_tick,
|
||||||
|
test_ticker_ticks,
|
||||||
|
test_ticker_copy));
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user