Commit 19cc1e4c authored by Martin Blix Grydeland's avatar Martin Blix Grydeland Committed by Dridi Boukelmoune

STV temp buffer API

This is an API for getting an arbitrary buffer through the
stevedores. The stevedore in question may then deploy LRU nuking or other
measures to control resource usage.
parent 66e2ea31
......@@ -553,6 +553,11 @@ void STV_BanExport(const uint8_t *banlist, unsigned len);
int STV_NewObject(struct worker *, struct objcore *,
const struct stevedore *, unsigned len);
struct stv_buffer;
struct stv_buffer *STV_AllocBuf(struct worker *wrk, const struct stevedore *stv,
size_t size);
void STV_FreeBuf(struct worker *wrk, struct stv_buffer **pstvbuf);
void *STV_GetBufPtr(struct stv_buffer *stvbuf, size_t *psize);
#if WITH_PERSISTENT_STORAGE
/* storage_persistent.c */
......
......@@ -96,6 +96,74 @@ STV_NewObject(struct worker *wrk, struct objcore *oc,
/*-------------------------------------------------------------------*/
struct stv_buffer {
unsigned magic;
#define STV_BUFFER_MAGIC 0xf39cb6c2
const struct stevedore *stv;
size_t size;
uintptr_t priv;
};
struct stv_buffer *
STV_AllocBuf(struct worker *wrk, const struct stevedore *stv, size_t size)
{
struct stv_buffer *stvbuf;
uint8_t *buf;
uintptr_t priv = 0;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(stv, STEVEDORE_MAGIC);
if (size == 0)
return (NULL);
if (stv->allocbuf == NULL)
return (NULL);
buf = stv->allocbuf(wrk, stv, size + PRNDUP(sizeof *stvbuf), &priv);
if (buf == NULL)
return (NULL);
assert(PAOK(buf));
stvbuf = (void *)buf;
INIT_OBJ(stvbuf, STV_BUFFER_MAGIC);
stvbuf->stv = stv;
stvbuf->priv = priv;
stvbuf->size = size;
return (stvbuf);
}
void
STV_FreeBuf(struct worker *wrk, struct stv_buffer **pstvbuf)
{
struct stv_buffer *stvbuf;
const struct stevedore *stv;
uintptr_t priv;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
TAKE_OBJ_NOTNULL(stvbuf, pstvbuf, STV_BUFFER_MAGIC);
CHECK_OBJ_NOTNULL(stvbuf->stv, STEVEDORE_MAGIC);
stv = stvbuf->stv;
priv = stvbuf->priv;
CHECK_OBJ_NOTNULL(stv, STEVEDORE_MAGIC);
ZERO_OBJ(stvbuf, sizeof *stvbuf);
AN(stv->freebuf);
stv->freebuf(wrk, stv, priv);
}
void *
STV_GetBufPtr(struct stv_buffer *stvbuf, size_t *psize)
{
CHECK_OBJ_NOTNULL(stvbuf, STV_BUFFER_MAGIC);
if (psize)
*psize = stvbuf->size;
return (&stvbuf[1]);
}
/*-------------------------------------------------------------------*/
void
STV_open(void)
{
......
......@@ -75,6 +75,10 @@ typedef void storage_banexport_f(const struct stevedore *, const uint8_t *bans,
unsigned len);
typedef void storage_panic_f(struct vsb *vsb, const struct objcore *oc);
typedef void *storage_allocbuf_f(struct worker *, const struct stevedore *,
size_t size, uintptr_t *ppriv);
typedef void storage_freebuf_f(struct worker *, const struct stevedore *,
uintptr_t priv);
typedef struct object *sml_getobj_f(struct worker *, struct objcore *);
typedef struct storage *sml_alloc_f(const struct stevedore *, size_t size);
......@@ -104,6 +108,8 @@ struct stevedore {
storage_baninfo_f *baninfo;
storage_banexport_f *banexport;
storage_panic_f *panic;
storage_allocbuf_f *allocbuf;
storage_freebuf_f *freebuf;
/* Only if SML is used */
sml_alloc_f *sml_alloc;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment