erlang各种有用的函数包括一些有用nif封装,还有一些性能测试case。
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 
 
 
 

71 рядки
1.5 KiB

#include <stdint.h>
#include "erl_nif.h"
#define CACHE_LINE_SIZE 64
#define SLOT_INDEX(__index, __size) __index & (__size - 1)
#define Q_MASK 3L
#define Q_PTR(__ptr) (cq_node_t *) (((uint64_t)__ptr) & (~Q_MASK))
#define Q_COUNT(__ptr) ((uint64_t) __ptr & Q_MASK)
#define Q_SET_COUNT(__ptr, __val) (cq_node_t *) ((uint64_t) __ptr | (__val & Q_MASK))
#define STATE_EMPTY 0
#define STATE_WRITE 1
#define STATE_READ 2
#define STATE_FULL 3
ErlNifResourceType* CQ_RESOURCE;
typedef struct cq_node cq_node_t;
struct cq_node {
ErlNifEnv *env;
//ERL_NIF_TERM term;
ErlNifPid *value;
cq_node_t *next;
};
typedef struct cq_queue {
cq_node_t *head;
cq_node_t *tail;
} cq_queue_t;
// TODO: Add padding between the fields
typedef struct cq {
uint32_t id;
uint64_t queue_size;
uint64_t overflow_size;
uint64_t head;
uint64_t tail;
uint8_t *slots_states;
ERL_NIF_TERM *slots_terms;
ErlNifEnv **slots_envs;
cq_queue_t *push_queue;
cq_queue_t *pop_queue;
uint8_t *overflow_states;
ERL_NIF_TERM *overflow_terms;
ErlNifEnv **overflow_envs;
} cq_t;
cq_t **QUEUES = NULL; /* Initialized on nif load */
ERL_NIF_TERM mk_atom(ErlNifEnv* env, const char* atom);
ERL_NIF_TERM mk_error(ErlNifEnv* env, const char* msg);
int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info);
void free_resource(ErlNifEnv*, void*);
cq_queue_t* new_queue(void);
void enqueue(cq_queue_t *q, ErlNifPid *pid);