mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-06 06:22:33 +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 keep it real simple. Singly-linked list, linearly searched.
|
||||
|
||||
nsCOMPtr<nsIAtom> keyAtom = do_GetAtom(key);
|
||||
|
||||
MetaElement * elem = mData;
|
||||
while (elem) {
|
||||
if (elem->mKey == keyAtom)
|
||||
if (elem->mKey.EqualsASCII(key))
|
||||
return elem->mValue;
|
||||
elem = elem->mNext;
|
||||
}
|
||||
@ -83,17 +81,13 @@ nsresult
|
||||
nsCacheMetaData::SetElement(const char * key,
|
||||
const char * value)
|
||||
{
|
||||
nsCOMPtr<nsIAtom> keyAtom = do_GetAtom(key);
|
||||
if (!keyAtom)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
PRUint32 keySize = strlen(key);
|
||||
PRUint32 valueSize = value ? strlen(value) : 0;
|
||||
|
||||
// find and remove or update old meta data element
|
||||
MetaElement * elem = mData, * last = nsnull;
|
||||
while (elem) {
|
||||
if (elem->mKey == keyAtom) {
|
||||
if (elem->mKey.Equals(key)) {
|
||||
// Get length of old value
|
||||
PRUint32 oldValueLen = strlen(elem->mValue);
|
||||
if (valueSize == oldValueLen) {
|
||||
@ -120,7 +114,7 @@ nsCacheMetaData::SetElement(const char * key,
|
||||
elem = new (value, valueSize) MetaElement;
|
||||
if (!elem)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
elem->mKey = keyAtom;
|
||||
elem->mKey.Assign(key);
|
||||
|
||||
// insert after last or as first element...
|
||||
if (last) {
|
||||
@ -142,8 +136,6 @@ nsCacheMetaData::SetElement(const char * key,
|
||||
nsresult
|
||||
nsCacheMetaData::FlattenMetaData(char * buffer, PRUint32 bufSize)
|
||||
{
|
||||
const char *key;
|
||||
|
||||
if (mMetaSize > bufSize) {
|
||||
NS_ERROR("buffer size too small for meta data.");
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
@ -151,10 +143,8 @@ nsCacheMetaData::FlattenMetaData(char * buffer, PRUint32 bufSize)
|
||||
|
||||
MetaElement * elem = mData;
|
||||
while (elem) {
|
||||
elem->mKey->GetUTF8String(&key);
|
||||
|
||||
PRUint32 keySize = 1 + strlen(key);
|
||||
memcpy(buffer, key, keySize);
|
||||
PRUint32 keySize = 1 + elem->mKey.Length();
|
||||
memcpy(buffer, elem->mKey.get(), keySize);
|
||||
buffer += keySize;
|
||||
|
||||
PRUint32 valSize = 1 + strlen(elem->mValue);
|
||||
@ -179,15 +169,11 @@ nsCacheMetaData::UnflattenMetaData(const char * data, PRUint32 size)
|
||||
PRUint32 keySize = strlen(key);
|
||||
data += 1 + keySize;
|
||||
if (data < limit) {
|
||||
nsCOMPtr<nsIAtom> keyAtom = do_GetAtom(key);
|
||||
if (!keyAtom)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
PRUint32 valueSize = strlen(data);
|
||||
MetaElement *elem = new (data, valueSize) MetaElement;
|
||||
if (!elem)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
elem->mKey = keyAtom;
|
||||
elem->mKey.Assign(key);
|
||||
|
||||
// insert after last or as first element...
|
||||
if (last) {
|
||||
@ -212,14 +198,10 @@ nsCacheMetaData::UnflattenMetaData(const char * data, PRUint32 size)
|
||||
nsresult
|
||||
nsCacheMetaData::VisitElements(nsICacheMetaDataVisitor * visitor)
|
||||
{
|
||||
const char *key;
|
||||
|
||||
MetaElement * elem = mData;
|
||||
while (elem) {
|
||||
elem->mKey->GetUTF8String(&key);
|
||||
|
||||
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)
|
||||
break;
|
||||
|
4
netwerk/cache/src/nsCacheMetaData.h
vendored
4
netwerk/cache/src/nsCacheMetaData.h
vendored
@ -44,7 +44,7 @@
|
||||
#include "nspr.h"
|
||||
#include "pldhash.h"
|
||||
#include "nscore.h"
|
||||
#include "nsIAtom.h"
|
||||
#include "nsString.h"
|
||||
|
||||
class nsICacheMetaDataVisitor;
|
||||
|
||||
@ -74,7 +74,7 @@ private:
|
||||
struct MetaElement
|
||||
{
|
||||
struct MetaElement * mNext;
|
||||
nsCOMPtr<nsIAtom> mKey;
|
||||
nsCString mKey;
|
||||
char mValue[1]; // actually, bigger than 1
|
||||
|
||||
// MetaElement and mValue are allocated together via:
|
||||
|
Loading…
x
Reference in New Issue
Block a user