Fix GlobalHandle bug. Add rebuild method to ZmqMsg.
This commit is contained in:
@@ -48,16 +48,18 @@ int zmq_ctx_get(intptr_t context,int option);
|
||||
//| and in a manner not easily recognized by humans, for example: |
|
||||
//| "__3kewducdxhkd__" |
|
||||
//+------------------------------------------------------------------+
|
||||
class Context: public GlobalHandle<intptr_t>
|
||||
class Context: public GlobalHandle<intptr_t,Context>
|
||||
{
|
||||
protected:
|
||||
int get(int option) {return zmq_ctx_get(m_ref,option);}
|
||||
bool set(int option,int optval) {return 0==zmq_ctx_set(m_ref,option,optval);}
|
||||
|
||||
intptr_t create() override {return zmq_ctx_new();}
|
||||
void destroy(intptr_t handle) override {if(0!=zmq_ctx_term(handle)) {Debug("failed to terminate context");}}
|
||||
public:
|
||||
Context(string shared=NULL):GlobalHandle<intptr_t>(shared) {}
|
||||
|
||||
static intptr_t create() {return zmq_ctx_new();}
|
||||
static void destroy(intptr_t handle) {if(0!=zmq_ctx_term(handle)) {Debug("failed to terminate context");}}
|
||||
|
||||
Context(string shared=NULL):GlobalHandle<intptr_t,Context>(shared) {}
|
||||
|
||||
bool shutdown() {return 0==zmq_ctx_shutdown(m_ref);}
|
||||
|
||||
|
||||
@@ -55,14 +55,15 @@ public:
|
||||
bool isValid() const {return m_name!=NULL;}
|
||||
string getName() const {return m_name;}
|
||||
|
||||
void enter() { while(!GlobalVariable::makeTemp(m_name))Sleep(100); }
|
||||
void enter() { while(!GlobalVariable::makeTemp(m_name) && !IsStopped())Sleep(100); }
|
||||
bool tryEnter() { return GlobalVariable::makeTemp(m_name); }
|
||||
void leave() { GlobalVariable::remove(m_name);}
|
||||
};
|
||||
//+------------------------------------------------------------------+
|
||||
//| A reference counted global pointer (or handle) |
|
||||
//| HandleManager should implement 2 static methods: create & destroy|
|
||||
//+------------------------------------------------------------------+
|
||||
template<typename T>
|
||||
template<typename T,typename HandleManager>
|
||||
class GlobalHandle
|
||||
{
|
||||
private:
|
||||
@@ -76,7 +77,7 @@ public:
|
||||
{
|
||||
m_refName=m_cs.getName()+"_Ref";
|
||||
m_counterName=m_cs.getName()+"_Count";
|
||||
if(!m_cs.isValid()) m_ref=create();
|
||||
if(!m_cs.isValid()) m_ref=HandleManager::create();
|
||||
else
|
||||
{
|
||||
m_cs.enter();
|
||||
@@ -87,7 +88,7 @@ public:
|
||||
}
|
||||
if(long(GlobalVariable::get(m_counterName))==0)
|
||||
{
|
||||
m_ref=create();
|
||||
m_ref=HandleManager::create();
|
||||
if(!GlobalVariable::exists(m_refName))
|
||||
{
|
||||
GlobalVariable::makeTemp(m_refName);
|
||||
@@ -104,12 +105,12 @@ public:
|
||||
}
|
||||
~GlobalHandle()
|
||||
{
|
||||
if(!m_cs.isValid()) {destroy(m_ref); return;}
|
||||
if(!m_cs.isValid()) {HandleManager::destroy(m_ref); return;}
|
||||
m_cs.enter();
|
||||
GlobalVariable::set(m_counterName,GlobalVariable::get(m_counterName)-1);
|
||||
if(long(GlobalVariable::get(m_counterName))==0)
|
||||
{
|
||||
destroy(m_ref);
|
||||
HandleManager::destroy(m_ref);
|
||||
GlobalVariable::remove(m_refName);
|
||||
GlobalVariable::remove(m_counterName);
|
||||
}
|
||||
@@ -117,9 +118,5 @@ public:
|
||||
}
|
||||
|
||||
T ref() const {return m_ref;}
|
||||
|
||||
protected:
|
||||
virtual T create()=NULL;
|
||||
virtual void destroy(T handle)=NULL;
|
||||
};
|
||||
//+------------------------------------------------------------------+
|
||||
|
||||
+22
-5
@@ -49,12 +49,29 @@ protected:
|
||||
int get(int property) {return zmq_msg_get(this,property);}
|
||||
bool set(int property,int value) {return 0==zmq_msg_set(this,property,value);}
|
||||
intptr_t data() {return zmq_msg_data(this);}
|
||||
bool setStringData(string data,bool nullterminated=false);
|
||||
public:
|
||||
ZmqMsg() {zmq_msg_init(this);}
|
||||
ZmqMsg(int size) {if(0!=zmq_msg_init_size(this,size)){Debug("Failed to init size msg: insufficient space");}}
|
||||
ZmqMsg(string data,bool nullterminated=false);
|
||||
ZmqMsg(string data,bool nullterminated=false) {setStringData(data,nullterminated);}
|
||||
~ZmqMsg() {if(0!=zmq_msg_close(this)){Debug("Failed to close msg");}}
|
||||
|
||||
bool rebuild()
|
||||
{
|
||||
if(0!=zmq_msg_close(this)){Debug("Failed to close msg");return false;}
|
||||
return 0==zmq_msg_init(this);
|
||||
}
|
||||
bool rebuild(int size)
|
||||
{
|
||||
if(0!=zmq_msg_close(this)){Debug("Failed to close msg");return false;}
|
||||
return 0==zmq_msg_init_size(this,size);
|
||||
}
|
||||
bool rebuild(string data,bool nullterminated=false)
|
||||
{
|
||||
if(0!=zmq_msg_close(this)){Debug("Failed to close msg");return false;}
|
||||
return setStringData(data,nullterminated);
|
||||
}
|
||||
|
||||
size_t size() {return zmq_msg_size(this);}
|
||||
|
||||
void getData(uchar &data[]);
|
||||
@@ -71,13 +88,13 @@ public:
|
||||
//+------------------------------------------------------------------+
|
||||
//| Initialize a utf-8 string message |
|
||||
//+------------------------------------------------------------------+
|
||||
ZmqMsg::ZmqMsg(string data,bool nullterminated)
|
||||
bool ZmqMsg::setStringData(string data,bool nullterminated)
|
||||
{
|
||||
uchar array[];
|
||||
StringToUtf8(data,array,nullterminated);
|
||||
int size=ArraySize(array);
|
||||
zmq_msg_init_size(this,size);
|
||||
setData(array);
|
||||
bool res=(0==zmq_msg_init_size(this,ArraySize(array)));
|
||||
if(res)setData(array);
|
||||
return res;
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| Get message data as bytes array |
|
||||
|
||||
Reference in New Issue
Block a user