Esempio n. 1
0
static void
salt_pcb_free(nif_heap_t *hp, void *obj)
{
	struct salt_pcb 	*sc = obj;
	struct salt_msg 	*sm;
	struct salt_msg 	*tmp;

	/* Signal termination request, join worker thread, release all resources. */
	enif_mutex_lock(sc->sc_lock);
	sc->sc_exit_flag = true;
	enif_cond_signal(sc->sc_cond);
	enif_mutex_unlock(sc->sc_lock);

	(void)enif_thread_join(sc->sc_thread, NULL);

	sm = sc->sc_req_first;
 loop:
	if (sm == NULL)
		goto done;
	tmp = sm->msg_next;

	enif_free_env(sm->msg_heap);
	enif_free(sm);

	sm = tmp;
	goto loop;
 done:
	enif_mutex_destroy(sc->sc_lock);
	enif_cond_destroy(sc->sc_cond);

	/* Done, PCB itself released by ERTS. */
	return ;
}
Esempio n. 2
0
static void*
_reading_thread (void* arg)
{
  CAN_handle* handle  = arg;
  ErlNifEnv*  env     = enif_alloc_env();
  //ERL_NIF_TERM device =   enif_make_int(env, handle->device);
  handle->threaded = 1;
  while (handle->threaded)
    {
      int status;
      ERL_NIF_TERM msg = _receive_can_messages(env, handle, handle->chunk_size, handle->timeout);
      if (!enif_get_int(env, msg, &status))
        {
          enif_send(env, &handle->receiver, env, enif_make_tuple3(env, can_atom, handle->devpath_bin, msg));
          enif_clear_env(env);
        }
      else if (status == 0)
        {
          enif_clear_env(env);
        }
      else break;
    }
  enif_free_env(env);
  return 0;
}
Esempio n. 3
0
static ERL_NIF_TERM send_list_seq(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
    ErlNifPid to;
    ERL_NIF_TERM msg;
    ErlNifEnv* msg_env;
    int i, res;
    
    if (!enif_get_int(env, argv[0], &i)) {
	return enif_make_badarg(env);
    }
    if (argv[1] == atom_self) {
	enif_self(env, &to);
    }
    else if (!enif_get_local_pid(env, argv[1], &to)) {
	return enif_make_badarg(env);
    }
    msg_env = enif_alloc_env();
    msg = enif_make_list(msg_env,0);
    for ( ; i>0 ; i--) {
	msg = enif_make_list_cell(msg_env, enif_make_int(msg_env, i), msg);
    }
    res = enif_send(env, &to, msg_env, msg);
    enif_free_env(msg_env);
    return enif_make_tuple2(env, atom_ok, enif_make_int(env,res));
}
Esempio n. 4
0
static struct zdoor_result *
zdoor_cb(struct zdoor_cookie *cookie, char *argp, size_t argp_sz)
{
	struct door *d;
	struct req *r;
	ErlNifEnv *env = enif_alloc_env();

	/* we kept the struct door in the biscuit */
	d = (struct door *)cookie->zdc_biscuit;

	/* this request */
	r = req_alloc();

	/* take the rlist lock first, then the req lock */
	enif_rwlock_rwlock(d->rlock);
	enif_mutex_lock(r->lock);

	req_insert(d, r);

	enif_rwlock_rwunlock(d->rlock);

	/* make the request into a binary term to put it into enif_send() */
	ErlNifBinary bin;
	enif_alloc_binary(argp_sz, &bin);
	memcpy(bin.data, argp, argp_sz);
	ERL_NIF_TERM binTerm = enif_make_binary(env, &bin);

	/* send a message back to the session owner */
	enif_send(NULL, &d->owner, env,
		enif_make_tuple3(env,
			enif_make_atom(env, "zdoor"),
			enif_make_resource(env, r),
			binTerm));

	/* now wait until the request has been replied to */
	enif_cond_wait(r->cond, r->lock);

	/* convert the reply into a zdoor_result */
	/* we have to use naked malloc() since libzdoor will use free() */
	struct zdoor_result *res = malloc(sizeof(struct zdoor_result));
	res->zdr_size = r->replen;
	res->zdr_data = r->rep;

	r->rep = NULL;
	r->replen = 0;

	/* yes, we have to unlock and re-lock to avoid lock inversion here */
	enif_mutex_unlock(r->lock);

	/* remove and free the struct req */
	enif_rwlock_rwlock(d->rlock);
	enif_mutex_lock(r->lock);
	req_remove(d, r);
	enif_rwlock_rwunlock(d->rlock);
	req_free(r);

	enif_free_env(env);

	return res;
}
Esempio n. 5
0
static void
layer_destroy(ErlNifEnv *env, void *obj)
{
    // Layer is owned by OGRDataSource, should not be deleted
    EnvLayer_t **layer = (EnvLayer_t**)obj;
    enif_free_env((**layer).env);
    enif_free(*layer);
}
Esempio n. 6
0
void
job_destroy(void* obj)
{
    job_ptr job = (job_ptr) obj;
    if(job->script.data != NULL) enif_release_binary(&job->script);
    if(job->env != NULL) enif_free_env(job->env);
    enif_free(job);
}
Esempio n. 7
0
static void
feature_destroy(ErlNifEnv *env, void *obj)
{
    // Feature is owned by the caller
    EnvFeature_t **feature = (EnvFeature_t**)obj;
    OGR_F_Destroy((**feature).obj);
    enif_free_env((**feature).env);
    enif_free(*feature);
}
Esempio n. 8
0
static void
field_defn_destroy(ErlNifEnv *env, void *obj)
{
    // OGRFieldDefn should not be freed by the application
    EnvFieldDefn_t **field_defn = (EnvFieldDefn_t**)obj;
    //OGR_Fld_Destroy(*field_defn);
    enif_free_env((**field_defn).env);
    enif_free(*field_defn);
}
Esempio n. 9
0
static void msgenv_dtor(ErlNifEnv* env, void* obj)
{
    struct make_term_info* mti = (struct make_term_info*) obj;
    if (mti->dst_env != NULL) {
	enif_free_env(mti->dst_env);
    }
    enif_mutex_destroy(mti->mtx);
    enif_cond_destroy(mti->cond);
}
Esempio n. 10
0
static void
command_destroy(void *obj) 
{
    esqlite_command *cmd = (esqlite_command *) obj;

    if(cmd->env != NULL) 
	   enif_free_env(cmd->env);

    enif_free(cmd);
}
Esempio n. 11
0
static void
feature_defn_destroy(ErlNifEnv *env, void *obj)
{
    // OGRFeatureDefn is owned by the OGRLayer,
    // and should not be modified or freed by the application
    EnvFeatureDefn_t **feature_defn = (EnvFeatureDefn_t**)obj;
    //OGR_FD_Destroy((**feature_defn).obj);
    enif_free_env((**feature_defn).env);
    enif_free(*feature_defn);
}
Esempio n. 12
0
void
cleanup_task(task_t **task)
{
    if ((*task)->env != NULL) {
        enif_free_env((*task)->env);
    }

    enif_free(*task);
    *task = NULL;
}
Esempio n. 13
0
static void
release_ecsv_parser(UNUSED(ErlNifEnv * env), void *obj)
{
    //enif_fprintf(stderr, "Releasing parser resource\n");
    ecsv_parser_t *parser = (ecsv_parser_t *)obj;
    enif_free_env(parser->env);
    if (parser->current_line.fields) enif_free(parser->current_line.fields);
    csv_free(&parser->p);
    //enif_fprintf(stderr, "Released parser resource\n");
}
Esempio n. 14
0
File: elua.c Progetto: indie21/elua
void msg_destroy(void *obj)
{
    msg_t *msg = (msg_t *) obj;

    if(msg->env != NULL){
        // fix
        enif_free_env(msg->env);
    }
    enif_free(msg);
}
Esempio n. 15
0
void
ewpcap_cleanup(ErlNifEnv *env, void *obj)
{
    EWPCAP_STATE *ep = obj;

    if (ep->p == NULL)
        return;

    pcap_breakloop(ep->p);
    pcap_close(ep->p);

    if (ep->env)
        enif_free_env(ep->env);

    if (ep->term_env)
        enif_free_env(ep->term_env);

    (void)memset(ep, 0, sizeof(EWPCAP_STATE));
}
Esempio n. 16
0
static void DestroyCall(ErlCall *erlCall) {
  enif_mutex_lock(callsMutex);

  HASH_DEL(calls, erlCall);
  enif_clear_env(erlCall->env);
  enif_free_env(erlCall->env);
  enif_mutex_destroy(erlCall->mutex);
  enif_cond_destroy(erlCall->cond);
  free(erlCall);

  enif_mutex_unlock(callsMutex);
}
Esempio n. 17
0
void* nif_main_thread(void* obj)
{
	ErlNifEnv* env = enif_alloc_env();
	nif_thread_state* st = (nif_thread_state*)obj;
	nif_thread_message* msg;

	while (nif_thread_receive(st, &msg))
		nif_thread_handle(env, st, msg);

	enif_free_env(env);

	return NULL;
}
Esempio n. 18
0
static void
geometry_destroy(ErlNifEnv *env, void *obj)
{
    // If env is NULL then is GeometryRef else is Geometry
    // GeometryRef should not be freed by the application
    EnvGeometry_t **geometry = (EnvGeometry_t**)obj;
    if ((**geometry).env == NULL) {
        OGR_G_DestroyGeometry((**geometry).obj);
    } else {
        enif_free_env((**geometry).env);
    }
    enif_free(*geometry);
}
Esempio n. 19
0
static ERL_NIF_TERM send_term(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
    ErlNifEnv* menv;
    ErlNifPid pid;
    int ret;
    if (!enif_get_local_pid(env, argv[0], &pid)) {
	return enif_make_badarg(env);
    }
    menv = enif_alloc_env();
    ret = enif_send(env, &pid, menv, enif_make_copy(menv, argv[1]));
    enif_free_env(menv);
    return enif_make_int(env, ret);
}
Esempio n. 20
0
static nif_term_t
salt_enqueue_req(nif_heap_t *hp, struct salt_pcb *sc, nif_pid_t pid, nif_term_t ref, uint_t type, uint_t aux)
{
	struct salt_msg 	*sm;
	const char 		*err;

	/* Prepare async request for worker thread. */
	sm = enif_alloc(sizeof(*sm));
	if (sm == NULL)
		return (BADARG);

	sm->msg_heap = enif_alloc_env();
	assert(sm->msg_heap != NULL);

	sm->msg_next = NULL;
	sm->msg_from = pid; /* struct copy */
	sm->msg_mref = enif_make_copy(sm->msg_heap, ref);
	sm->msg_type = type;
	sm->msg_aux = aux;

	/* Enqueue request checking for failure scenarios. */
	enif_mutex_lock(sc->sc_lock);

	if (sc->sc_req_npend >= 128) {
		err = "congested";
		goto fail;
	}
	if (sc->sc_exit_flag) {
		/* XXX This should not even be possible, no? */
		err = "exiting";
		goto fail;
	}
	*sc->sc_req_lastp = sm;
	sc->sc_req_lastp = &sm->msg_next;
	sc->sc_req_npend += 1;

	enif_cond_signal(sc->sc_cond);
	enif_mutex_unlock(sc->sc_lock);

	return (enif_make_atom(hp, "enqueued"));

	/* Failure treatment. */
 fail:
	enif_mutex_unlock(sc->sc_lock);
	enif_free_env(sm->msg_heap);
	enif_free(sm);

	return (enif_make_atom(hp, err));
}
Esempio n. 21
0
static int lua_ref_gc (lua_State *lua)
{
	const int top = lua_gettop(lua);

	const erlref_ptr erlref = (erlref_ptr) luaL_checkudata(lua, 1, TYPE_ERL_REF);
	luaL_argcheck( lua, erlref, 1, "lua reference expected");

	assert(NULL != erlref->env);
	enif_free_env(erlref->env);
	node_free(erlref);

	assert(lua_gettop(lua) == top);

	return 0;
}
Esempio n. 22
0
void nif_write(couchfile_modify_request *rq, couchfile_pointer_info *dst, nif_writerq* wrq, ssize_t size)
{
    dst->writerq_resource = wrq;
    dst->pointer = 0;
    wrq->ptr = dst;

    ErlNifEnv* msg_env = enif_alloc_env();
    ERL_NIF_TERM msg_term = enif_make_tuple4(msg_env,
            get_atom(msg_env, "append_bin_btnif"),
            get_atom(msg_env, "snappy"), //COMPRESSION TYPE
            enif_make_resource(msg_env, wrq),
            enif_make_resource_binary(msg_env, wrq, &wrq->buf, size));
    enif_send(rq->caller_env, &rq->writer, msg_env, msg_term);
    enif_free_env(msg_env);
    enif_release_resource(wrq);
}
Esempio n. 23
0
static ERL_NIF_TERM send_new_blob(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
    ErlNifPid to;
    ERL_NIF_TERM msg, copy;
    ErlNifEnv* msg_env;
    int res;
    
    if (!enif_get_local_pid(env, argv[0], &to)) {
	return enif_make_badarg(env);
    }
    msg_env = enif_alloc_env();
    msg = make_blob(env,msg_env, argv[1]);
    copy = make_blob(env,env, argv[1]);
    res = enif_send(env, &to, msg_env, msg);
    enif_free_env(msg_env);
    return enif_make_tuple3(env, atom_ok, enif_make_int(env,res), copy);
}
Esempio n. 24
0
void queue_destroy(queue *q)
{
	int i;
	qitem *buf = (qitem*)(q->buf + q->mapbytes*2);

	#ifndef _TESTAPP_
	for (i = 0; i < q->npages; i++)
	{
		if (buf[i].env != NULL)
			enif_free_env(buf[i].env);
		if (buf[i].cmd != NULL)
			enif_free(buf[i].cmd);
	}
	#endif
	free(q->buf);
	free(q);
}
Esempio n. 25
0
void
queue_destroy(queue *queue)
{
    ErlNifMutex *lock;
    ErlNifCond *cond;
    int length;
    qitem *blocks = NULL;

    enif_mutex_lock(queue->lock);
    lock = queue->lock;
    cond = queue->cond;
    length = queue->length;

    queue->lock = NULL;
    queue->cond = NULL;
    queue->head = NULL;
    queue->tail = NULL;
    queue->length = -1;
    while(queue->reuseq != NULL)
    {
        qitem *tmp = queue->reuseq->next;
        if(tmp != NULL && tmp->env != NULL)
            enif_free_env(tmp->env);
        if (tmp != NULL && tmp->cmd != NULL)
            enif_free(tmp->cmd);
        if (queue->reuseq->blockStart)
        {
            queue->reuseq->next = blocks;
            blocks = queue->reuseq;
        }
        queue->reuseq = tmp;
    }
    while (blocks != NULL)
    {
        qitem *tmp = blocks->next;
        enif_free(blocks);
        blocks = tmp;
    }
    enif_mutex_unlock(lock);

    assert(length == 0 && "Attempting to destroy a non-empty queue.");
    enif_cond_destroy(cond);
    enif_mutex_destroy(lock);
    enif_free(queue);
}
Esempio n. 26
0
static void *
salt_worker_loop(void *arg)
{
	struct salt_pcb 	*sc = arg;
	struct salt_msg 	*sm;
	struct salt_msg 	*tmp;

	/* XXX initialization of libsodium */
	/* XXX send readiness indication to owner */

	/* Pick up next batch of work, react promptly to termination requests. */
 loop:
	enif_mutex_lock(sc->sc_lock);
 wait:
	if (sc->sc_exit_flag) {
		enif_mutex_unlock(sc->sc_lock);
		return (NULL);
	}
	if (sc->sc_req_first == NULL) {
		enif_cond_wait(sc->sc_cond, sc->sc_lock);
		goto wait;
	}

	sm = sc->sc_req_first;
	sc->sc_req_first = NULL;
	sc->sc_req_lastp = &sc->sc_req_first;
	sc->sc_req_npend = 0;
	
	enif_mutex_unlock(sc->sc_lock);

	/* Handle all requests, release when done. */
 next:
	salt_handle_req(sc, sm);
	tmp = sm->msg_next;
	
	enif_free_env(sm->msg_heap);
	enif_free(sm);

	if (tmp == NULL)
		goto loop;

	sm = tmp;
	goto next;
}
Esempio n. 27
0
void queue_intq_destroy(intq *q)
{
	qitem *it;
	if (q == NULL)
		return;
	while ((it = qpop(q)))
	{
		#ifndef _TESTAPP_
		if (it->env)
			enif_free_env(it->env);
		#endif
		if (it->blockStart)
			free(it);
	}
	if (q->head)
	{
		if (q->head->blockStart)
			free(q->head);
	}
	free(q);
}
Esempio n. 28
0
File: elua.c Progetto: indie21/elua
static msg_t *msg_create() {
    ErlNifEnv *env;
    msg_t *msg;

    env = enif_alloc_env();
    if(env == NULL) {
        return NULL;
    }

    msg = (msg_t *) enif_alloc(sizeof(msg_t));
    if(msg == NULL) {
        enif_free_env(env);
        return NULL;
    }

    msg->env =  env;
    msg->type = msg_unknown;
    msg->ref = 0;

    return msg;
}
Esempio n. 29
0
job_ptr
job_create()
{
    job_ptr ret = (job_ptr) enif_alloc(sizeof(struct job_t));
    if(ret == NULL) return NULL;

    ret->type = job_unknown;
    ret->env = enif_alloc_env();
    if(ret->env == NULL) goto error;

    ret->ref = 0;
    ret->script.data = NULL;
    ret->script.size = 0;
    ret->error = 0;

    return ret;

error:
    if(ret->env != NULL) enif_free_env(ret->env);
    enif_free(ret);
    return NULL;
}
Esempio n. 30
0
static ERL_NIF_TERM
send(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
    ErlNifEnv* cp_env = enif_alloc_env();
    ErlNifPid dst;
    ERL_NIF_TERM msg;
    ERL_NIF_TERM ret;
    
    if(argc == 1) {
        if(!enif_self(env, &dst)) {
            ret = enif_make_badarg(env);
            goto done;
        }
        msg = argv[0];
    } else if(argc == 2) {
        if(!enif_get_local_pid(env, argv[0], &dst)) {
            ret = enif_make_badarg(env);
            goto done;
        }
        msg = argv[1];
    } else {
        ret = enif_make_badarg(env);
        goto done;
    }

    msg = enif_make_copy(cp_env, msg);

    if(!enif_send(env, &dst, cp_env, msg)) {
        ret = enif_make_badarg(env);
        goto done;
    }
    
    ret = enif_make_atom(env, "ok");

done:
    enif_free_env(cp_env);
    return ret;
}