mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-11 10:08:41 +00:00
Bug 391915: Don't use atoms from nsCacheMetaData because atoms aren't threadsafe. r+sr=biesi, a=blocking1.9
This commit is contained in:
parent
27877b11ea
commit
c284e81edc
32
netwerk/cache/src/nsCacheMetaData.cpp
vendored
32
netwerk/cache/src/nsCacheMetaData.cpp
vendored
@ -67,11 +67,9 @@ nsCacheMetaData::GetElement(const char * key)
|
|||||||
// We assume the number of meta data elements will be very small, so
|
// We assume the number of meta data elements will be very small, so
|
||||||
// we keep it real simple. Singly-linked list, linearly searched.
|
// we keep it real simple. Singly-linked list, linearly searched.
|
||||||
|
|
||||||
nsCOMPtr<nsIAtom> keyAtom = do_GetAtom(key);
|
|
||||||
|
|
||||||
MetaElement * elem = mData;
|
MetaElement * elem = mData;
|
||||||
while (elem) {
|
while (elem) {
|
||||||
if (elem->mKey == keyAtom)
|
if (elem->mKey.EqualsASCII(key))
|
||||||
return elem->mValue;
|
return elem->mValue;
|
||||||
elem = elem->mNext;
|
elem = elem->mNext;
|
||||||
}
|
}
|
||||||
@ -83,17 +81,13 @@ nsresult
|
|||||||
nsCacheMetaData::SetElement(const char * key,
|
nsCacheMetaData::SetElement(const char * key,
|
||||||
const char * value)
|
const char * value)
|
||||||
{
|
{
|
||||||
nsCOMPtr<nsIAtom> keyAtom = do_GetAtom(key);
|
|
||||||
if (!keyAtom)
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
|
|
||||||
PRUint32 keySize = strlen(key);
|
PRUint32 keySize = strlen(key);
|
||||||
PRUint32 valueSize = value ? strlen(value) : 0;
|
PRUint32 valueSize = value ? strlen(value) : 0;
|
||||||
|
|
||||||
// find and remove or update old meta data element
|
// find and remove or update old meta data element
|
||||||
MetaElement * elem = mData, * last = nsnull;
|
MetaElement * elem = mData, * last = nsnull;
|
||||||
while (elem) {
|
while (elem) {
|
||||||
if (elem->mKey == keyAtom) {
|
if (elem->mKey.Equals(key)) {
|
||||||
// Get length of old value
|
// Get length of old value
|
||||||
PRUint32 oldValueLen = strlen(elem->mValue);
|
PRUint32 oldValueLen = strlen(elem->mValue);
|
||||||
if (valueSize == oldValueLen) {
|
if (valueSize == oldValueLen) {
|
||||||
@ -120,7 +114,7 @@ nsCacheMetaData::SetElement(const char * key,
|
|||||||
elem = new (value, valueSize) MetaElement;
|
elem = new (value, valueSize) MetaElement;
|
||||||
if (!elem)
|
if (!elem)
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
elem->mKey = keyAtom;
|
elem->mKey.Assign(key);
|
||||||
|
|
||||||
// insert after last or as first element...
|
// insert after last or as first element...
|
||||||
if (last) {
|
if (last) {
|
||||||
@ -142,8 +136,6 @@ nsCacheMetaData::SetElement(const char * key,
|
|||||||
nsresult
|
nsresult
|
||||||
nsCacheMetaData::FlattenMetaData(char * buffer, PRUint32 bufSize)
|
nsCacheMetaData::FlattenMetaData(char * buffer, PRUint32 bufSize)
|
||||||
{
|
{
|
||||||
const char *key;
|
|
||||||
|
|
||||||
if (mMetaSize > bufSize) {
|
if (mMetaSize > bufSize) {
|
||||||
NS_ERROR("buffer size too small for meta data.");
|
NS_ERROR("buffer size too small for meta data.");
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
@ -151,10 +143,8 @@ nsCacheMetaData::FlattenMetaData(char * buffer, PRUint32 bufSize)
|
|||||||
|
|
||||||
MetaElement * elem = mData;
|
MetaElement * elem = mData;
|
||||||
while (elem) {
|
while (elem) {
|
||||||
elem->mKey->GetUTF8String(&key);
|
PRUint32 keySize = 1 + elem->mKey.Length();
|
||||||
|
memcpy(buffer, elem->mKey.get(), keySize);
|
||||||
PRUint32 keySize = 1 + strlen(key);
|
|
||||||
memcpy(buffer, key, keySize);
|
|
||||||
buffer += keySize;
|
buffer += keySize;
|
||||||
|
|
||||||
PRUint32 valSize = 1 + strlen(elem->mValue);
|
PRUint32 valSize = 1 + strlen(elem->mValue);
|
||||||
@ -179,15 +169,11 @@ nsCacheMetaData::UnflattenMetaData(const char * data, PRUint32 size)
|
|||||||
PRUint32 keySize = strlen(key);
|
PRUint32 keySize = strlen(key);
|
||||||
data += 1 + keySize;
|
data += 1 + keySize;
|
||||||
if (data < limit) {
|
if (data < limit) {
|
||||||
nsCOMPtr<nsIAtom> keyAtom = do_GetAtom(key);
|
|
||||||
if (!keyAtom)
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
|
||||||
|
|
||||||
PRUint32 valueSize = strlen(data);
|
PRUint32 valueSize = strlen(data);
|
||||||
MetaElement *elem = new (data, valueSize) MetaElement;
|
MetaElement *elem = new (data, valueSize) MetaElement;
|
||||||
if (!elem)
|
if (!elem)
|
||||||
return NS_ERROR_OUT_OF_MEMORY;
|
return NS_ERROR_OUT_OF_MEMORY;
|
||||||
elem->mKey = keyAtom;
|
elem->mKey.Assign(key);
|
||||||
|
|
||||||
// insert after last or as first element...
|
// insert after last or as first element...
|
||||||
if (last) {
|
if (last) {
|
||||||
@ -212,14 +198,10 @@ nsCacheMetaData::UnflattenMetaData(const char * data, PRUint32 size)
|
|||||||
nsresult
|
nsresult
|
||||||
nsCacheMetaData::VisitElements(nsICacheMetaDataVisitor * visitor)
|
nsCacheMetaData::VisitElements(nsICacheMetaDataVisitor * visitor)
|
||||||
{
|
{
|
||||||
const char *key;
|
|
||||||
|
|
||||||
MetaElement * elem = mData;
|
MetaElement * elem = mData;
|
||||||
while (elem) {
|
while (elem) {
|
||||||
elem->mKey->GetUTF8String(&key);
|
|
||||||
|
|
||||||
PRBool keepGoing;
|
PRBool keepGoing;
|
||||||
nsresult rv = visitor->VisitMetaDataElement(key, elem->mValue, &keepGoing);
|
nsresult rv = visitor->VisitMetaDataElement(elem->mKey.get(), elem->mValue, &keepGoing);
|
||||||
|
|
||||||
if (NS_FAILED(rv) || !keepGoing)
|
if (NS_FAILED(rv) || !keepGoing)
|
||||||
break;
|
break;
|
||||||
|
4
netwerk/cache/src/nsCacheMetaData.h
vendored
4
netwerk/cache/src/nsCacheMetaData.h
vendored
@ -44,7 +44,7 @@
|
|||||||
#include "nspr.h"
|
#include "nspr.h"
|
||||||
#include "pldhash.h"
|
#include "pldhash.h"
|
||||||
#include "nscore.h"
|
#include "nscore.h"
|
||||||
#include "nsIAtom.h"
|
#include "nsString.h"
|
||||||
|
|
||||||
class nsICacheMetaDataVisitor;
|
class nsICacheMetaDataVisitor;
|
||||||
|
|
||||||
@ -74,7 +74,7 @@ private:
|
|||||||
struct MetaElement
|
struct MetaElement
|
||||||
{
|
{
|
||||||
struct MetaElement * mNext;
|
struct MetaElement * mNext;
|
||||||
nsCOMPtr<nsIAtom> mKey;
|
nsCString mKey;
|
||||||
char mValue[1]; // actually, bigger than 1
|
char mValue[1]; // actually, bigger than 1
|
||||||
|
|
||||||
// MetaElement and mValue are allocated together via:
|
// MetaElement and mValue are allocated together via:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user