Thread safety implemented for registerPacker and registerUnpacker
This commit is contained in:
1 parent
dd24abd0b7
commit
e7c6afcd49
5 files changed
+34
-13
No files matched your search
@@ -21,6 +21,7 @@ MsgPackPrivate::type_parser_f MsgPackPrivate::unpackers[32] = {
|
||||
};
|
||||
|
||||
QHash<qint8, MsgPack::unpack_user_f> MsgPackPrivate::user_unpackers;
|
||||
QReadWriteLock MsgPackPrivate::unpackers_lock;
|
||||
|
||||
QVariant MsgPackPrivate::unpack(quint8 *p, quint8 *end)
|
||||
{
|
||||
@@ -314,12 +315,14 @@ quint8 * MsgPackPrivate::unpack_map32(QVariant &v, quint8 *p)
|
||||
|
||||
quint8 *MsgPackPrivate::unpack_ext(QVariant &v, quint8 *p, qint8 type, quint32 len)
|
||||
{
|
||||
unpackers_lock.lockForRead();
|
||||
if (!user_unpackers.contains(type)) {
|
||||
qWarning() << "MsgPack::unpack() unpacker for type" << type << "doesn't exist";
|
||||
return p + len;
|
||||
}
|
||||
QByteArray data((char *)p, len);
|
||||
v = user_unpackers[type](data);
|
||||
unpackers_lock.unlock();
|
||||
return p + len;
|
||||
}
|
||||
|
||||
@@ -382,14 +385,17 @@ quint8 * MsgPackPrivate::unpack_ext32(QVariant &v, quint8 *p)
|
||||
|
||||
bool MsgPackPrivate::register_unpacker(qint8 msgpack_type, MsgPack::unpack_user_f unpacker)
|
||||
{
|
||||
if (user_unpackers.contains(msgpack_type)) {
|
||||
qWarning() << "MsgPack::unpacker for type" << msgpack_type << "already exists";
|
||||
return false;
|
||||
}
|
||||
if (unpacker == 0) {
|
||||
qWarning() << "MsgPack::unpacker for type" << msgpack_type << "is invalid";
|
||||
return false;
|
||||
}
|
||||
unpackers_lock.lockForWrite();
|
||||
if (user_unpackers.contains(msgpack_type)) {
|
||||
qWarning() << "MsgPack::unpacker for type" << msgpack_type << "already exists";
|
||||
unpackers_lock.unlock();
|
||||
return false;
|
||||
}
|
||||
user_unpackers.insert(msgpack_type, unpacker);
|
||||
unpackers_lock.unlock();
|
||||
return true;
|
||||
}
|
||||
Reference in new issue
Block a user