PIIODevice registration dramatically optimization
This commit is contained in:
@@ -27,7 +27,6 @@
|
||||
#define PIIODEVICE_H
|
||||
|
||||
#include "piinit.h"
|
||||
#include "picollection.h"
|
||||
#include "pitimer.h"
|
||||
#include "piqueue.h"
|
||||
|
||||
@@ -42,16 +41,26 @@ typedef bool (*ReadRetFunc)(void * , uchar * , int );
|
||||
# define REGISTER_DEVICE(class)
|
||||
|
||||
//! \relatesalso PIIODevice \brief Use this macro instead of PIOBJECT when describe your own PIIODevice
|
||||
# define PIIODEVICE(class)
|
||||
# define PIIODEVICE(class, "prefix")
|
||||
|
||||
#else
|
||||
|
||||
# define REGISTER_DEVICE(name) ADD_NEW_TO_COLLECTION_WITH_NAME(__PIIODevices__, name, __S__collection_##name##__)
|
||||
# define PIIODEVICE(name) PIOBJECT_SUBCLASS(name, PIIODevice) PIIODevice * copy() const {return new name();}
|
||||
# define REGISTER_DEVICE(name) \
|
||||
STATIC_INITIALIZER_BEGIN \
|
||||
PIIODevice::registerDevice(name::fullPathPrefixS(), []()->PIIODevice*{return new name();});\
|
||||
STATIC_INITIALIZER_END
|
||||
|
||||
# define PIIODEVICE(name, prefix) \
|
||||
PIOBJECT_SUBCLASS(name, PIIODevice) \
|
||||
PIIODevice * copy() const {return new name();} \
|
||||
public: \
|
||||
virtual const char * fullPathPrefix() const {return prefix;} \
|
||||
static const char * fullPathPrefixS() {return prefix;} \
|
||||
private:
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
class PIP_EXPORT PIIODevice: public PIThread
|
||||
{
|
||||
PIOBJECT_SUBCLASS(PIIODevice, PIThread)
|
||||
@@ -228,8 +237,10 @@ public:
|
||||
bool configure(const PIString & config_file, const PIString & section, bool parent_section = false);
|
||||
|
||||
|
||||
//! Reimplement to construct full unambiguous string prefix. \ref PIIODevice_sec7
|
||||
virtual PIString fullPathPrefix() const {return PIString();}
|
||||
//! Returns full unambiguous string prefix. \ref PIIODevice_sec7
|
||||
virtual const char * fullPathPrefix() const {return "";}
|
||||
|
||||
static const char * fullPathPrefixS() {return "";}
|
||||
|
||||
//! Returns full unambiguous string, describes this device, \a fullPathPrefix() + "://"
|
||||
PIString constructFullPath() const;
|
||||
@@ -260,6 +271,8 @@ public:
|
||||
//! Returns fullPath prefixes of all registered devices
|
||||
static PIStringList availablePrefixes();
|
||||
|
||||
static void registerDevice(const char * prefix, PIIODevice*(*fabric)());
|
||||
|
||||
|
||||
EVENT_HANDLER(bool, open);
|
||||
EVENT_HANDLER1(bool, open, const PIString &, _path);
|
||||
@@ -386,7 +399,7 @@ protected:
|
||||
//! Invoked after hard write thread stop
|
||||
virtual void threadedWriteTerminated() {;}
|
||||
|
||||
static PIIODevice * newDeviceByPrefix(const PIString & prefix);
|
||||
static PIIODevice * newDeviceByPrefix(const char * prefix);
|
||||
|
||||
void terminate();
|
||||
|
||||
@@ -408,6 +421,7 @@ private:
|
||||
void run();
|
||||
void end() {terminate();}
|
||||
static void cacheFullPath(const PIString & full_path, const PIIODevice * d);
|
||||
static PIMap<PIConstChars, PIIODevice*(*)()> & fabrics();
|
||||
|
||||
PITimer timer;
|
||||
PITimeMeasurer tm;
|
||||
|
||||
Reference in New Issue
Block a user