/*
|
|
* etsq.h
|
|
*
|
|
* Created on: Mar 21, 2016
|
|
* Author: Vinod
|
|
*/
|
|
|
|
#ifndef ETSQ_H_
|
|
#define ETSQ_H_
|
|
|
|
#include <iostream> // std::cin, std::cout
|
|
#include <map> // std::map
|
|
#include <queue> // std::queue
|
|
#include <string.h>
|
|
#include "erl_nif.h"
|
|
|
|
#define enif_make_error(env, error) enif_make_tuple2(env, \
|
|
enif_make_atom(env, "error"), enif_make_atom(env, error))
|
|
|
|
struct cmp_str
|
|
{
|
|
bool operator()(char *a, char *b) const
|
|
{
|
|
return strcmp(a, b) < 0;
|
|
}
|
|
};
|
|
|
|
class ErlTerm
|
|
{
|
|
public:
|
|
ErlNifEnv *term_env;
|
|
ERL_NIF_TERM term;
|
|
public:
|
|
ErlTerm(ERL_NIF_TERM erl_nif_term)
|
|
{
|
|
term_env = enif_alloc_env();
|
|
this->term = enif_make_copy(term_env, erl_nif_term);
|
|
}
|
|
ErlTerm(ErlTerm *erl_term)
|
|
{
|
|
term_env = enif_alloc_env();
|
|
this->term = enif_make_copy(term_env, erl_term->term);
|
|
}
|
|
ErlTerm(int value)
|
|
{
|
|
term_env = enif_alloc_env();
|
|
this->term = enif_make_int(term_env, value);
|
|
}
|
|
ErlTerm(const char *error)
|
|
{
|
|
term_env = enif_alloc_env();
|
|
this->term = enif_make_error(term_env, error);
|
|
}
|
|
~ErlTerm()
|
|
{
|
|
enif_free_env(term_env);
|
|
term_env = NULL;
|
|
}
|
|
};
|
|
|
|
typedef std::queue<ErlTerm*> ErlQueue;
|
|
|
|
class QueueInfo
|
|
{
|
|
public:
|
|
ErlNifMutex* pmutex;
|
|
ErlQueue queue;
|
|
public:
|
|
QueueInfo(char* name)
|
|
{
|
|
pmutex = enif_mutex_create(name);
|
|
}
|
|
~QueueInfo()
|
|
{
|
|
enif_mutex_destroy(pmutex);
|
|
}
|
|
};
|
|
|
|
typedef std::map<char *, QueueInfo*, cmp_str> QInfoMap;
|
|
typedef std::pair<char *, QueueInfo*> QInfoMapPair;
|
|
|
|
// Class to handle Read lock
|
|
class ReadLock
|
|
{
|
|
ErlNifRWLock *pread_lock;
|
|
public:
|
|
ReadLock(ErlNifRWLock *pread_lock)
|
|
{
|
|
this->pread_lock = pread_lock;
|
|
enif_rwlock_rlock(this->pread_lock);
|
|
};
|
|
~ReadLock()
|
|
{
|
|
enif_rwlock_runlock(pread_lock);
|
|
};
|
|
};
|
|
|
|
// Class to handle Write lock
|
|
class WriteLock
|
|
{
|
|
ErlNifRWLock *pwrite_lock;
|
|
public:
|
|
WriteLock(ErlNifRWLock *pwrite_lock)
|
|
{
|
|
this->pwrite_lock = pwrite_lock;
|
|
enif_rwlock_rwlock(this->pwrite_lock);
|
|
};
|
|
~WriteLock()
|
|
{
|
|
enif_rwlock_rwunlock(pwrite_lock);
|
|
};
|
|
};
|
|
|
|
// Class to handle Mutex lock and unlock
|
|
class Mutex
|
|
{
|
|
ErlNifMutex *pmtx;
|
|
public:
|
|
Mutex(ErlNifMutex *pmtx)
|
|
{
|
|
this->pmtx = pmtx;
|
|
enif_mutex_lock(this->pmtx);
|
|
};
|
|
~Mutex()
|
|
{
|
|
enif_mutex_unlock(pmtx);
|
|
};
|
|
};
|
|
|
|
#endif /* ETSQ_H_ */
|