Thread safety implemented for registerPacker and registerUnpacker

This commit is contained in:
Roman committed 2015-04-14 22:50:20 +03:00
1 parent dd24abd0b7
commit e7c6afcd49
5 files changed
+34 -13

No files matched your search

+10 -4
View File
@@ -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;
}