Skip to content
Permalink
Browse files
[Qt] Implement SharedMemory for WebKit2
https://bugs.webkit.org/show_bug.cgi?id=47345

Reviewed by Kenneth Rohde Christiansen.

Implement unimplemented functions in SharedMemoryQt.cpp.
Rename MappedMemory.h to MappedMemoryPool.h, move MappedMemoryPool.{h|cpp} from
Shared/qt to Platform/qt. Modify affected lines of WebKit2.pro.
Move MappedMemory implementation into MappedMemoryPool. Remove unnecessary
methods of MappedMemoryPool.

* Platform/SharedMemory.h: Add a handle member for Qt.
* Platform/qt/MappedMemoryPool.cpp: Copied from WebKit2/Shared/qt/MappedMemoryPool.cpp.
(WebKit::MappedMemoryPool::searchForMappedMemory):
(WebKit::MappedMemoryPool::mapMemory):
(WebKit::MappedMemoryPool::mapFile):
* Platform/qt/MappedMemoryPool.h: Copied from WebKit2/Shared/qt/MappedMemory.h.
(WebKit::MappedMemoryPool::MappedMemory::mapSize):
(WebKit::MappedMemoryPool::MappedMemory::markUsed):
(WebKit::MappedMemoryPool::MappedMemory::markFree):
(WebKit::MappedMemoryPool::MappedMemory::isFree):
(WebKit::MappedMemoryPool::MappedMemory::data):
(WebKit::MappedMemoryPool::MappedMemoryPool):
Move MappedMemory implementation into MappedMemoryPool.
* Platform/qt/SharedMemoryQt.cpp:
(WebKit::SharedMemory::Handle::Handle): Implement.
(WebKit::SharedMemory::Handle::~Handle):
(WebKit::SharedMemory::Handle::isNull): Implement.
(WebKit::SharedMemory::Handle::encode): Implement.
(WebKit::SharedMemory::Handle::decode): Implement.
(WebKit::SharedMemory::create): Implement.
(WebKit::mapProtection): Added.
(WebKit::SharedMemory::~SharedMemory): Implement.
(WebKit::SharedMemory::createHandle): Implement.
(WebKit::SharedMemory::systemPageSize): Implement.
* Shared/qt/MappedMemory.h: Removed.
* Shared/qt/MappedMemoryPool.cpp: Removed.
* Shared/qt/UpdateChunk.cpp:
(WebKit::UpdateChunk::UpdateChunk):
(WebKit::UpdateChunk::decode):
Modify to use MappedMemoryPool.
* Shared/qt/UpdateChunk.h:
* WebKit2.pro:
Modify affected lines.



Canonical link: https://commits.webkit.org/60986@main
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@70450 268f45cc-cd09-0410-ab3c-d52691b4dbfc
  • Loading branch information
zhorvath committed Oct 25, 2010
1 parent bc5eb0d commit 65110231290510b5e788e15f23b59629a6246f95
Showing 9 changed files with 279 additions and 169 deletions.
@@ -1,3 +1,50 @@
2010-10-25 Zoltan Horvath <zoltan@webkit.org>

Reviewed by Kenneth Rohde Christiansen.

[Qt] Implement SharedMemory for WebKit2
https://bugs.webkit.org/show_bug.cgi?id=47345

Implement unimplemented functions in SharedMemoryQt.cpp.
Rename MappedMemory.h to MappedMemoryPool.h, move MappedMemoryPool.{h|cpp} from
Shared/qt to Platform/qt. Modify affected lines of WebKit2.pro.
Move MappedMemory implementation into MappedMemoryPool. Remove unnecessary
methods of MappedMemoryPool.

* Platform/SharedMemory.h: Add a handle member for Qt.
* Platform/qt/MappedMemoryPool.cpp: Copied from WebKit2/Shared/qt/MappedMemoryPool.cpp.
(WebKit::MappedMemoryPool::searchForMappedMemory):
(WebKit::MappedMemoryPool::mapMemory):
(WebKit::MappedMemoryPool::mapFile):
* Platform/qt/MappedMemoryPool.h: Copied from WebKit2/Shared/qt/MappedMemory.h.
(WebKit::MappedMemoryPool::MappedMemory::mapSize):
(WebKit::MappedMemoryPool::MappedMemory::markUsed):
(WebKit::MappedMemoryPool::MappedMemory::markFree):
(WebKit::MappedMemoryPool::MappedMemory::isFree):
(WebKit::MappedMemoryPool::MappedMemory::data):
(WebKit::MappedMemoryPool::MappedMemoryPool):
Move MappedMemory implementation into MappedMemoryPool.
* Platform/qt/SharedMemoryQt.cpp:
(WebKit::SharedMemory::Handle::Handle): Implement.
(WebKit::SharedMemory::Handle::~Handle):
(WebKit::SharedMemory::Handle::isNull): Implement.
(WebKit::SharedMemory::Handle::encode): Implement.
(WebKit::SharedMemory::Handle::decode): Implement.
(WebKit::SharedMemory::create): Implement.
(WebKit::mapProtection): Added.
(WebKit::SharedMemory::~SharedMemory): Implement.
(WebKit::SharedMemory::createHandle): Implement.
(WebKit::SharedMemory::systemPageSize): Implement.
* Shared/qt/MappedMemory.h: Removed.
* Shared/qt/MappedMemoryPool.cpp: Removed.
* Shared/qt/UpdateChunk.cpp:
(WebKit::UpdateChunk::UpdateChunk):
(WebKit::UpdateChunk::decode):
Modify to use MappedMemoryPool.
* Shared/qt/UpdateChunk.h:
* WebKit2.pro:
Modify affected lines.

2010-10-24 Sam Weinig <sam@webkit.org>

Reviewed by Dan Bernstein.
@@ -30,6 +30,10 @@
#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>

#if PLATFORM(QT)
#include <wtf/text/WTFString.h>
#endif

namespace CoreIPC {
class ArgumentDecoder;
class ArgumentEncoder;
@@ -60,6 +64,8 @@ class SharedMemory : public RefCounted<SharedMemory> {
mutable mach_port_t m_port;
#elif PLATFORM(WIN)
mutable HANDLE m_handle;
#elif PLATFORM(QT)
mutable String m_fileName;
#endif
size_t m_size;
};
@@ -0,0 +1,96 @@
/*
* Copyright (C) 2010 University of Szeged
* Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF SZEGED ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL UNIVERSITY OF SZEGED OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#include "MappedMemoryPool.h"

#include "StdLibExtras.h"
#include <QDir>
#include <QIODevice>
#include <QTemporaryFile>

namespace WebKit {

MappedMemoryPool* MappedMemoryPool::instance()
{
DEFINE_STATIC_LOCAL(MappedMemoryPool, singleton, ());
return &singleton;
}

MappedMemory* MappedMemoryPool::searchForMappedMemory(uchar* p)
{
for (unsigned n = 0; n < m_pool.size(); ++n) {
MappedMemory& current = m_pool.at(n);
if (current.data() == p)
return reinterpret_cast<MappedMemory*>(&current);
}
return 0;
}

MappedMemory* MappedMemoryPool::mapMemory(size_t size, QIODevice::OpenMode openMode)
{
for (unsigned n = 0; n < m_pool.size(); ++n) {
MappedMemory& current = m_pool.at(n);
if (current.dataSize >= size && current.isFree()) {
current.markUsed();
return &current;
}
}
MappedMemory newMap;
newMap.dataSize = size;
newMap.file = new QTemporaryFile(QDir::tempPath() + "/WebKit2UpdateChunk");
newMap.file->open(openMode);
newMap.file->resize(newMap.mapSize());
newMap.mappedBytes = newMap.file->map(0, newMap.mapSize());
newMap.file->close();
newMap.markUsed();
m_pool.append(newMap);
return &m_pool.last();
}

MappedMemory* MappedMemoryPool::mapFile(QString fileName, size_t size, QIODevice::OpenMode openMode)
{
for (unsigned n = 0; n < m_pool.size(); ++n) {
MappedMemory& current = m_pool.at(n);
if (current.file->fileName() == fileName) {
ASSERT(!current.isFree());
return &current;
}
}
MappedMemory newMap;
newMap.file = new QFile(fileName);
if (!newMap.file->open(openMode))
return 0;
newMap.dataSize = size;
newMap.mappedBytes = newMap.file->map(0, newMap.mapSize());
ASSERT(!newMap.isFree());
newMap.file->close();
newMap.file->remove(); // The map stays alive even when the file is unlinked.
m_pool.append(newMap);
return &m_pool.last();
}

} // namespace WebKit
@@ -25,46 +25,49 @@
* THE POSSIBILITY OF SUCH DAMAGE.
*/

#ifndef MappedMemory_h
#define MappedMemory_h
#ifndef MappedMemoryPool_h
#define MappedMemoryPool_h

#include <QCoreApplication>
#include <QFile>
#include <wtf/Vector.h>

namespace WebKit {
struct MappedMemory {
QFile* file;
struct Data {
uint32_t isFree; // keep bytes aligned
uchar bytes;
};
union {
uchar* mappedBytes;
Data* dataPtr;
};
size_t dataSize;

size_t mapSize() const { return dataSize + sizeof(Data); }
void markUsed() { dataPtr->isFree = false; }
void markFree() { dataPtr->isFree = true; }
bool isFree() const { return dataPtr->isFree; }
uchar* data() const { return &dataPtr->bytes; }
};

class MappedMemoryPool : public QObject {
Q_OBJECT
class MappedMemoryPool {
public:
static MappedMemoryPool* instance();
size_t size() const;
MappedMemory& at(size_t i);
MappedMemory& append(const MappedMemory&);

struct MappedMemory {
QFile* file;
struct Data {
uint32_t isFree; // keep bytes aligned
uchar bytes;
};
union {
uchar* mappedBytes;
Data* dataPtr;
};
size_t dataSize;

size_t mapSize() const { return dataSize + sizeof(Data); }
void markUsed() { dataPtr->isFree = false; }
void markFree() { dataPtr->isFree = true; }
bool isFree() const { return dataPtr->isFree; }
uchar* data() const { return &dataPtr->bytes; }
};

MappedMemory* mapMemory(size_t size, QIODevice::OpenMode openMode = QIODevice::ReadWrite);
MappedMemory* mapFile(QString fileName, size_t size, QIODevice::OpenMode openMode = QIODevice::ReadWrite);
MappedMemory* searchForMappedMemory(uchar* p);

private:
MappedMemoryPool();
Q_SLOT void cleanUp();
MappedMemoryPool() { };

Vector<MappedMemory> m_pool;
};

typedef MappedMemoryPool::MappedMemory MappedMemory;

} // namespace WebKit
#endif // MappedMemory_h

#endif // MappedMemoryPool_h

0 comments on commit 6511023

Please sign in to comment.