13
edits
(Add thread safety note, add temporary notification disabling.) |
|||
(2 intermediate revisions by the same user not shown) | |||
Line 39: | Line 39: | ||
* minimum. The callee should try to free memory in order | * minimum. The callee should try to free memory in order | ||
* to restore the reserve. | * to restore the reserve. | ||
* | * | ||
* RESERVE_CND_CRIT: The reserve was not large enough to satisfy a pending | * RESERVE_CND_CRIT: The reserve was not large enough to satisfy a pending | ||
Line 50: | Line 45: | ||
* the condition spontaneously desists due to concurrent | * the condition spontaneously desists due to concurrent | ||
* deallocation). | * deallocation). | ||
* | * | ||
* RESERVE_CND_FAIL: An allocation request could not be satisfied, despite all | * RESERVE_CND_FAIL: An allocation request could not be satisfied, despite all | ||
Line 62: | Line 52: | ||
* The order in which the callback functions are called is only loosely | * The order in which the callback functions are called is only loosely | ||
* specified: in the absence of interposing callback | * specified: in the absence of interposing callback | ||
* registrations/unregistrations | * registrations/unregistrations, enabled callbacks will be called in an | ||
* arbitrary round-robin order. | |||
* | * | ||
* Condition notifications are sent to callbacks only while conditions exist. | * Condition notifications are sent to callbacks only while conditions exist. | ||
Line 75: | Line 65: | ||
* Callback functions can freely call back into the allocator (i.e. the | * Callback functions can freely call back into the allocator (i.e. the | ||
* allocator releases all internal resources before calling each callback | * allocator releases all internal resources before calling each callback | ||
* function), though | * function), though allocation is discouraged, since recursive callbacks are | ||
* | * likely to result, which places extra burden on the application to avoid | ||
* | * deadlock. | ||
* | * | ||
* Callback functions must be thread-safe, since it is possible that multiple | * Callback functions must be thread-safe, since it is possible that multiple | ||
Line 85: | Line 75: | ||
/* Memory reserve condition types. */ | /* Memory reserve condition types. */ | ||
typedef enum { | typedef enum { | ||
RESERVE_CND_LOW, | |||
RESERVE_CND_LOW | RESERVE_CND_CRIT, | ||
RESERVE_CND_CRIT | RESERVE_CND_FAIL | ||
RESERVE_CND_FAIL | |||
} reserve_cnd_t; | } reserve_cnd_t; | ||
Line 99: | Line 87: | ||
* cnd: Condition type being delivered. | * cnd: Condition type being delivered. | ||
* size: Allocation request size for the allocation that caused the condition. | * size: Allocation request size for the allocation that caused the condition. | ||
*/ | */ | ||
typedef | typedef void reserve_cb_t(void *ctx, reserve_cnd_t cnd, size_t size); | ||
/* | /* | ||
Line 114: | Line 96: | ||
* cb: Callback function pointer. | * cb: Callback function pointer. | ||
* ctx: Opaque application data, passed to cb(). | * ctx: Opaque application data, passed to cb(). | ||
* | * | ||
* Output: | * Output: | ||
* ret: | * ret: If true, failure due to OOM; success otherwise. | ||
*/ | */ | ||
bool reserve_cb_register(reserve_cb_t *cb, void *ctx); | |||
/* | /* | ||
* | * Unregister a callback function. | ||
* | * | ||
* Inputs: | * Inputs: | ||
* cb: Callback function pointer. | * cb: Callback function pointer. | ||
* | * ctx: Opaque application data, same as that passed to reserve_cb_register(). | ||
* | * | ||
* Output: | * Output: | ||
* ret: | * ret: False upon success, true if the {cb,ctx} registration could not be | ||
* | * found. | ||
*/ | */ | ||
bool reserve_cb_unregister(reserve_cb_t *cb, void *ctx); | |||
/* | /* | ||
Line 194: | Line 133: | ||
* Set the minimum acceptable reserve size. | * Set the minimum acceptable reserve size. | ||
* | * | ||
* min: Reserve threshold. | * min: Reserve threshold. This value may be internally rounded up. | ||
* ret: False if the reserve was successfully resized; true otherwise. Note | * ret: False if the reserve was successfully resized; true otherwise. Note | ||
* that failure to resize the reserve also results in a RESERVE_CND_LOW | * that failure to resize the reserve also results in a RESERVE_CND_LOW |
edits