33 lines
1.7 KiB
C
33 lines
1.7 KiB
C
// calogHandle.h -- thread-safe, typed integer handle table for calog libraries.
|
|
//
|
|
// calog library natives (DB, network) are registered INLINE, so they run on whatever
|
|
// context thread called them -- many at once. A resource (a connection, a socket) is
|
|
// therefore handed to a script as an opaque int64 handle backed by this table, which is
|
|
// mutex-guarded and tags every entry with a type so a DB handle can never be used where a
|
|
// socket is expected. Handles are monotonic and never reused, so a stale handle from a
|
|
// closed resource reliably fails to resolve rather than aliasing a live one.
|
|
|
|
#ifndef CALOG_HANDLE_H
|
|
#define CALOG_HANDLE_H
|
|
|
|
#include <stdint.h>
|
|
|
|
typedef struct CalogHandleTableT CalogHandleTableT;
|
|
|
|
// Invoked for each still-open entry at table destroy, to release the resource.
|
|
typedef void (*CalogHandleCloserT)(uint32_t type, void *resource);
|
|
|
|
// Add returns a positive handle, or 0 on out-of-memory. Get/Remove return the resource
|
|
// only when the handle exists AND its type matches; otherwise NULL. Remove also frees the
|
|
// slot. Destroy closes every remaining entry through the closer (may be NULL) and frees
|
|
// the table.
|
|
CalogHandleTableT *calogHandleTableCreate(void);
|
|
void calogHandleTableDestroy(CalogHandleTableT *table, CalogHandleCloserT closer);
|
|
int64_t calogHandleAdd(CalogHandleTableT *table, uint32_t type, void *resource);
|
|
void *calogHandleGet(CalogHandleTableT *table, int64_t handle, uint32_t type);
|
|
void *calogHandleRemove(CalogHandleTableT *table, int64_t handle, uint32_t type);
|
|
|
|
// Number of live entries of the given type currently in the table.
|
|
int32_t calogHandleCount(CalogHandleTableT *table, uint32_t type);
|
|
|
|
#endif
|