mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-25 09:00:22 +00:00
Big, possibly complete sweep of naming changes.
This commit is contained in:
parent
27fa09aee4
commit
ffab6897aa
Notes:
sideshowbarker
2024-07-19 15:54:26 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/ffab6897aa1
93 changed files with 830 additions and 885 deletions
|
@ -15,7 +15,7 @@ public:
|
||||||
|
|
||||||
String() { }
|
String() { }
|
||||||
String(const String& other)
|
String(const String& other)
|
||||||
: m_impl(const_cast<String&>(other).m_impl.copyRef())
|
: m_impl(const_cast<String&>(other).m_impl.copy_ref())
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned toUInt(bool& ok) const;
|
unsigned to_uint(bool& ok) const;
|
||||||
|
|
||||||
String to_lowercase() const
|
String to_lowercase() const
|
||||||
{
|
{
|
||||||
|
@ -89,7 +89,7 @@ public:
|
||||||
String& operator=(const String& other)
|
String& operator=(const String& other)
|
||||||
{
|
{
|
||||||
if (this != &other)
|
if (this != &other)
|
||||||
m_impl = const_cast<String&>(other).m_impl.copyRef();
|
m_impl = const_cast<String&>(other).m_impl.copy_ref();
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,9 +8,9 @@
|
||||||
|
|
||||||
namespace AK {
|
namespace AK {
|
||||||
|
|
||||||
inline void notImplemented() { ASSERT(false); }
|
inline void not_implemented() { ASSERT(false); }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
using AK::notImplemented;
|
using AK::not_implemented;
|
||||||
|
|
||||||
|
|
|
@ -51,7 +51,7 @@ private:
|
||||||
, m_owned(true)
|
, m_owned(true)
|
||||||
{
|
{
|
||||||
ASSERT(m_size != 0);
|
ASSERT(m_size != 0);
|
||||||
size_t size_to_allocate = ceilDiv(size, 8u);
|
size_t size_to_allocate = ceil_div(size, 8u);
|
||||||
m_data = reinterpret_cast<byte*>(kmalloc(size_to_allocate));
|
m_data = reinterpret_cast<byte*>(kmalloc(size_to_allocate));
|
||||||
memset(m_data, default_value ? 0xff : 0x00, size_to_allocate);
|
memset(m_data, default_value ? 0xff : 0x00, size_to_allocate);
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ public:
|
||||||
ByteBuffer() { }
|
ByteBuffer() { }
|
||||||
ByteBuffer(std::nullptr_t) { }
|
ByteBuffer(std::nullptr_t) { }
|
||||||
ByteBuffer(const ByteBuffer& other)
|
ByteBuffer(const ByteBuffer& other)
|
||||||
: m_impl(other.m_impl.copyRef())
|
: m_impl(other.m_impl.copy_ref())
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
ByteBuffer(ByteBuffer&& other)
|
ByteBuffer(ByteBuffer&& other)
|
||||||
|
@ -26,7 +26,7 @@ public:
|
||||||
}
|
}
|
||||||
ByteBuffer& operator=(const ByteBuffer& other)
|
ByteBuffer& operator=(const ByteBuffer& other)
|
||||||
{
|
{
|
||||||
m_impl = other.m_impl.copyRef();
|
m_impl = other.m_impl.copy_ref();
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,7 @@ public:
|
||||||
append_node(new Node(value));
|
append_node(new Node(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool containsSlow(const T& value) const
|
bool contains_slow(const T& value) const
|
||||||
{
|
{
|
||||||
for (auto* node = m_head; node; node = node->next) {
|
for (auto* node = m_head; node; node = node->next) {
|
||||||
if (node->value == value)
|
if (node->value == value)
|
||||||
|
|
|
@ -40,7 +40,7 @@ bool FileSystemPath::canonicalize(bool resolve_symbolic_links)
|
||||||
builder.append('/');
|
builder.append('/');
|
||||||
builder.append(cpart);
|
builder.append(cpart);
|
||||||
}
|
}
|
||||||
m_string = builder.build();
|
m_string = builder.to_string();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,41 +41,41 @@ public:
|
||||||
|
|
||||||
template<typename CallableType, class = typename EnableIf<!(IsPointer<CallableType>::value && IsFunction<typename RemovePointer<CallableType>::Type>::value) && IsRvalueReference<CallableType&&>::value>::Type>
|
template<typename CallableType, class = typename EnableIf<!(IsPointer<CallableType>::value && IsFunction<typename RemovePointer<CallableType>::Type>::value) && IsRvalueReference<CallableType&&>::value>::Type>
|
||||||
Function(CallableType&& callable)
|
Function(CallableType&& callable)
|
||||||
: m_callableWrapper(make<CallableWrapper<CallableType>>(move(callable)))
|
: m_callable_wrapper(make<CallableWrapper<CallableType>>(move(callable)))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename FunctionType, class = typename EnableIf<IsPointer<FunctionType>::value && IsFunction<typename RemovePointer<FunctionType>::Type>::value>::Type>
|
template<typename FunctionType, class = typename EnableIf<IsPointer<FunctionType>::value && IsFunction<typename RemovePointer<FunctionType>::Type>::value>::Type>
|
||||||
Function(FunctionType f)
|
Function(FunctionType f)
|
||||||
: m_callableWrapper(make<CallableWrapper<FunctionType>>(move(f)))
|
: m_callable_wrapper(make<CallableWrapper<FunctionType>>(move(f)))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Out operator()(In... in) const
|
Out operator()(In... in) const
|
||||||
{
|
{
|
||||||
ASSERT(m_callableWrapper);
|
ASSERT(m_callable_wrapper);
|
||||||
return m_callableWrapper->call(forward<In>(in)...);
|
return m_callable_wrapper->call(forward<In>(in)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
explicit operator bool() const { return !!m_callableWrapper; }
|
explicit operator bool() const { return !!m_callable_wrapper; }
|
||||||
|
|
||||||
template<typename CallableType, class = typename EnableIf<!(IsPointer<CallableType>::value && IsFunction<typename RemovePointer<CallableType>::Type>::value) && IsRvalueReference<CallableType&&>::value>::Type>
|
template<typename CallableType, class = typename EnableIf<!(IsPointer<CallableType>::value && IsFunction<typename RemovePointer<CallableType>::Type>::value) && IsRvalueReference<CallableType&&>::value>::Type>
|
||||||
Function& operator=(CallableType&& callable)
|
Function& operator=(CallableType&& callable)
|
||||||
{
|
{
|
||||||
m_callableWrapper = make<CallableWrapper<CallableType>>(move(callable));
|
m_callable_wrapper = make<CallableWrapper<CallableType>>(move(callable));
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename FunctionType, class = typename EnableIf<IsPointer<FunctionType>::value && IsFunction<typename RemovePointer<FunctionType>::Type>::value>::Type>
|
template<typename FunctionType, class = typename EnableIf<IsPointer<FunctionType>::value && IsFunction<typename RemovePointer<FunctionType>::Type>::value>::Type>
|
||||||
Function& operator=(FunctionType f)
|
Function& operator=(FunctionType f)
|
||||||
{
|
{
|
||||||
m_callableWrapper = make<CallableWrapper<FunctionType>>(move(f));
|
m_callable_wrapper = make<CallableWrapper<FunctionType>>(move(f));
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
Function& operator=(std::nullptr_t)
|
Function& operator=(std::nullptr_t)
|
||||||
{
|
{
|
||||||
m_callableWrapper = nullptr;
|
m_callable_wrapper = nullptr;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,7 +103,7 @@ private:
|
||||||
CallableType m_callable;
|
CallableType m_callable;
|
||||||
};
|
};
|
||||||
|
|
||||||
OwnPtr<CallableWrapperBase> m_callableWrapper;
|
OwnPtr<CallableWrapperBase> m_callable_wrapper;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
#include "Types.h"
|
#include "Types.h"
|
||||||
|
|
||||||
inline unsigned intHash(dword key)
|
inline unsigned int_hash(dword key)
|
||||||
{
|
{
|
||||||
key += ~(key << 15);
|
key += ~(key << 15);
|
||||||
key ^= (key >> 10);
|
key ^= (key >> 10);
|
||||||
|
@ -13,8 +13,8 @@ inline unsigned intHash(dword key)
|
||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline unsigned pairIntHash(dword key1, dword key2)
|
inline unsigned pair_int_hash(dword key1, dword key2)
|
||||||
{
|
{
|
||||||
return intHash((intHash(key1) * 209) ^ (intHash(key2 * 413)));
|
return int_hash((int_hash(key1) * 209) ^ (int_hash(key2 * 413)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,7 @@ public:
|
||||||
void set(const K&, const V&);
|
void set(const K&, const V&);
|
||||||
void set(const K&, V&&);
|
void set(const K&, V&&);
|
||||||
void remove(const K&);
|
void remove(const K&);
|
||||||
void removeOneRandomly() { m_table.remove(m_table.begin()); }
|
void remove_one_randomly() { m_table.remove(m_table.begin()); }
|
||||||
|
|
||||||
typedef HashTable<Entry, EntryTraits> HashTableType;
|
typedef HashTable<Entry, EntryTraits> HashTableType;
|
||||||
typedef typename HashTableType::Iterator IteratorType;
|
typedef typename HashTableType::Iterator IteratorType;
|
||||||
|
|
|
@ -6,40 +6,40 @@
|
||||||
|
|
||||||
namespace AK {
|
namespace AK {
|
||||||
|
|
||||||
MappedFile::MappedFile(String&& fileName)
|
MappedFile::MappedFile(String&& file_name)
|
||||||
: m_fileName(std::move(fileName))
|
: m_file_name(std::move(file_name))
|
||||||
{
|
{
|
||||||
m_fileLength = 1024;
|
m_file_length = 1024;
|
||||||
m_fd = open(m_fileName.characters(), O_RDONLY);
|
m_fd = open(m_file_name.characters(), O_RDONLY);
|
||||||
|
|
||||||
if (m_fd != -1) {
|
if (m_fd != -1) {
|
||||||
struct stat st;
|
struct stat st;
|
||||||
fstat(m_fd, &st);
|
fstat(m_fd, &st);
|
||||||
m_fileLength = st.st_size;
|
m_file_length = st.st_size;
|
||||||
m_map = mmap(nullptr, m_fileLength, PROT_READ, MAP_SHARED, m_fd, 0);
|
m_map = mmap(nullptr, m_file_length, PROT_READ, MAP_SHARED, m_fd, 0);
|
||||||
|
|
||||||
if (m_map == MAP_FAILED)
|
if (m_map == MAP_FAILED)
|
||||||
perror("");
|
perror("");
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("MappedFile{%s} := { m_fd=%d, m_fileLength=%zu, m_map=%p }\n", m_fileName.characters(), m_fd, m_fileLength, m_map);
|
printf("MappedFile{%s} := { m_fd=%d, m_file_length=%zu, m_map=%p }\n", m_file_name.characters(), m_fd, m_file_length, m_map);
|
||||||
}
|
}
|
||||||
|
|
||||||
MappedFile::~MappedFile()
|
MappedFile::~MappedFile()
|
||||||
{
|
{
|
||||||
if (m_map != (void*)-1) {
|
if (m_map != (void*)-1) {
|
||||||
ASSERT(m_fd != -1);
|
ASSERT(m_fd != -1);
|
||||||
munmap(m_map, m_fileLength);
|
munmap(m_map, m_file_length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MappedFile::MappedFile(MappedFile&& other)
|
MappedFile::MappedFile(MappedFile&& other)
|
||||||
: m_fileName(std::move(other.m_fileName))
|
: m_file_name(std::move(other.m_file_name))
|
||||||
, m_fileLength(other.m_fileLength)
|
, m_file_length(other.m_file_length)
|
||||||
, m_fd(other.m_fd)
|
, m_fd(other.m_fd)
|
||||||
, m_map(other.m_map)
|
, m_map(other.m_map)
|
||||||
{
|
{
|
||||||
other.m_fileLength = 0;
|
other.m_file_length = 0;
|
||||||
other.m_fd = -1;
|
other.m_fd = -1;
|
||||||
other.m_map = (void*)-1;
|
other.m_map = (void*)-1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,19 +7,19 @@ namespace AK {
|
||||||
class MappedFile {
|
class MappedFile {
|
||||||
public:
|
public:
|
||||||
MappedFile() { }
|
MappedFile() { }
|
||||||
explicit MappedFile(String&& fileName);
|
explicit MappedFile(String&& file_name);
|
||||||
MappedFile(MappedFile&&);
|
MappedFile(MappedFile&&);
|
||||||
~MappedFile();
|
~MappedFile();
|
||||||
|
|
||||||
bool isValid() const { return m_map != (void*)-1; }
|
bool is_valid() const { return m_map != (void*)-1; }
|
||||||
|
|
||||||
void* pointer() { return m_map; }
|
void* pointer() { return m_map; }
|
||||||
const void* pointer() const { return m_map; }
|
const void* pointer() const { return m_map; }
|
||||||
size_t fileLength() const { return m_fileLength; }
|
size_t file_length() const { return m_file_length; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
String m_fileName;
|
String m_file_name;
|
||||||
size_t m_fileLength { 0 };
|
size_t m_file_length { 0 };
|
||||||
int m_fd { -1 };
|
int m_fd { -1 };
|
||||||
void* m_map { (void*)-1 };
|
void* m_map { (void*)-1 };
|
||||||
};
|
};
|
||||||
|
|
10
AK/OwnPtr.h
10
AK/OwnPtr.h
|
@ -11,8 +11,8 @@ class OwnPtr {
|
||||||
public:
|
public:
|
||||||
OwnPtr() { }
|
OwnPtr() { }
|
||||||
explicit OwnPtr(T* ptr) : m_ptr(ptr) { }
|
explicit OwnPtr(T* ptr) : m_ptr(ptr) { }
|
||||||
OwnPtr(OwnPtr&& other) : m_ptr(other.leakPtr()) { }
|
OwnPtr(OwnPtr&& other) : m_ptr(other.leak_ptr()) { }
|
||||||
template<typename U> OwnPtr(OwnPtr<U>&& other) : m_ptr(static_cast<T*>(other.leakPtr())) { }
|
template<typename U> OwnPtr(OwnPtr<U>&& other) : m_ptr(static_cast<T*>(other.leak_ptr())) { }
|
||||||
OwnPtr(std::nullptr_t) { };
|
OwnPtr(std::nullptr_t) { };
|
||||||
~OwnPtr()
|
~OwnPtr()
|
||||||
{
|
{
|
||||||
|
@ -29,7 +29,7 @@ public:
|
||||||
{
|
{
|
||||||
if (this != &other) {
|
if (this != &other) {
|
||||||
delete m_ptr;
|
delete m_ptr;
|
||||||
m_ptr = other.leakPtr();
|
m_ptr = other.leak_ptr();
|
||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
@ -39,7 +39,7 @@ public:
|
||||||
{
|
{
|
||||||
if (this != static_cast<void*>(&other)) {
|
if (this != static_cast<void*>(&other)) {
|
||||||
delete m_ptr;
|
delete m_ptr;
|
||||||
m_ptr = other.leakPtr();
|
m_ptr = other.leak_ptr();
|
||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
@ -69,7 +69,7 @@ public:
|
||||||
typedef T* OwnPtr::*UnspecifiedBoolType;
|
typedef T* OwnPtr::*UnspecifiedBoolType;
|
||||||
operator UnspecifiedBoolType() const { return m_ptr ? &OwnPtr::m_ptr : nullptr; }
|
operator UnspecifiedBoolType() const { return m_ptr ? &OwnPtr::m_ptr : nullptr; }
|
||||||
|
|
||||||
T* leakPtr()
|
T* leak_ptr()
|
||||||
{
|
{
|
||||||
T* leakedPtr = m_ptr;
|
T* leakedPtr = m_ptr;
|
||||||
m_ptr = nullptr;
|
m_ptr = nullptr;
|
||||||
|
|
|
@ -6,14 +6,14 @@
|
||||||
namespace AK {
|
namespace AK {
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline void retainIfNotNull(T* ptr)
|
inline void retain_if_not_null(T* ptr)
|
||||||
{
|
{
|
||||||
if (ptr)
|
if (ptr)
|
||||||
ptr->retain();
|
ptr->retain();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline void releaseIfNotNull(T* ptr)
|
inline void release_if_not_null(T* ptr)
|
||||||
{
|
{
|
||||||
if (ptr)
|
if (ptr)
|
||||||
ptr->release();
|
ptr->release();
|
||||||
|
@ -25,15 +25,15 @@ public:
|
||||||
enum AdoptTag { Adopt };
|
enum AdoptTag { Adopt };
|
||||||
|
|
||||||
RetainPtr() { }
|
RetainPtr() { }
|
||||||
RetainPtr(const T* ptr) : m_ptr(const_cast<T*>(ptr)) { retainIfNotNull(m_ptr); }
|
RetainPtr(const T* ptr) : m_ptr(const_cast<T*>(ptr)) { retain_if_not_null(m_ptr); }
|
||||||
RetainPtr(T* ptr) : m_ptr(ptr) { retainIfNotNull(m_ptr); }
|
RetainPtr(T* ptr) : m_ptr(ptr) { retain_if_not_null(m_ptr); }
|
||||||
RetainPtr(T& object) : m_ptr(&object) { m_ptr->retain(); }
|
RetainPtr(T& object) : m_ptr(&object) { m_ptr->retain(); }
|
||||||
RetainPtr(AdoptTag, T& object) : m_ptr(&object) { }
|
RetainPtr(AdoptTag, T& object) : m_ptr(&object) { }
|
||||||
RetainPtr(RetainPtr& other) : m_ptr(other.copyRef().leakRef()) { }
|
RetainPtr(RetainPtr& other) : m_ptr(other.copy_ref().leak_ref()) { }
|
||||||
RetainPtr(RetainPtr&& other) : m_ptr(other.leakRef()) { }
|
RetainPtr(RetainPtr&& other) : m_ptr(other.leak_ref()) { }
|
||||||
template<typename U> RetainPtr(RetainPtr<U>&& other) : m_ptr(static_cast<T*>(other.leakRef())) { }
|
template<typename U> RetainPtr(RetainPtr<U>&& other) : m_ptr(static_cast<T*>(other.leak_ref())) { }
|
||||||
RetainPtr(const RetainPtr& other) : m_ptr(const_cast<RetainPtr&>(other).copyRef().leakRef()) { }
|
RetainPtr(const RetainPtr& other) : m_ptr(const_cast<RetainPtr&>(other).copy_ref().leak_ref()) { }
|
||||||
template<typename U> RetainPtr(const RetainPtr<U>& other) : m_ptr(const_cast<RetainPtr<U>&>(other).copyRef().leakRef()) { }
|
template<typename U> RetainPtr(const RetainPtr<U>& other) : m_ptr(const_cast<RetainPtr<U>&>(other).copy_ref().leak_ref()) { }
|
||||||
~RetainPtr()
|
~RetainPtr()
|
||||||
{
|
{
|
||||||
clear();
|
clear();
|
||||||
|
@ -49,8 +49,8 @@ public:
|
||||||
RetainPtr& operator=(RetainPtr&& other)
|
RetainPtr& operator=(RetainPtr&& other)
|
||||||
{
|
{
|
||||||
if (this != &other) {
|
if (this != &other) {
|
||||||
releaseIfNotNull(m_ptr);
|
release_if_not_null(m_ptr);
|
||||||
m_ptr = other.leakRef();
|
m_ptr = other.leak_ref();
|
||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
@ -59,8 +59,8 @@ public:
|
||||||
RetainPtr& operator=(RetainPtr<U>&& other)
|
RetainPtr& operator=(RetainPtr<U>&& other)
|
||||||
{
|
{
|
||||||
if (this != static_cast<void*>(&other)) {
|
if (this != static_cast<void*>(&other)) {
|
||||||
releaseIfNotNull(m_ptr);
|
release_if_not_null(m_ptr);
|
||||||
m_ptr = other.leakRef();
|
m_ptr = other.leak_ref();
|
||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
@ -68,18 +68,18 @@ public:
|
||||||
RetainPtr& operator=(T* ptr)
|
RetainPtr& operator=(T* ptr)
|
||||||
{
|
{
|
||||||
if (m_ptr != ptr)
|
if (m_ptr != ptr)
|
||||||
releaseIfNotNull(m_ptr);
|
release_if_not_null(m_ptr);
|
||||||
m_ptr = ptr;
|
m_ptr = ptr;
|
||||||
retainIfNotNull(m_ptr);
|
retain_if_not_null(m_ptr);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
RetainPtr& operator=(T& object)
|
RetainPtr& operator=(T& object)
|
||||||
{
|
{
|
||||||
if (m_ptr != &object)
|
if (m_ptr != &object)
|
||||||
releaseIfNotNull(m_ptr);
|
release_if_not_null(m_ptr);
|
||||||
m_ptr = &object;
|
m_ptr = &object;
|
||||||
retainIfNotNull(m_ptr);
|
retain_if_not_null(m_ptr);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,14 +89,14 @@ public:
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
RetainPtr copyRef() const
|
RetainPtr copy_ref() const
|
||||||
{
|
{
|
||||||
return RetainPtr(m_ptr);
|
return RetainPtr(m_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void clear()
|
void clear()
|
||||||
{
|
{
|
||||||
releaseIfNotNull(m_ptr);
|
release_if_not_null(m_ptr);
|
||||||
m_ptr = nullptr;
|
m_ptr = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,7 +105,7 @@ public:
|
||||||
typedef T* RetainPtr::*UnspecifiedBoolType;
|
typedef T* RetainPtr::*UnspecifiedBoolType;
|
||||||
operator UnspecifiedBoolType() const { return m_ptr ? &RetainPtr::m_ptr : nullptr; }
|
operator UnspecifiedBoolType() const { return m_ptr ? &RetainPtr::m_ptr : nullptr; }
|
||||||
|
|
||||||
T* leakRef()
|
T* leak_ref()
|
||||||
{
|
{
|
||||||
T* leakedPtr = m_ptr;
|
T* leakedPtr = m_ptr;
|
||||||
m_ptr = nullptr;
|
m_ptr = nullptr;
|
||||||
|
|
|
@ -50,28 +50,28 @@ public:
|
||||||
void initialize(byte* base)
|
void initialize(byte* base)
|
||||||
{
|
{
|
||||||
m_base = base;
|
m_base = base;
|
||||||
m_free = capacityInAllocations();
|
m_free = capacity_in_allocations();
|
||||||
dump();
|
dump();
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr dword capacityInAllocations()
|
static constexpr dword capacity_in_allocations()
|
||||||
{
|
{
|
||||||
return 1048576 / chunkSize;
|
return 1048576 / chunkSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr dword capacityInBytes()
|
static constexpr dword capacity_in_bytes()
|
||||||
{
|
{
|
||||||
return capacityInAllocations() * chunkSize;
|
return capacity_in_allocations() * chunkSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte* allocate()
|
byte* allocate()
|
||||||
{
|
{
|
||||||
auto bitmap = this->bitmap();
|
auto bitmap = this->bitmap();
|
||||||
for (dword i = 0; i < capacityInAllocations(); ++i) {
|
for (dword i = 0; i < capacity_in_allocations(); ++i) {
|
||||||
if (!bitmap.get(i)) {
|
if (!bitmap.get(i)) {
|
||||||
bitmap.set(i, true);
|
bitmap.set(i, true);
|
||||||
--m_free;
|
--m_free;
|
||||||
return pointerToChunk(i);
|
return pointer_to_chunk(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -84,57 +84,57 @@ public:
|
||||||
|
|
||||||
void free(byte* ptr)
|
void free(byte* ptr)
|
||||||
{
|
{
|
||||||
ASSERT(isInAllocator(ptr));
|
ASSERT(is_in_allocator(ptr));
|
||||||
auto bitmap = this->bitmap();
|
auto bitmap = this->bitmap();
|
||||||
auto chunkIndex = chunkIndexFromPointer(ptr);
|
auto chunk_index = chunk_index_from_pointer(ptr);
|
||||||
ASSERT(bitmap.get(chunkIndex));
|
ASSERT(bitmap.get(chunk_index));
|
||||||
bitmap.set(chunkIndex, false);
|
bitmap.set(chunk_index, false);
|
||||||
++m_free;
|
++m_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isInAllocator(byte* ptr)
|
bool is_in_allocator(byte* ptr)
|
||||||
{
|
{
|
||||||
return ptr >= pointerToChunk(0) && ptr <= addressAfterThisAllocator();
|
return ptr >= pointer_to_chunk(0) && ptr <= address_after_this_allocator();
|
||||||
}
|
}
|
||||||
|
|
||||||
dword chunkIndexFromPointer(byte* ptr)
|
dword chunk_index_from_pointer(byte* ptr)
|
||||||
{
|
{
|
||||||
return (ptr - pointerToChunk(0)) / chunkSize;
|
return (ptr - pointer_to_chunk(0)) / chunkSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte* pointerToChunk(dword index)
|
byte* pointer_to_chunk(dword index)
|
||||||
{
|
{
|
||||||
return m_base + sizeOfAllocationBitmapInBytes() + (index * chunkSize);
|
return m_base + size_of_allocation_bitmap_in_bytes() + (index * chunkSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
AllocationBitmap bitmap()
|
AllocationBitmap bitmap()
|
||||||
{
|
{
|
||||||
return AllocationBitmap::wrap(m_base, capacityInAllocations());
|
return AllocationBitmap::wrap(m_base, capacity_in_allocations());
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr dword sizeOfAllocationBitmapInBytes()
|
static constexpr dword size_of_allocation_bitmap_in_bytes()
|
||||||
{
|
{
|
||||||
return capacityInAllocations() / 8;
|
return capacity_in_allocations() / 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte* addressAfterThisAllocator() const
|
byte* address_after_this_allocator() const
|
||||||
{
|
{
|
||||||
return m_base + sizeOfAllocationBitmapInBytes() + capacityInBytes();
|
return m_base + size_of_allocation_bitmap_in_bytes() + capacity_in_bytes();
|
||||||
}
|
}
|
||||||
|
|
||||||
dword numberOfFreeChunks() const
|
dword number_of_free_chunks() const
|
||||||
{
|
{
|
||||||
return m_free;
|
return m_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
byte* m_base { nullptr };
|
byte* m_base { nullptr };
|
||||||
dword m_free { capacityInAllocations() };
|
dword m_free { capacity_in_allocations() };
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Allocator {
|
struct Allocator {
|
||||||
void initialize();
|
void initialize();
|
||||||
void initializeIfNeeded();
|
void initialize_if_needed();
|
||||||
void dump();
|
void dump();
|
||||||
|
|
||||||
ChunkAllocator<8> alloc8;
|
ChunkAllocator<8> alloc8;
|
||||||
|
@ -148,7 +148,7 @@ struct Allocator {
|
||||||
|
|
||||||
static Allocator allocator;
|
static Allocator allocator;
|
||||||
|
|
||||||
void Allocator::initializeIfNeeded()
|
void Allocator::initialize_if_needed()
|
||||||
{
|
{
|
||||||
if (initialized)
|
if (initialized)
|
||||||
return;
|
return;
|
||||||
|
@ -161,9 +161,9 @@ void Allocator::initialize()
|
||||||
space = (byte*)mmap((void*)0x20000000, 32 * MB, PROT_WRITE | PROT_READ | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
space = (byte*)mmap((void*)0x20000000, 32 * MB, PROT_WRITE | PROT_READ | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||||
ASSERT(space != MAP_FAILED);
|
ASSERT(space != MAP_FAILED);
|
||||||
alloc8.initialize(space + 0x10000);
|
alloc8.initialize(space + 0x10000);
|
||||||
alloc16.initialize(alloc8.addressAfterThisAllocator());
|
alloc16.initialize(alloc8.address_after_this_allocator());
|
||||||
alloc4096.initialize(alloc16.addressAfterThisAllocator());
|
alloc4096.initialize(alloc16.address_after_this_allocator());
|
||||||
alloc16384.initialize(alloc4096.addressAfterThisAllocator());
|
alloc16384.initialize(alloc4096.address_after_this_allocator());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Allocator::dump()
|
void Allocator::dump()
|
||||||
|
@ -188,7 +188,7 @@ byte* allocate(dword size)
|
||||||
{
|
{
|
||||||
if (!size)
|
if (!size)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
allocator.initializeIfNeeded();
|
allocator.initialize_if_needed();
|
||||||
if (size <= 8) {
|
if (size <= 8) {
|
||||||
if (auto* ptr = allocator.alloc8.allocate())
|
if (auto* ptr = allocator.alloc8.allocate())
|
||||||
return ptr;
|
return ptr;
|
||||||
|
@ -210,7 +210,7 @@ byte* allocate(dword size)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte* allocateZeroed(dword size)
|
byte* allocate_zeroed(dword size)
|
||||||
{
|
{
|
||||||
auto* ptr = allocate(size);
|
auto* ptr = allocate(size);
|
||||||
if (!ptr)
|
if (!ptr)
|
||||||
|
@ -232,20 +232,20 @@ void free(byte* ptr)
|
||||||
{
|
{
|
||||||
if (!ptr)
|
if (!ptr)
|
||||||
return;
|
return;
|
||||||
allocator.initializeIfNeeded();
|
allocator.initialize_if_needed();
|
||||||
if (allocator.alloc8.isInAllocator(ptr)) {
|
if (allocator.alloc8.is_in_allocator(ptr)) {
|
||||||
allocator.alloc8.free(ptr);
|
allocator.alloc8.free(ptr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (allocator.alloc16.isInAllocator(ptr)) {
|
if (allocator.alloc16.is_in_allocator(ptr)) {
|
||||||
allocator.alloc16.free(ptr);
|
allocator.alloc16.free(ptr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (allocator.alloc4096.isInAllocator(ptr)) {
|
if (allocator.alloc4096.is_in_allocator(ptr)) {
|
||||||
allocator.alloc4096.free(ptr);
|
allocator.alloc4096.free(ptr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (allocator.alloc16384.isInAllocator(ptr)) {
|
if (allocator.alloc16384.is_in_allocator(ptr)) {
|
||||||
allocator.alloc16384.free(ptr);
|
allocator.alloc16384.free(ptr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ namespace SimpleMalloc {
|
||||||
void initialize();
|
void initialize();
|
||||||
void dump();
|
void dump();
|
||||||
byte* allocate(dword);
|
byte* allocate(dword);
|
||||||
byte* allocateZeroed(dword);
|
byte* allocate_zeroed(dword);
|
||||||
void free(byte*);
|
void free(byte*);
|
||||||
byte* reallocate(byte*, dword);
|
byte* reallocate(byte*, dword);
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,7 @@ public:
|
||||||
m_tail = node;
|
m_tail = node;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool containsSlow(const T& value) const
|
bool contains_slow(const T& value) const
|
||||||
{
|
{
|
||||||
for (auto* node = m_head; node; node = node->next) {
|
for (auto* node = m_head; node; node = node->next) {
|
||||||
if (node->value == value)
|
if (node->value == value)
|
||||||
|
|
|
@ -45,7 +45,7 @@ inline T max(const T& a, const T& b)
|
||||||
|
|
||||||
|
|
||||||
template<typename T, typename U>
|
template<typename T, typename U>
|
||||||
static inline T ceilDiv(T a, U b)
|
static inline T ceil_div(T a, U b)
|
||||||
{
|
{
|
||||||
static_assert(sizeof(T) == sizeof(U));
|
static_assert(sizeof(T) == sizeof(U));
|
||||||
T result = a / b;
|
T result = a / b;
|
||||||
|
@ -173,5 +173,5 @@ using AK::move;
|
||||||
using AK::forward;
|
using AK::forward;
|
||||||
using AK::exchange;
|
using AK::exchange;
|
||||||
using AK::swap;
|
using AK::swap;
|
||||||
using AK::ceilDiv;
|
using AK::ceil_div;
|
||||||
|
|
||||||
|
|
|
@ -42,10 +42,10 @@ String String::substring(size_t start, size_t length) const
|
||||||
ASSERT(start + length <= m_impl->length());
|
ASSERT(start + length <= m_impl->length());
|
||||||
// FIXME: This needs some input bounds checking.
|
// FIXME: This needs some input bounds checking.
|
||||||
char* buffer;
|
char* buffer;
|
||||||
auto newImpl = StringImpl::create_uninitialized(length, buffer);
|
auto new_impl = StringImpl::create_uninitialized(length, buffer);
|
||||||
memcpy(buffer, characters() + start, length);
|
memcpy(buffer, characters() + start, length);
|
||||||
buffer[length] = '\0';
|
buffer[length] = '\0';
|
||||||
return newImpl;
|
return new_impl;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<String> String::split(const char separator) const
|
Vector<String> String::split(const char separator) const
|
||||||
|
@ -79,7 +79,7 @@ ByteBuffer String::to_byte_buffer() const
|
||||||
return ByteBuffer::copy(reinterpret_cast<const byte*>(characters()), length());
|
return ByteBuffer::copy(reinterpret_cast<const byte*>(characters()), length());
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned String::toUInt(bool& ok) const
|
unsigned String::to_uint(bool& ok) const
|
||||||
{
|
{
|
||||||
unsigned value = 0;
|
unsigned value = 0;
|
||||||
for (size_t i = 0; i < length(); ++i) {
|
for (size_t i = 0; i < length(); ++i) {
|
||||||
|
@ -101,7 +101,7 @@ String String::format(const char* fmt, ...)
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
builder.appendvf(fmt, ap);
|
builder.appendvf(fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
return builder.build();
|
return builder.to_string();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,7 @@ void StringBuilder::append(char ch)
|
||||||
|
|
||||||
void StringBuilder::appendvf(const char* fmt, va_list ap)
|
void StringBuilder::appendvf(const char* fmt, va_list ap)
|
||||||
{
|
{
|
||||||
printfInternal([this] (char*&, char ch) {
|
printf_internal([this] (char*&, char ch) {
|
||||||
append(ch);
|
append(ch);
|
||||||
}, nullptr, fmt, ap);
|
}, nullptr, fmt, ap);
|
||||||
}
|
}
|
||||||
|
@ -62,7 +62,7 @@ ByteBuffer StringBuilder::to_byte_buffer()
|
||||||
return move(m_buffer);
|
return move(m_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
String StringBuilder::build()
|
String StringBuilder::to_string()
|
||||||
{
|
{
|
||||||
auto string = String((const char*)m_buffer.pointer(), m_length);
|
auto string = String((const char*)m_buffer.pointer(), m_length);
|
||||||
m_buffer.clear();
|
m_buffer.clear();
|
||||||
|
|
|
@ -17,7 +17,7 @@ public:
|
||||||
void appendf(const char*, ...);
|
void appendf(const char*, ...);
|
||||||
void appendvf(const char*, va_list);
|
void appendvf(const char*, va_list);
|
||||||
|
|
||||||
String build();
|
String to_string();
|
||||||
ByteBuffer to_byte_buffer();
|
ByteBuffer to_byte_buffer();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -55,7 +55,7 @@ StringImpl::~StringImpl()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline size_t allocationSizeForStringImpl(size_t length)
|
static inline size_t allocation_size_for_stringimpl(size_t length)
|
||||||
{
|
{
|
||||||
return sizeof(StringImpl) + (sizeof(char) * length) + sizeof(char);
|
return sizeof(StringImpl) + (sizeof(char) * length) + sizeof(char);
|
||||||
}
|
}
|
||||||
|
@ -63,14 +63,14 @@ static inline size_t allocationSizeForStringImpl(size_t length)
|
||||||
RetainPtr<StringImpl> StringImpl::create_uninitialized(size_t length, char*& buffer)
|
RetainPtr<StringImpl> StringImpl::create_uninitialized(size_t length, char*& buffer)
|
||||||
{
|
{
|
||||||
ASSERT(length);
|
ASSERT(length);
|
||||||
void* slot = kmalloc(allocationSizeForStringImpl(length));
|
void* slot = kmalloc(allocation_size_for_stringimpl(length));
|
||||||
if (!slot)
|
if (!slot)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
auto newStringImpl = adopt(*new (slot) StringImpl(ConstructWithInlineBuffer, length));
|
auto new_stringimpl = adopt(*new (slot) StringImpl(ConstructWithInlineBuffer, length));
|
||||||
buffer = const_cast<char*>(newStringImpl->m_characters);
|
buffer = const_cast<char*>(new_stringimpl->m_characters);
|
||||||
buffer[length] = '\0';
|
buffer[length] = '\0';
|
||||||
return newStringImpl;
|
return new_stringimpl;
|
||||||
}
|
}
|
||||||
|
|
||||||
RetainPtr<StringImpl> StringImpl::create(const char* cstring, size_t length, ShouldChomp shouldChomp)
|
RetainPtr<StringImpl> StringImpl::create(const char* cstring, size_t length, ShouldChomp shouldChomp)
|
||||||
|
@ -82,17 +82,17 @@ RetainPtr<StringImpl> StringImpl::create(const char* cstring, size_t length, Sho
|
||||||
return the_empty_stringimpl();
|
return the_empty_stringimpl();
|
||||||
|
|
||||||
char* buffer;
|
char* buffer;
|
||||||
auto newStringImpl = create_uninitialized(length, buffer);
|
auto new_stringimpl = create_uninitialized(length, buffer);
|
||||||
if (!newStringImpl)
|
if (!new_stringimpl)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
memcpy(buffer, cstring, length * sizeof(char));
|
memcpy(buffer, cstring, length * sizeof(char));
|
||||||
|
|
||||||
if (shouldChomp && buffer[length - 1] == '\n') {
|
if (shouldChomp && buffer[length - 1] == '\n') {
|
||||||
buffer[length - 1] = '\0';
|
buffer[length - 1] = '\0';
|
||||||
--newStringImpl->m_length;
|
--new_stringimpl->m_length;
|
||||||
}
|
}
|
||||||
|
|
||||||
return newStringImpl;
|
return new_stringimpl;
|
||||||
}
|
}
|
||||||
|
|
||||||
RetainPtr<StringImpl> StringImpl::create(const char* cstring, ShouldChomp shouldChomp)
|
RetainPtr<StringImpl> StringImpl::create(const char* cstring, ShouldChomp shouldChomp)
|
||||||
|
@ -103,26 +103,26 @@ RetainPtr<StringImpl> StringImpl::create(const char* cstring, ShouldChomp should
|
||||||
return create(cstring, strlen(cstring), shouldChomp);
|
return create(cstring, strlen(cstring), shouldChomp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool isASCIILowercase(char c)
|
static inline bool is_ascii_lowercase(char c)
|
||||||
{
|
{
|
||||||
return c >= 'a' && c <= 'z';
|
return c >= 'a' && c <= 'z';
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool isASCIIUppercase(char c)
|
static inline bool is_ascii_uppercase(char c)
|
||||||
{
|
{
|
||||||
return c >= 'A' && c <= 'Z';
|
return c >= 'A' && c <= 'Z';
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline char toASCIILowercase(char c)
|
static inline char to_ascii_lowercase(char c)
|
||||||
{
|
{
|
||||||
if (isASCIIUppercase(c))
|
if (is_ascii_uppercase(c))
|
||||||
return c | 0x20;
|
return c | 0x20;
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline char toASCIIUppercase(char c)
|
static inline char to_ascii_uppercase(char c)
|
||||||
{
|
{
|
||||||
if (isASCIILowercase(c))
|
if (is_ascii_lowercase(c))
|
||||||
return c & ~0x20;
|
return c & ~0x20;
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
@ -133,18 +133,18 @@ RetainPtr<StringImpl> StringImpl::to_lowercase() const
|
||||||
return const_cast<StringImpl*>(this);
|
return const_cast<StringImpl*>(this);
|
||||||
|
|
||||||
for (size_t i = 0; i < m_length; ++i) {
|
for (size_t i = 0; i < m_length; ++i) {
|
||||||
if (!isASCIILowercase(m_characters[i]))
|
if (!is_ascii_lowercase(m_characters[i]))
|
||||||
goto slowPath;
|
goto slow_path;
|
||||||
}
|
}
|
||||||
return const_cast<StringImpl*>(this);
|
return const_cast<StringImpl*>(this);
|
||||||
|
|
||||||
slowPath:
|
slow_path:
|
||||||
char* buffer;
|
char* buffer;
|
||||||
auto lowercased = create_uninitialized(m_length, buffer);
|
auto lowercased = create_uninitialized(m_length, buffer);
|
||||||
if (!lowercased)
|
if (!lowercased)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
for (size_t i = 0; i < m_length; ++i)
|
for (size_t i = 0; i < m_length; ++i)
|
||||||
buffer[i] = toASCIILowercase(m_characters[i]);
|
buffer[i] = to_ascii_lowercase(m_characters[i]);
|
||||||
|
|
||||||
return lowercased;
|
return lowercased;
|
||||||
}
|
}
|
||||||
|
@ -155,18 +155,18 @@ RetainPtr<StringImpl> StringImpl::to_uppercase() const
|
||||||
return const_cast<StringImpl*>(this);
|
return const_cast<StringImpl*>(this);
|
||||||
|
|
||||||
for (size_t i = 0; i < m_length; ++i) {
|
for (size_t i = 0; i < m_length; ++i) {
|
||||||
if (!isASCIIUppercase(m_characters[i]))
|
if (!is_ascii_uppercase(m_characters[i]))
|
||||||
goto slowPath;
|
goto slow_path;
|
||||||
}
|
}
|
||||||
return const_cast<StringImpl*>(this);
|
return const_cast<StringImpl*>(this);
|
||||||
|
|
||||||
slowPath:
|
slow_path:
|
||||||
char* buffer;
|
char* buffer;
|
||||||
auto uppercased = create_uninitialized(m_length, buffer);
|
auto uppercased = create_uninitialized(m_length, buffer);
|
||||||
if (!uppercased)
|
if (!uppercased)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
for (size_t i = 0; i < m_length; ++i)
|
for (size_t i = 0; i < m_length; ++i)
|
||||||
buffer[i] = toASCIIUppercase(m_characters[i]);
|
buffer[i] = to_ascii_uppercase(m_characters[i]);
|
||||||
|
|
||||||
return uppercased;
|
return uppercased;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,14 +11,14 @@ TemporaryFile::TemporaryFile()
|
||||||
int fd = mkstemp(nameBuffer);
|
int fd = mkstemp(nameBuffer);
|
||||||
if (fd != -1) {
|
if (fd != -1) {
|
||||||
m_stream = fdopen(fd, "w+");
|
m_stream = fdopen(fd, "w+");
|
||||||
m_fileName = nameBuffer;
|
m_file_name = nameBuffer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TemporaryFile::~TemporaryFile()
|
TemporaryFile::~TemporaryFile()
|
||||||
{
|
{
|
||||||
if (isValid()) {
|
if (is_valid()) {
|
||||||
unlink(m_fileName.characters());
|
unlink(m_file_name.characters());
|
||||||
fclose(m_stream);
|
fclose(m_stream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,14 +10,14 @@ public:
|
||||||
TemporaryFile();
|
TemporaryFile();
|
||||||
~TemporaryFile();
|
~TemporaryFile();
|
||||||
|
|
||||||
bool isValid() const { return m_stream; }
|
bool is_valid() const { return m_stream; }
|
||||||
FILE* stream() { return m_stream; }
|
FILE* stream() { return m_stream; }
|
||||||
String fileName() const { return m_fileName; }
|
String file_name() const { return m_file_name; }
|
||||||
void sync();
|
void sync();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
FILE* m_stream { nullptr };
|
FILE* m_stream { nullptr };
|
||||||
String m_fileName;
|
String m_file_name;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,13 +12,13 @@ struct Traits
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
struct Traits<int> {
|
struct Traits<int> {
|
||||||
static unsigned hash(int i) { return intHash(i); }
|
static unsigned hash(int i) { return int_hash(i); }
|
||||||
static void dump(int i) { kprintf("%d", i); }
|
static void dump(int i) { kprintf("%d", i); }
|
||||||
};
|
};
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
struct Traits<unsigned> {
|
struct Traits<unsigned> {
|
||||||
static unsigned hash(unsigned u) { return intHash(u); }
|
static unsigned hash(unsigned u) { return int_hash(u); }
|
||||||
static void dump(unsigned u) { kprintf("%u", u); }
|
static void dump(unsigned u) { kprintf("%u", u); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ template<typename T>
|
||||||
struct Traits<T*> {
|
struct Traits<T*> {
|
||||||
static unsigned hash(const T* p)
|
static unsigned hash(const T* p)
|
||||||
{
|
{
|
||||||
return intHash((dword)p);
|
return int_hash((dword)p);
|
||||||
}
|
}
|
||||||
static void dump(const T* p) { kprintf("%p", p); }
|
static void dump(const T* p) { kprintf("%p", p); }
|
||||||
};
|
};
|
||||||
|
|
|
@ -219,16 +219,16 @@ public:
|
||||||
if (capacity() >= neededCapacity)
|
if (capacity() >= neededCapacity)
|
||||||
return;
|
return;
|
||||||
size_t new_capacity = padded_capacity(neededCapacity);
|
size_t new_capacity = padded_capacity(neededCapacity);
|
||||||
auto newImpl = VectorImpl<T, Allocator>::create(new_capacity);
|
auto new_impl = VectorImpl<T, Allocator>::create(new_capacity);
|
||||||
if (m_impl) {
|
if (m_impl) {
|
||||||
newImpl->m_size = m_impl->m_size;
|
new_impl->m_size = m_impl->m_size;
|
||||||
for (size_t i = 0; i < size(); ++i) {
|
for (size_t i = 0; i < size(); ++i) {
|
||||||
new (newImpl->slot(i)) T(move(m_impl->at(i)));
|
new (new_impl->slot(i)) T(move(m_impl->at(i)));
|
||||||
m_impl->at(i).~T();
|
m_impl->at(i).~T();
|
||||||
}
|
}
|
||||||
Allocator::deallocate(m_impl);
|
Allocator::deallocate(m_impl);
|
||||||
}
|
}
|
||||||
m_impl = newImpl;
|
m_impl = new_impl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void resize(size_t new_size)
|
void resize(size_t new_size)
|
||||||
|
|
10
AK/WeakPtr.h
10
AK/WeakPtr.h
|
@ -13,14 +13,14 @@ public:
|
||||||
|
|
||||||
template<typename U>
|
template<typename U>
|
||||||
WeakPtr(WeakPtr<U>&& other)
|
WeakPtr(WeakPtr<U>&& other)
|
||||||
: m_link(reinterpret_cast<WeakLink<T>*>(other.leakLink()))
|
: m_link(reinterpret_cast<WeakLink<T>*>(other.leak_link()))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename U>
|
template<typename U>
|
||||||
WeakPtr& operator=(WeakPtr<U>&& other)
|
WeakPtr& operator=(WeakPtr<U>&& other)
|
||||||
{
|
{
|
||||||
m_link = reinterpret_cast<WeakLink<T>*>(other.leakLink());
|
m_link = reinterpret_cast<WeakLink<T>*>(other.leak_link());
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ public:
|
||||||
bool is_null() const { return !m_link || !m_link->ptr(); }
|
bool is_null() const { return !m_link || !m_link->ptr(); }
|
||||||
void clear() { m_link = nullptr; }
|
void clear() { m_link = nullptr; }
|
||||||
|
|
||||||
WeakLink<T>* leakLink() { return m_link.leakRef(); }
|
WeakLink<T>* leak_link() { return m_link.leak_ref(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
WeakPtr(RetainPtr<WeakLink<T>>&& link) : m_link(move(link)) { }
|
WeakPtr(RetainPtr<WeakLink<T>>&& link) : m_link(move(link)) { }
|
||||||
|
@ -47,11 +47,11 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline WeakPtr<T> Weakable<T>::makeWeakPtr()
|
inline WeakPtr<T> Weakable<T>::make_weak_ptr()
|
||||||
{
|
{
|
||||||
if (!m_link)
|
if (!m_link)
|
||||||
m_link = adopt(*new WeakLink<T>(static_cast<T&>(*this)));
|
m_link = adopt(*new WeakLink<T>(static_cast<T&>(*this)));
|
||||||
return WeakPtr<T>(m_link.copyRef());
|
return WeakPtr<T>(m_link.copy_ref());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,7 @@ class Weakable {
|
||||||
private:
|
private:
|
||||||
class Link;
|
class Link;
|
||||||
public:
|
public:
|
||||||
WeakPtr<T> makeWeakPtr();
|
WeakPtr<T> make_weak_ptr();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Weakable() { }
|
Weakable() { }
|
||||||
|
|
|
@ -84,7 +84,7 @@ void* kcalloc(size_t nmemb, size_t size)
|
||||||
{
|
{
|
||||||
if (!nmemb || !size)
|
if (!nmemb || !size)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
return SimpleMalloc::allocateZeroed(nmemb * size);
|
return SimpleMalloc::allocate_zeroed(nmemb * size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void* kmalloc(size_t size)
|
void* kmalloc(size_t size)
|
||||||
|
|
|
@ -13,7 +13,7 @@ ALWAYS_INLINE size_t strlen(const char* str)
|
||||||
static constexpr const char* h = "0123456789abcdef";
|
static constexpr const char* h = "0123456789abcdef";
|
||||||
|
|
||||||
template<typename PutChFunc>
|
template<typename PutChFunc>
|
||||||
ALWAYS_INLINE int printHex(PutChFunc putch, char*& bufptr, dword number, byte fields)
|
ALWAYS_INLINE int print_hex(PutChFunc putch, char*& bufptr, dword number, byte fields)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
byte shr_count = fields * 4;
|
byte shr_count = fields * 4;
|
||||||
|
@ -26,7 +26,7 @@ ALWAYS_INLINE int printHex(PutChFunc putch, char*& bufptr, dword number, byte fi
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename PutChFunc>
|
template<typename PutChFunc>
|
||||||
ALWAYS_INLINE int printNumber(PutChFunc putch, char*& bufptr, dword number, bool leftPad, bool zeroPad, dword fieldWidth)
|
ALWAYS_INLINE int print_number(PutChFunc putch, char*& bufptr, dword number, bool leftPad, bool zeroPad, dword fieldWidth)
|
||||||
{
|
{
|
||||||
dword divisor = 1000000000;
|
dword divisor = 1000000000;
|
||||||
char ch;
|
char ch;
|
||||||
|
@ -108,7 +108,7 @@ ALWAYS_INLINE int print_octal_number(PutChFunc putch, char*& bufptr, dword numbe
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename PutChFunc>
|
template<typename PutChFunc>
|
||||||
ALWAYS_INLINE int printString(PutChFunc putch, char*& bufptr, const char* str, bool leftPad, dword fieldWidth)
|
ALWAYS_INLINE int print_string(PutChFunc putch, char*& bufptr, const char* str, bool leftPad, dword fieldWidth)
|
||||||
{
|
{
|
||||||
size_t len = strlen(str);
|
size_t len = strlen(str);
|
||||||
if (!fieldWidth || fieldWidth < len)
|
if (!fieldWidth || fieldWidth < len)
|
||||||
|
@ -129,17 +129,17 @@ ALWAYS_INLINE int printString(PutChFunc putch, char*& bufptr, const char* str, b
|
||||||
|
|
||||||
|
|
||||||
template<typename PutChFunc>
|
template<typename PutChFunc>
|
||||||
ALWAYS_INLINE int printSignedNumber(PutChFunc putch, char*& bufptr, int number, bool leftPad, bool zeroPad, dword fieldWidth)
|
ALWAYS_INLINE int print_signed_number(PutChFunc putch, char*& bufptr, int number, bool leftPad, bool zeroPad, dword fieldWidth)
|
||||||
{
|
{
|
||||||
if (number < 0) {
|
if (number < 0) {
|
||||||
putch(bufptr, '-');
|
putch(bufptr, '-');
|
||||||
return printNumber(putch, bufptr, 0 - number, leftPad, zeroPad, fieldWidth) + 1;
|
return print_number(putch, bufptr, 0 - number, leftPad, zeroPad, fieldWidth) + 1;
|
||||||
}
|
}
|
||||||
return printNumber(putch, bufptr, number, leftPad, zeroPad, fieldWidth);
|
return print_number(putch, bufptr, number, leftPad, zeroPad, fieldWidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename PutChFunc>
|
template<typename PutChFunc>
|
||||||
ALWAYS_INLINE int printfInternal(PutChFunc putch, char* buffer, const char*& fmt, char*& ap)
|
ALWAYS_INLINE int printf_internal(PutChFunc putch, char* buffer, const char*& fmt, char*& ap)
|
||||||
{
|
{
|
||||||
const char *p;
|
const char *p;
|
||||||
|
|
||||||
|
@ -174,16 +174,16 @@ one_more:
|
||||||
case 's':
|
case 's':
|
||||||
{
|
{
|
||||||
const char* sp = va_arg(ap, const char*);
|
const char* sp = va_arg(ap, const char*);
|
||||||
ret += printString(putch, bufptr, sp ? sp : "(null)", leftPad, fieldWidth);
|
ret += print_string(putch, bufptr, sp ? sp : "(null)", leftPad, fieldWidth);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'd':
|
case 'd':
|
||||||
ret += printSignedNumber(putch, bufptr, va_arg(ap, int), leftPad, zeroPad, fieldWidth);
|
ret += print_signed_number(putch, bufptr, va_arg(ap, int), leftPad, zeroPad, fieldWidth);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'u':
|
case 'u':
|
||||||
ret += printNumber(putch, bufptr, va_arg(ap, dword), leftPad, zeroPad, fieldWidth);
|
ret += print_number(putch, bufptr, va_arg(ap, dword), leftPad, zeroPad, fieldWidth);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'o':
|
case 'o':
|
||||||
|
@ -191,15 +191,15 @@ one_more:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'x':
|
case 'x':
|
||||||
ret += printHex(putch, bufptr, va_arg(ap, dword), 8);
|
ret += print_hex(putch, bufptr, va_arg(ap, dword), 8);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'w':
|
case 'w':
|
||||||
ret += printHex(putch, bufptr, va_arg(ap, int), 4);
|
ret += print_hex(putch, bufptr, va_arg(ap, int), 4);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'b':
|
case 'b':
|
||||||
ret += printHex(putch, bufptr, va_arg(ap, int), 2);
|
ret += print_hex(putch, bufptr, va_arg(ap, int), 2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'c':
|
case 'c':
|
||||||
|
@ -211,7 +211,7 @@ one_more:
|
||||||
putch(bufptr, '0');
|
putch(bufptr, '0');
|
||||||
putch(bufptr, 'x');
|
putch(bufptr, 'x');
|
||||||
ret += 2;
|
ret += 2;
|
||||||
ret += printHex(putch, bufptr, va_arg(ap, dword), 8);
|
ret += print_hex(putch, bufptr, va_arg(ap, dword), 8);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
36
AK/test.cpp
36
AK/test.cpp
|
@ -13,7 +13,7 @@
|
||||||
#include "FileSystemPath.h"
|
#include "FileSystemPath.h"
|
||||||
#include "Lock.h"
|
#include "Lock.h"
|
||||||
|
|
||||||
static void testWeakPtr();
|
static void test_weak_ptr();
|
||||||
|
|
||||||
void log_locked() { }
|
void log_locked() { }
|
||||||
void log_unlocked() { }
|
void log_unlocked() { }
|
||||||
|
@ -223,7 +223,7 @@ int main(int c, char** v)
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
auto printInts = [] (const Vector<int>& v) {
|
auto print_ints = [] (const Vector<int>& v) {
|
||||||
printf("Vector {\n size: %zu\n capacity: %zu\n elements: ", v.size(), v.capacity());
|
printf("Vector {\n size: %zu\n capacity: %zu\n elements: ", v.size(), v.capacity());
|
||||||
for (auto i : v)
|
for (auto i : v)
|
||||||
printf("%d ", i);
|
printf("%d ", i);
|
||||||
|
@ -235,23 +235,23 @@ int main(int c, char** v)
|
||||||
v.append(1);
|
v.append(1);
|
||||||
v.append(2);
|
v.append(2);
|
||||||
v.append(3);
|
v.append(3);
|
||||||
printInts(v);
|
print_ints(v);
|
||||||
|
|
||||||
v.remove(1);
|
v.remove(1);
|
||||||
printInts(v);
|
print_ints(v);
|
||||||
|
|
||||||
v.remove(0);
|
v.remove(0);
|
||||||
printInts(v);
|
print_ints(v);
|
||||||
|
|
||||||
v.remove(0);
|
v.remove(0);
|
||||||
printInts(v);
|
print_ints(v);
|
||||||
|
|
||||||
v.remove(0);
|
v.remove(0);
|
||||||
printInts(v);
|
print_ints(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
auto printInts = [] (const HashTable<int>& h) {
|
auto print_ints = [] (const HashTable<int>& h) {
|
||||||
printf("HashTable {\n size: %u\n capacity: %u\n elements: ", h.size(), h.capacity());
|
printf("HashTable {\n size: %u\n capacity: %u\n elements: ", h.size(), h.capacity());
|
||||||
for (auto i : h)
|
for (auto i : h)
|
||||||
printf("%d ", i);
|
printf("%d ", i);
|
||||||
|
@ -268,17 +268,17 @@ int main(int c, char** v)
|
||||||
|
|
||||||
h.dump();
|
h.dump();
|
||||||
|
|
||||||
printInts(h);
|
print_ints(h);
|
||||||
|
|
||||||
h.remove(30);
|
h.remove(30);
|
||||||
printInts(h);
|
print_ints(h);
|
||||||
|
|
||||||
h.set(30);
|
h.set(30);
|
||||||
h.remove(30);
|
h.remove(30);
|
||||||
printInts(h);
|
print_ints(h);
|
||||||
}
|
}
|
||||||
|
|
||||||
testWeakPtr();
|
test_weak_ptr();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -289,16 +289,16 @@ public:
|
||||||
~TestWeakable() { }
|
~TestWeakable() { }
|
||||||
};
|
};
|
||||||
|
|
||||||
void testWeakPtr()
|
void test_weak_ptr()
|
||||||
{
|
{
|
||||||
auto* weakable = new TestWeakable;
|
auto* weakable = new TestWeakable;
|
||||||
|
|
||||||
auto weakPtr = weakable->makeWeakPtr();
|
auto weak_ptr = weakable->make_weak_ptr();
|
||||||
ASSERT(weakPtr);
|
ASSERT(weak_ptr);
|
||||||
ASSERT(weakPtr.ptr() == weakable);
|
ASSERT(weak_ptr.ptr() == weakable);
|
||||||
|
|
||||||
delete weakable;
|
delete weakable;
|
||||||
|
|
||||||
ASSERT(!weakPtr);
|
ASSERT(!weak_ptr);
|
||||||
ASSERT(weakPtr.ptr() == nullptr);
|
ASSERT(weak_ptr.ptr() == nullptr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,7 @@ public:
|
||||||
virtual ssize_t write(Process&, const byte* data, size_t size) override;
|
virtual ssize_t write(Process&, const byte* data, size_t size) override;
|
||||||
virtual const char* class_name() const override { return "Console"; }
|
virtual const char* class_name() const override { return "Console"; }
|
||||||
|
|
||||||
void setImplementation(ConsoleImplementation* implementation) { m_implementation = implementation; }
|
void set_implementation(ConsoleImplementation* implementation) { m_implementation = implementation; }
|
||||||
|
|
||||||
void put_char(char);
|
void put_char(char);
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@ RetainPtr<SynthFSInode> DevPtsFS::create_slave_pty_device_file(unsigned index)
|
||||||
|
|
||||||
StringBuilder builder;
|
StringBuilder builder;
|
||||||
builder.appendf("%u", index);
|
builder.appendf("%u", index);
|
||||||
file->m_name = builder.build();
|
file->m_name = builder.to_string();
|
||||||
|
|
||||||
auto* device = VFS::the().get_device(11, index);
|
auto* device = VFS::the().get_device(11, index);
|
||||||
ASSERT(device);
|
ASSERT(device);
|
||||||
|
@ -51,8 +51,8 @@ RetainPtr<SynthFSInode> DevPtsFS::create_slave_pty_device_file(unsigned index)
|
||||||
file->m_metadata.uid = device->uid();
|
file->m_metadata.uid = device->uid();
|
||||||
file->m_metadata.gid = device->gid();
|
file->m_metadata.gid = device->gid();
|
||||||
file->m_metadata.mode = 0020644;
|
file->m_metadata.mode = 0020644;
|
||||||
file->m_metadata.majorDevice = device->major();
|
file->m_metadata.major_device = device->major();
|
||||||
file->m_metadata.minorDevice = device->minor();
|
file->m_metadata.minor_device = device->minor();
|
||||||
file->m_metadata.mtime = mepoch;
|
file->m_metadata.mtime = mepoch;
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,63 +13,63 @@ DiskBackedFS::~DiskBackedFS()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DiskBackedFS::writeBlock(unsigned index, const ByteBuffer& data)
|
bool DiskBackedFS::write_block(unsigned index, const ByteBuffer& data)
|
||||||
{
|
{
|
||||||
#ifdef DBFS_DEBUG
|
#ifdef DBFS_DEBUG
|
||||||
kprintf("DiskBackedFileSystem::writeBlock %u, size=%u\n", index, data.size());
|
kprintf("DiskBackedFileSystem::write_block %u, size=%u\n", index, data.size());
|
||||||
#endif
|
#endif
|
||||||
ASSERT(data.size() == blockSize());
|
ASSERT(data.size() == block_size());
|
||||||
DiskOffset baseOffset = static_cast<DiskOffset>(index) * static_cast<DiskOffset>(blockSize());
|
DiskOffset base_offset = static_cast<DiskOffset>(index) * static_cast<DiskOffset>(block_size());
|
||||||
return device().write(baseOffset, blockSize(), data.pointer());
|
return device().write(base_offset, block_size(), data.pointer());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DiskBackedFS::writeBlocks(unsigned index, unsigned count, const ByteBuffer& data)
|
bool DiskBackedFS::write_blocks(unsigned index, unsigned count, const ByteBuffer& data)
|
||||||
{
|
{
|
||||||
#ifdef DBFS_DEBUG
|
#ifdef DBFS_DEBUG
|
||||||
kprintf("DiskBackedFileSystem::writeBlocks %u x%u\n", index, count);
|
kprintf("DiskBackedFileSystem::write_blocks %u x%u\n", index, count);
|
||||||
#endif
|
#endif
|
||||||
DiskOffset baseOffset = static_cast<DiskOffset>(index) * static_cast<DiskOffset>(blockSize());
|
DiskOffset base_offset = static_cast<DiskOffset>(index) * static_cast<DiskOffset>(block_size());
|
||||||
return device().write(baseOffset, count * blockSize(), data.pointer());
|
return device().write(base_offset, count * block_size(), data.pointer());
|
||||||
}
|
}
|
||||||
|
|
||||||
ByteBuffer DiskBackedFS::readBlock(unsigned index) const
|
ByteBuffer DiskBackedFS::read_block(unsigned index) const
|
||||||
{
|
{
|
||||||
#ifdef DBFS_DEBUG
|
#ifdef DBFS_DEBUG
|
||||||
kprintf("DiskBackedFileSystem::readBlock %u\n", index);
|
kprintf("DiskBackedFileSystem::read_block %u\n", index);
|
||||||
#endif
|
#endif
|
||||||
auto buffer = ByteBuffer::create_uninitialized(blockSize());
|
auto buffer = ByteBuffer::create_uninitialized(block_size());
|
||||||
//kprintf("created block buffer with size %u\n", blockSize());
|
//kprintf("created block buffer with size %u\n", block_size());
|
||||||
DiskOffset baseOffset = static_cast<DiskOffset>(index) * static_cast<DiskOffset>(blockSize());
|
DiskOffset base_offset = static_cast<DiskOffset>(index) * static_cast<DiskOffset>(block_size());
|
||||||
auto* bufferPointer = buffer.pointer();
|
auto* buffer_pointer = buffer.pointer();
|
||||||
bool success = device().read(baseOffset, blockSize(), bufferPointer);
|
bool success = device().read(base_offset, block_size(), buffer_pointer);
|
||||||
ASSERT(success);
|
ASSERT(success);
|
||||||
ASSERT(buffer.size() == blockSize());
|
ASSERT(buffer.size() == block_size());
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
ByteBuffer DiskBackedFS::readBlocks(unsigned index, unsigned count) const
|
ByteBuffer DiskBackedFS::read_blocks(unsigned index, unsigned count) const
|
||||||
{
|
{
|
||||||
if (!count)
|
if (!count)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
if (count == 1)
|
if (count == 1)
|
||||||
return readBlock(index);
|
return read_block(index);
|
||||||
auto blocks = ByteBuffer::create_uninitialized(count * blockSize());
|
auto blocks = ByteBuffer::create_uninitialized(count * block_size());
|
||||||
byte* out = blocks.pointer();
|
byte* out = blocks.pointer();
|
||||||
|
|
||||||
for (unsigned i = 0; i < count; ++i) {
|
for (unsigned i = 0; i < count; ++i) {
|
||||||
auto block = readBlock(index + i);
|
auto block = read_block(index + i);
|
||||||
if (!block)
|
if (!block)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
memcpy(out, block.pointer(), block.size());
|
memcpy(out, block.pointer(), block.size());
|
||||||
out += blockSize();
|
out += block_size();
|
||||||
}
|
}
|
||||||
|
|
||||||
return blocks;
|
return blocks;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DiskBackedFS::setBlockSize(unsigned blockSize)
|
void DiskBackedFS::set_block_size(unsigned block_size)
|
||||||
{
|
{
|
||||||
if (blockSize == m_blockSize)
|
if (block_size == m_block_size)
|
||||||
return;
|
return;
|
||||||
m_blockSize = blockSize;
|
m_block_size = block_size;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,20 +10,20 @@ public:
|
||||||
DiskDevice& device() { return *m_device; }
|
DiskDevice& device() { return *m_device; }
|
||||||
const DiskDevice& device() const { return *m_device; }
|
const DiskDevice& device() const { return *m_device; }
|
||||||
|
|
||||||
size_t blockSize() const { return m_blockSize; }
|
size_t block_size() const { return m_block_size; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
explicit DiskBackedFS(RetainPtr<DiskDevice>&&);
|
explicit DiskBackedFS(RetainPtr<DiskDevice>&&);
|
||||||
|
|
||||||
void setBlockSize(unsigned);
|
void set_block_size(unsigned);
|
||||||
|
|
||||||
ByteBuffer readBlock(unsigned index) const;
|
ByteBuffer read_block(unsigned index) const;
|
||||||
ByteBuffer readBlocks(unsigned index, unsigned count) const;
|
ByteBuffer read_blocks(unsigned index, unsigned count) const;
|
||||||
|
|
||||||
bool writeBlock(unsigned index, const ByteBuffer&);
|
bool write_block(unsigned index, const ByteBuffer&);
|
||||||
bool writeBlocks(unsigned index, unsigned count, const ByteBuffer&);
|
bool write_blocks(unsigned index, unsigned count, const ByteBuffer&);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
size_t m_blockSize { 0 };
|
size_t m_block_size { 0 };
|
||||||
RetainPtr<DiskDevice> m_device;
|
RetainPtr<DiskDevice> m_device;
|
||||||
};
|
};
|
||||||
|
|
|
@ -13,10 +13,10 @@ bool DiskDevice::read(DiskOffset offset, unsigned length, byte* out) const
|
||||||
//kprintf("DD::read %u x%u\n", offset, length);
|
//kprintf("DD::read %u x%u\n", offset, length);
|
||||||
ASSERT((offset % block_size()) == 0);
|
ASSERT((offset % block_size()) == 0);
|
||||||
ASSERT((length % block_size()) == 0);
|
ASSERT((length % block_size()) == 0);
|
||||||
dword firstBlock = offset / block_size();
|
dword first_block = offset / block_size();
|
||||||
dword endBlock = (offset + length) / block_size();
|
dword end_block = (offset + length) / block_size();
|
||||||
byte* outptr = out;
|
byte* outptr = out;
|
||||||
for (unsigned bi = firstBlock; bi < endBlock; ++bi) {
|
for (unsigned bi = first_block; bi < end_block; ++bi) {
|
||||||
if (!read_block(bi, outptr))
|
if (!read_block(bi, outptr))
|
||||||
return false;
|
return false;
|
||||||
outptr += block_size();
|
outptr += block_size();
|
||||||
|
@ -28,12 +28,12 @@ bool DiskDevice::write(DiskOffset offset, unsigned length, const byte* in)
|
||||||
{
|
{
|
||||||
ASSERT((offset % block_size()) == 0);
|
ASSERT((offset % block_size()) == 0);
|
||||||
ASSERT((length % block_size()) == 0);
|
ASSERT((length % block_size()) == 0);
|
||||||
dword firstBlock = offset / block_size();
|
dword first_block = offset / block_size();
|
||||||
dword endBlock = (offset + length) / block_size();
|
dword end_block = (offset + length) / block_size();
|
||||||
ASSERT(firstBlock <= 0xffffffff);
|
ASSERT(first_block <= 0xffffffff);
|
||||||
ASSERT(endBlock <= 0xffffffff);
|
ASSERT(end_block <= 0xffffffff);
|
||||||
const byte* inptr = in;
|
const byte* inptr = in;
|
||||||
for (unsigned bi = firstBlock; bi < endBlock; ++bi) {
|
for (unsigned bi = first_block; bi < end_block; ++bi) {
|
||||||
if (!write_block(bi, inptr))
|
if (!write_block(bi, inptr))
|
||||||
return false;
|
return false;
|
||||||
inptr += block_size();
|
inptr += block_size();
|
||||||
|
|
|
@ -11,7 +11,7 @@ ELFImage::~ELFImage()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char* objectFileTypeToString(Elf32_Half type)
|
static const char* object_file_type_to_string(Elf32_Half type)
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case ET_NONE: return "None";
|
case ET_NONE: return "None";
|
||||||
|
@ -40,14 +40,14 @@ unsigned ELFImage::symbol_count() const
|
||||||
void ELFImage::dump()
|
void ELFImage::dump()
|
||||||
{
|
{
|
||||||
kprintf("ELFImage{%p} {\n", this);
|
kprintf("ELFImage{%p} {\n", this);
|
||||||
kprintf(" isValid: %u\n", is_valid());
|
kprintf(" is_valid: %u\n", is_valid());
|
||||||
|
|
||||||
if (!is_valid()) {
|
if (!is_valid()) {
|
||||||
kprintf("}\n");
|
kprintf("}\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
kprintf(" type: %s\n", objectFileTypeToString(header().e_type));
|
kprintf(" type: %s\n", object_file_type_to_string(header().e_type));
|
||||||
kprintf(" machine: %u\n", header().e_machine);
|
kprintf(" machine: %u\n", header().e_machine);
|
||||||
kprintf(" entry: %x\n", header().e_entry);
|
kprintf(" entry: %x\n", header().e_entry);
|
||||||
kprintf(" shoff: %u\n", header().e_shoff);
|
kprintf(" shoff: %u\n", header().e_shoff);
|
||||||
|
@ -158,8 +158,8 @@ const Elf32_Shdr& ELFImage::section_header(unsigned index) const
|
||||||
const ELFImage::Symbol ELFImage::symbol(unsigned index) const
|
const ELFImage::Symbol ELFImage::symbol(unsigned index) const
|
||||||
{
|
{
|
||||||
ASSERT(index < symbol_count());
|
ASSERT(index < symbol_count());
|
||||||
auto* rawSyms = reinterpret_cast<const Elf32_Sym*>(raw_data(section(m_symbol_table_section_index).offset()));
|
auto* raw_syms = reinterpret_cast<const Elf32_Sym*>(raw_data(section(m_symbol_table_section_index).offset()));
|
||||||
return Symbol(*this, index, rawSyms[index]);
|
return Symbol(*this, index, raw_syms[index]);
|
||||||
}
|
}
|
||||||
|
|
||||||
const ELFImage::Section ELFImage::section(unsigned index) const
|
const ELFImage::Section ELFImage::section(unsigned index) const
|
||||||
|
@ -185,23 +185,23 @@ const ELFImage::Relocation ELFImage::RelocationSection::relocation(unsigned inde
|
||||||
const ELFImage::RelocationSection ELFImage::Section::relocations() const
|
const ELFImage::RelocationSection ELFImage::Section::relocations() const
|
||||||
{
|
{
|
||||||
// FIXME: This is ugly.
|
// FIXME: This is ugly.
|
||||||
char relocationSectionName[128];
|
char relocation_sectionName[128];
|
||||||
ksprintf(relocationSectionName, ".rel%s", name());
|
ksprintf(relocation_sectionName, ".rel%s", name());
|
||||||
|
|
||||||
#ifdef ELFIMAGE_DEBUG
|
#ifdef ELFIMAGE_DEBUG
|
||||||
kprintf("looking for '%s'\n", relocationSectionName);
|
kprintf("looking for '%s'\n", relocation_sectionName);
|
||||||
#endif
|
#endif
|
||||||
auto relocationSection = m_image.lookupSection(relocationSectionName);
|
auto relocation_section = m_image.lookup_section(relocation_sectionName);
|
||||||
if (relocationSection.type() != SHT_REL)
|
if (relocation_section.type() != SHT_REL)
|
||||||
return static_cast<const RelocationSection>(m_image.section(0));
|
return static_cast<const RelocationSection>(m_image.section(0));
|
||||||
|
|
||||||
#ifdef ELFIMAGE_DEBUG
|
#ifdef ELFIMAGE_DEBUG
|
||||||
kprintf("Found relocations for %s in %s\n", name(), relocationSection.name());
|
kprintf("Found relocations for %s in %s\n", name(), relocation_section.name());
|
||||||
#endif
|
#endif
|
||||||
return static_cast<const RelocationSection>(relocationSection);
|
return static_cast<const RelocationSection>(relocation_section);
|
||||||
}
|
}
|
||||||
|
|
||||||
const ELFImage::Section ELFImage::lookupSection(const char* name) const
|
const ELFImage::Section ELFImage::lookup_section(const char* name) const
|
||||||
{
|
{
|
||||||
if (auto it = m_sections.find(name); it != m_sections.end())
|
if (auto it = m_sections.find(name); it != m_sections.end())
|
||||||
return section((*it).value);
|
return section((*it).value);
|
||||||
|
|
|
@ -150,7 +150,7 @@ public:
|
||||||
|
|
||||||
// NOTE: Returns section(0) if section with name is not found.
|
// NOTE: Returns section(0) if section with name is not found.
|
||||||
// FIXME: I don't love this API.
|
// FIXME: I don't love this API.
|
||||||
const Section lookupSection(const char* name) const;
|
const Section lookup_section(const char* name) const;
|
||||||
|
|
||||||
bool is_executable() const { return header().e_type == ET_EXEC; }
|
bool is_executable() const { return header().e_type == ET_EXEC; }
|
||||||
bool is_relocatable() const { return header().e_type == ET_REL; }
|
bool is_relocatable() const { return header().e_type == ET_REL; }
|
||||||
|
@ -158,7 +158,7 @@ public:
|
||||||
LinearAddress entry() const { return LinearAddress(header().e_entry); }
|
LinearAddress entry() const { return LinearAddress(header().e_entry); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool parseHeader();
|
bool parse_header();
|
||||||
const char* raw_data(unsigned offset) const;
|
const char* raw_data(unsigned offset) const;
|
||||||
const Elf32_Ehdr& header() const;
|
const Elf32_Ehdr& header() const;
|
||||||
const Elf32_Shdr& section_header(unsigned) const;
|
const Elf32_Shdr& section_header(unsigned) const;
|
||||||
|
|
|
@ -142,7 +142,7 @@ bool ELFLoader::perform_relocations()
|
||||||
failed = true;
|
failed = true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
ptrdiff_t relativeOffset = (char*)target_ptr - ((char*)&patch_ptr + 4);
|
ptrdiff_t relative_offset = (char*)target_ptr - ((char*)&patch_ptr + 4);
|
||||||
#ifdef ELFLOADER_DEBUG
|
#ifdef ELFLOADER_DEBUG
|
||||||
kprintf("ELFLoader: Relocate PC32: offset=%x, symbol=%u(%s) value=%x target=%p, offset=%d\n",
|
kprintf("ELFLoader: Relocate PC32: offset=%x, symbol=%u(%s) value=%x target=%p, offset=%d\n",
|
||||||
relocation.offset(),
|
relocation.offset(),
|
||||||
|
@ -150,10 +150,10 @@ bool ELFLoader::perform_relocations()
|
||||||
symbol.name(),
|
symbol.name(),
|
||||||
symbol.value(),
|
symbol.value(),
|
||||||
target_ptr,
|
target_ptr,
|
||||||
relativeOffset
|
relative_offset
|
||||||
);
|
);
|
||||||
#endif
|
#endif
|
||||||
patch_ptr = relativeOffset;
|
patch_ptr = relative_offset;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case R_386_32: {
|
case R_386_32: {
|
||||||
|
|
|
@ -62,45 +62,45 @@ const ext2_super_block& Ext2FS::super_block() const
|
||||||
const ext2_group_desc& Ext2FS::group_descriptor(unsigned groupIndex) const
|
const ext2_group_desc& Ext2FS::group_descriptor(unsigned groupIndex) const
|
||||||
{
|
{
|
||||||
// FIXME: Should this fail gracefully somehow?
|
// FIXME: Should this fail gracefully somehow?
|
||||||
ASSERT(groupIndex <= m_blockGroupCount);
|
ASSERT(groupIndex <= m_block_group_count);
|
||||||
|
|
||||||
if (!m_cached_group_descriptor_table) {
|
if (!m_cached_group_descriptor_table) {
|
||||||
unsigned blocksToRead = ceilDiv(m_blockGroupCount * (unsigned)sizeof(ext2_group_desc), blockSize());
|
unsigned blocks_to_read = ceil_div(m_block_group_count * (unsigned)sizeof(ext2_group_desc), block_size());
|
||||||
unsigned firstBlockOfBGDT = blockSize() == 1024 ? 2 : 1;
|
unsigned first_block_of_bgdt = block_size() == 1024 ? 2 : 1;
|
||||||
#ifdef EXT2_DEBUG
|
#ifdef EXT2_DEBUG
|
||||||
kprintf("ext2fs: block group count: %u, blocks-to-read: %u\n", m_blockGroupCount, blocksToRead);
|
kprintf("ext2fs: block group count: %u, blocks-to-read: %u\n", m_block_group_count, blocks_to_read);
|
||||||
kprintf("ext2fs: first block of BGDT: %u\n", firstBlockOfBGDT);
|
kprintf("ext2fs: first block of BGDT: %u\n", first_block_of_bgdt);
|
||||||
#endif
|
#endif
|
||||||
m_cached_group_descriptor_table = readBlocks(firstBlockOfBGDT, blocksToRead);
|
m_cached_group_descriptor_table = read_blocks(first_block_of_bgdt, blocks_to_read);
|
||||||
}
|
}
|
||||||
return reinterpret_cast<ext2_group_desc*>(m_cached_group_descriptor_table.pointer())[groupIndex - 1];
|
return reinterpret_cast<ext2_group_desc*>(m_cached_group_descriptor_table.pointer())[groupIndex - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Ext2FS::initialize()
|
bool Ext2FS::initialize()
|
||||||
{
|
{
|
||||||
auto& superBlock = this->super_block();
|
auto& super_block = this->super_block();
|
||||||
#ifdef EXT2_DEBUG
|
#ifdef EXT2_DEBUG
|
||||||
kprintf("ext2fs: super block magic: %x (super block size: %u)\n", superBlock.s_magic, sizeof(ext2_super_block));
|
kprintf("ext2fs: super block magic: %x (super block size: %u)\n", super_block.s_magic, sizeof(ext2_super_block));
|
||||||
#endif
|
#endif
|
||||||
if (superBlock.s_magic != EXT2_SUPER_MAGIC)
|
if (super_block.s_magic != EXT2_SUPER_MAGIC)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
#ifdef EXT2_DEBUG
|
#ifdef EXT2_DEBUG
|
||||||
kprintf("ext2fs: %u inodes, %u blocks\n", superBlock.s_inodes_count, superBlock.s_blocks_count);
|
kprintf("ext2fs: %u inodes, %u blocks\n", super_block.s_inodes_count, super_block.s_blocks_count);
|
||||||
kprintf("ext2fs: block size = %u\n", EXT2_BLOCK_SIZE(&superBlock));
|
kprintf("ext2fs: block size = %u\n", EXT2_BLOCK_SIZE(&super_block));
|
||||||
kprintf("ext2fs: first data block = %u\n", superBlock.s_first_data_block);
|
kprintf("ext2fs: first data block = %u\n", super_block.s_first_data_block);
|
||||||
kprintf("ext2fs: inodes per block = %u\n", inodes_per_block());
|
kprintf("ext2fs: inodes per block = %u\n", inodes_per_block());
|
||||||
kprintf("ext2fs: inodes per group = %u\n", inodes_per_group());
|
kprintf("ext2fs: inodes per group = %u\n", inodes_per_group());
|
||||||
kprintf("ext2fs: free inodes = %u\n", superBlock.s_free_inodes_count);
|
kprintf("ext2fs: free inodes = %u\n", super_block.s_free_inodes_count);
|
||||||
kprintf("ext2fs: desc per block = %u\n", EXT2_DESC_PER_BLOCK(&superBlock));
|
kprintf("ext2fs: desc per block = %u\n", EXT2_DESC_PER_BLOCK(&super_block));
|
||||||
kprintf("ext2fs: desc size = %u\n", EXT2_DESC_SIZE(&superBlock));
|
kprintf("ext2fs: desc size = %u\n", EXT2_DESC_SIZE(&super_block));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
setBlockSize(EXT2_BLOCK_SIZE(&superBlock));
|
set_block_size(EXT2_BLOCK_SIZE(&super_block));
|
||||||
|
|
||||||
m_blockGroupCount = ceilDiv(superBlock.s_blocks_count, superBlock.s_blocks_per_group);
|
m_block_group_count = ceil_div(super_block.s_blocks_count, super_block.s_blocks_per_group);
|
||||||
|
|
||||||
if (m_blockGroupCount == 0) {
|
if (m_block_group_count == 0) {
|
||||||
kprintf("ext2fs: no block groups :(\n");
|
kprintf("ext2fs: no block groups :(\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -109,7 +109,7 @@ bool Ext2FS::initialize()
|
||||||
group_descriptor(0);
|
group_descriptor(0);
|
||||||
|
|
||||||
#ifdef EXT2_DEBUG
|
#ifdef EXT2_DEBUG
|
||||||
for (unsigned i = 1; i <= m_blockGroupCount; ++i) {
|
for (unsigned i = 1; i <= m_block_group_count; ++i) {
|
||||||
auto& group = group_descriptor(i);
|
auto& group = group_descriptor(i);
|
||||||
kprintf("ext2fs: group[%u] { block_bitmap: %u, inode_bitmap: %u, inode_table: %u }\n",
|
kprintf("ext2fs: group[%u] { block_bitmap: %u, inode_bitmap: %u, inode_table: %u }\n",
|
||||||
i,
|
i,
|
||||||
|
@ -132,23 +132,23 @@ InodeIdentifier Ext2FS::root_inode() const
|
||||||
return { fsid(), EXT2_ROOT_INO };
|
return { fsid(), EXT2_ROOT_INO };
|
||||||
}
|
}
|
||||||
|
|
||||||
ByteBuffer Ext2FS::read_block_containing_inode(unsigned inode, unsigned& blockIndex, unsigned& offset) const
|
ByteBuffer Ext2FS::read_block_containing_inode(unsigned inode, unsigned& block_index, unsigned& offset) const
|
||||||
{
|
{
|
||||||
auto& superBlock = this->super_block();
|
auto& super_block = this->super_block();
|
||||||
|
|
||||||
if (inode != EXT2_ROOT_INO && inode < EXT2_FIRST_INO(&superBlock))
|
if (inode != EXT2_ROOT_INO && inode < EXT2_FIRST_INO(&super_block))
|
||||||
return { };
|
return { };
|
||||||
|
|
||||||
if (inode > superBlock.s_inodes_count)
|
if (inode > super_block.s_inodes_count)
|
||||||
return { };
|
return { };
|
||||||
|
|
||||||
auto& bgd = group_descriptor(group_index_from_inode(inode));
|
auto& bgd = group_descriptor(group_index_from_inode(inode));
|
||||||
|
|
||||||
offset = ((inode - 1) % inodes_per_group()) * inode_size();
|
offset = ((inode - 1) % inodes_per_group()) * inode_size();
|
||||||
blockIndex = bgd.bg_inode_table + (offset >> EXT2_BLOCK_SIZE_BITS(&superBlock));
|
block_index = bgd.bg_inode_table + (offset >> EXT2_BLOCK_SIZE_BITS(&super_block));
|
||||||
offset &= blockSize() - 1;
|
offset &= block_size() - 1;
|
||||||
|
|
||||||
return readBlock(blockIndex);
|
return read_block(block_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ext2FS::BlockListShape Ext2FS::compute_block_list_shape(unsigned blocks)
|
Ext2FS::BlockListShape Ext2FS::compute_block_list_shape(unsigned blocks)
|
||||||
|
@ -192,7 +192,7 @@ bool Ext2FS::write_block_list_for_inode(InodeIndex inode_index, ext2_inode& e2in
|
||||||
set_block_allocation_state(group_index_from_inode(inode_index), bi, true);
|
set_block_allocation_state(group_index_from_inode(inode_index), bi, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
e2inode.i_blocks = (blocks.size() + new_shape.meta_blocks) * (blockSize() / 512);
|
e2inode.i_blocks = (blocks.size() + new_shape.meta_blocks) * (block_size() / 512);
|
||||||
|
|
||||||
unsigned output_block_index = 0;
|
unsigned output_block_index = 0;
|
||||||
unsigned remaining_blocks = blocks.size();
|
unsigned remaining_blocks = blocks.size();
|
||||||
|
@ -212,7 +212,7 @@ bool Ext2FS::write_block_list_for_inode(InodeIndex inode_index, ext2_inode& e2in
|
||||||
|
|
||||||
{
|
{
|
||||||
dbgprintf("Ext2FS: Writing out indirect blockptr block for inode %u\n", inode_index);
|
dbgprintf("Ext2FS: Writing out indirect blockptr block for inode %u\n", inode_index);
|
||||||
auto block_contents = ByteBuffer::create_uninitialized(blockSize());
|
auto block_contents = ByteBuffer::create_uninitialized(block_size());
|
||||||
BufferStream stream(block_contents);
|
BufferStream stream(block_contents);
|
||||||
ASSERT(new_shape.indirect_blocks <= EXT2_ADDR_PER_BLOCK(&super_block()));
|
ASSERT(new_shape.indirect_blocks <= EXT2_ADDR_PER_BLOCK(&super_block()));
|
||||||
for (unsigned i = 0; i < new_shape.indirect_blocks; ++i) {
|
for (unsigned i = 0; i < new_shape.indirect_blocks; ++i) {
|
||||||
|
@ -220,7 +220,7 @@ bool Ext2FS::write_block_list_for_inode(InodeIndex inode_index, ext2_inode& e2in
|
||||||
--remaining_blocks;
|
--remaining_blocks;
|
||||||
}
|
}
|
||||||
stream.fill_to_end(0);
|
stream.fill_to_end(0);
|
||||||
writeBlock(e2inode.i_block[EXT2_IND_BLOCK], block_contents);
|
write_block(e2inode.i_block[EXT2_IND_BLOCK], block_contents);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!remaining_blocks)
|
if (!remaining_blocks)
|
||||||
|
@ -232,11 +232,11 @@ bool Ext2FS::write_block_list_for_inode(InodeIndex inode_index, ext2_inode& e2in
|
||||||
|
|
||||||
Vector<unsigned> Ext2FS::block_list_for_inode(const ext2_inode& e2inode, bool include_block_list_blocks) const
|
Vector<unsigned> Ext2FS::block_list_for_inode(const ext2_inode& e2inode, bool include_block_list_blocks) const
|
||||||
{
|
{
|
||||||
unsigned entriesPerBlock = EXT2_ADDR_PER_BLOCK(&super_block());
|
unsigned entries_per_block = EXT2_ADDR_PER_BLOCK(&super_block());
|
||||||
|
|
||||||
// NOTE: i_blocks is number of 512-byte blocks, not number of fs-blocks.
|
// NOTE: i_blocks is number of 512-byte blocks, not number of fs-blocks.
|
||||||
unsigned blockCount = e2inode.i_blocks / (blockSize() / 512);
|
unsigned block_count = e2inode.i_blocks / (block_size() / 512);
|
||||||
unsigned blocksRemaining = blockCount;
|
unsigned blocksRemaining = block_count;
|
||||||
Vector<unsigned> list;
|
Vector<unsigned> list;
|
||||||
if (include_block_list_blocks) {
|
if (include_block_list_blocks) {
|
||||||
// This seems like an excessive over-estimate but w/e.
|
// This seems like an excessive over-estimate but w/e.
|
||||||
|
@ -245,8 +245,8 @@ Vector<unsigned> Ext2FS::block_list_for_inode(const ext2_inode& e2inode, bool in
|
||||||
list.ensure_capacity(blocksRemaining);
|
list.ensure_capacity(blocksRemaining);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned directCount = min(blockCount, (unsigned)EXT2_NDIR_BLOCKS);
|
unsigned direct_count = min(block_count, (unsigned)EXT2_NDIR_BLOCKS);
|
||||||
for (unsigned i = 0; i < directCount; ++i) {
|
for (unsigned i = 0; i < direct_count; ++i) {
|
||||||
list.unchecked_append(e2inode.i_block[i]);
|
list.unchecked_append(e2inode.i_block[i]);
|
||||||
--blocksRemaining;
|
--blocksRemaining;
|
||||||
}
|
}
|
||||||
|
@ -254,13 +254,13 @@ Vector<unsigned> Ext2FS::block_list_for_inode(const ext2_inode& e2inode, bool in
|
||||||
if (!blocksRemaining)
|
if (!blocksRemaining)
|
||||||
return list;
|
return list;
|
||||||
|
|
||||||
auto processBlockArray = [&] (unsigned arrayBlockIndex, auto&& callback) {
|
auto process_block_array = [&] (unsigned array_block_index, auto&& callback) {
|
||||||
if (include_block_list_blocks)
|
if (include_block_list_blocks)
|
||||||
callback(arrayBlockIndex);
|
callback(array_block_index);
|
||||||
auto arrayBlock = readBlock(arrayBlockIndex);
|
auto array_block = read_block(array_block_index);
|
||||||
ASSERT(arrayBlock);
|
ASSERT(array_block);
|
||||||
auto* array = reinterpret_cast<const __u32*>(arrayBlock.pointer());
|
auto* array = reinterpret_cast<const __u32*>(array_block.pointer());
|
||||||
unsigned count = min(blocksRemaining, entriesPerBlock);
|
unsigned count = min(blocksRemaining, entries_per_block);
|
||||||
for (unsigned i = 0; i < count; ++i) {
|
for (unsigned i = 0; i < count; ++i) {
|
||||||
if (!array[i]) {
|
if (!array[i]) {
|
||||||
blocksRemaining = 0;
|
blocksRemaining = 0;
|
||||||
|
@ -271,15 +271,15 @@ Vector<unsigned> Ext2FS::block_list_for_inode(const ext2_inode& e2inode, bool in
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
processBlockArray(e2inode.i_block[EXT2_IND_BLOCK], [&] (unsigned entry) {
|
process_block_array(e2inode.i_block[EXT2_IND_BLOCK], [&] (unsigned entry) {
|
||||||
list.unchecked_append(entry);
|
list.unchecked_append(entry);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!blocksRemaining)
|
if (!blocksRemaining)
|
||||||
return list;
|
return list;
|
||||||
|
|
||||||
processBlockArray(e2inode.i_block[EXT2_DIND_BLOCK], [&] (unsigned entry) {
|
process_block_array(e2inode.i_block[EXT2_DIND_BLOCK], [&] (unsigned entry) {
|
||||||
processBlockArray(entry, [&] (unsigned entry) {
|
process_block_array(entry, [&] (unsigned entry) {
|
||||||
list.unchecked_append(entry);
|
list.unchecked_append(entry);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -287,9 +287,9 @@ Vector<unsigned> Ext2FS::block_list_for_inode(const ext2_inode& e2inode, bool in
|
||||||
if (!blocksRemaining)
|
if (!blocksRemaining)
|
||||||
return list;
|
return list;
|
||||||
|
|
||||||
processBlockArray(e2inode.i_block[EXT2_TIND_BLOCK], [&] (unsigned entry) {
|
process_block_array(e2inode.i_block[EXT2_TIND_BLOCK], [&] (unsigned entry) {
|
||||||
processBlockArray(entry, [&] (unsigned entry) {
|
process_block_array(entry, [&] (unsigned entry) {
|
||||||
processBlockArray(entry, [&] (unsigned entry) {
|
process_block_array(entry, [&] (unsigned entry) {
|
||||||
list.unchecked_append(entry);
|
list.unchecked_append(entry);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -324,9 +324,9 @@ void Ext2FS::free_inode(Ext2FSInode& inode)
|
||||||
|
|
||||||
void Ext2FS::flush_block_group_descriptor_table()
|
void Ext2FS::flush_block_group_descriptor_table()
|
||||||
{
|
{
|
||||||
unsigned blocks_to_write = ceilDiv(m_blockGroupCount * (unsigned)sizeof(ext2_group_desc), blockSize());
|
unsigned blocks_to_write = ceil_div(m_block_group_count * (unsigned)sizeof(ext2_group_desc), block_size());
|
||||||
unsigned first_block_of_bgdt = blockSize() == 1024 ? 2 : 1;
|
unsigned first_block_of_bgdt = block_size() == 1024 ? 2 : 1;
|
||||||
writeBlocks(first_block_of_bgdt, blocks_to_write, m_cached_group_descriptor_table);
|
write_blocks(first_block_of_bgdt, blocks_to_write, m_cached_group_descriptor_table);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ext2FSInode::Ext2FSInode(Ext2FS& fs, unsigned index, const ext2_inode& raw_inode)
|
Ext2FSInode::Ext2FSInode(Ext2FS& fs, unsigned index, const ext2_inode& raw_inode)
|
||||||
|
@ -349,18 +349,18 @@ InodeMetadata Ext2FSInode::metadata() const
|
||||||
metadata.mode = m_raw_inode.i_mode;
|
metadata.mode = m_raw_inode.i_mode;
|
||||||
metadata.uid = m_raw_inode.i_uid;
|
metadata.uid = m_raw_inode.i_uid;
|
||||||
metadata.gid = m_raw_inode.i_gid;
|
metadata.gid = m_raw_inode.i_gid;
|
||||||
metadata.linkCount = m_raw_inode.i_links_count;
|
metadata.link_count = m_raw_inode.i_links_count;
|
||||||
metadata.atime = m_raw_inode.i_atime;
|
metadata.atime = m_raw_inode.i_atime;
|
||||||
metadata.ctime = m_raw_inode.i_ctime;
|
metadata.ctime = m_raw_inode.i_ctime;
|
||||||
metadata.mtime = m_raw_inode.i_mtime;
|
metadata.mtime = m_raw_inode.i_mtime;
|
||||||
metadata.dtime = m_raw_inode.i_dtime;
|
metadata.dtime = m_raw_inode.i_dtime;
|
||||||
metadata.blockSize = fs().blockSize();
|
metadata.block_size = fs().block_size();
|
||||||
metadata.blockCount = m_raw_inode.i_blocks;
|
metadata.block_count = m_raw_inode.i_blocks;
|
||||||
|
|
||||||
if (isBlockDevice(m_raw_inode.i_mode) || isCharacterDevice(m_raw_inode.i_mode)) {
|
if (::is_block_device(m_raw_inode.i_mode) || ::is_character_device(m_raw_inode.i_mode)) {
|
||||||
unsigned dev = m_raw_inode.i_block[0];
|
unsigned dev = m_raw_inode.i_block[0];
|
||||||
metadata.majorDevice = (dev & 0xfff00) >> 8;
|
metadata.major_device = (dev & 0xfff00) >> 8;
|
||||||
metadata.minorDevice = (dev & 0xff) | ((dev >> 12) & 0xfff00);
|
metadata.minor_device = (dev & 0xff) | ((dev >> 12) & 0xfff00);
|
||||||
}
|
}
|
||||||
return metadata;
|
return metadata;
|
||||||
}
|
}
|
||||||
|
@ -414,7 +414,7 @@ RetainPtr<Inode> Ext2FS::get_inode(InodeIdentifier inode) const
|
||||||
if (it != m_inode_cache.end())
|
if (it != m_inode_cache.end())
|
||||||
return (*it).value;
|
return (*it).value;
|
||||||
auto new_inode = adopt(*new Ext2FSInode(const_cast<Ext2FS&>(*this), inode.index(), *raw_inode));
|
auto new_inode = adopt(*new Ext2FSInode(const_cast<Ext2FS&>(*this), inode.index(), *raw_inode));
|
||||||
m_inode_cache.set(inode.index(), new_inode.copyRef());
|
m_inode_cache.set(inode.index(), new_inode.copy_ref());
|
||||||
return new_inode;
|
return new_inode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -445,7 +445,7 @@ ssize_t Ext2FSInode::read_bytes(off_t offset, size_t count, byte* buffer, FileDe
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
const size_t block_size = fs().blockSize();
|
const size_t block_size = fs().block_size();
|
||||||
|
|
||||||
dword first_block_logical_index = offset / block_size;
|
dword first_block_logical_index = offset / block_size;
|
||||||
dword last_block_logical_index = (offset + count) / block_size;
|
dword last_block_logical_index = (offset + count) / block_size;
|
||||||
|
@ -464,9 +464,9 @@ ssize_t Ext2FSInode::read_bytes(off_t offset, size_t count, byte* buffer, FileDe
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (dword bi = first_block_logical_index; remaining_count && bi <= last_block_logical_index; ++bi) {
|
for (dword bi = first_block_logical_index; remaining_count && bi <= last_block_logical_index; ++bi) {
|
||||||
auto block = fs().readBlock(m_block_list[bi]);
|
auto block = fs().read_block(m_block_list[bi]);
|
||||||
if (!block) {
|
if (!block) {
|
||||||
kprintf("ext2fs: read_bytes: readBlock(%u) failed (lbi: %u)\n", m_block_list[bi], bi);
|
kprintf("ext2fs: read_bytes: read_block(%u) failed (lbi: %u)\n", m_block_list[bi], bi);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -490,11 +490,11 @@ ssize_t Ext2FSInode::write_bytes(off_t offset, size_t count, const byte* data, F
|
||||||
|
|
||||||
ASSERT(offset >= 0);
|
ASSERT(offset >= 0);
|
||||||
|
|
||||||
const size_t block_size = fs().blockSize();
|
const size_t block_size = fs().block_size();
|
||||||
size_t new_size = max(static_cast<size_t>(offset) + count, size());
|
size_t new_size = max(static_cast<size_t>(offset) + count, size());
|
||||||
|
|
||||||
unsigned blocks_needed_before = ceilDiv(size(), block_size);
|
unsigned blocks_needed_before = ceil_div(size(), block_size);
|
||||||
unsigned blocks_needed_after = ceilDiv(new_size, block_size);
|
unsigned blocks_needed_after = ceil_div(new_size, block_size);
|
||||||
|
|
||||||
auto block_list = fs().block_list_for_inode(m_raw_inode);
|
auto block_list = fs().block_list_for_inode(m_raw_inode);
|
||||||
if (blocks_needed_after > blocks_needed_before) {
|
if (blocks_needed_after > blocks_needed_before) {
|
||||||
|
@ -529,9 +529,9 @@ ssize_t Ext2FSInode::write_bytes(off_t offset, size_t count, const byte* data, F
|
||||||
|
|
||||||
ByteBuffer block;
|
ByteBuffer block;
|
||||||
if (offset_into_block != 0) {
|
if (offset_into_block != 0) {
|
||||||
block = fs().readBlock(block_list[bi]);
|
block = fs().read_block(block_list[bi]);
|
||||||
if (!block) {
|
if (!block) {
|
||||||
kprintf("Ext2FSInode::write_bytes: readBlock(%u) failed (lbi: %u)\n", block_list[bi], bi);
|
kprintf("Ext2FSInode::write_bytes: read_block(%u) failed (lbi: %u)\n", block_list[bi], bi);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
|
@ -543,9 +543,9 @@ ssize_t Ext2FSInode::write_bytes(off_t offset, size_t count, const byte* data, F
|
||||||
#ifdef EXT2_DEBUG
|
#ifdef EXT2_DEBUG
|
||||||
dbgprintf("Ext2FSInode::write_bytes: writing block %u (offset_into_block: %u)\n", block_list[bi], offset_into_block);
|
dbgprintf("Ext2FSInode::write_bytes: writing block %u (offset_into_block: %u)\n", block_list[bi], offset_into_block);
|
||||||
#endif
|
#endif
|
||||||
bool success = fs().writeBlock(block_list[bi], block);
|
bool success = fs().write_block(block_list[bi], block);
|
||||||
if (!success) {
|
if (!success) {
|
||||||
kprintf("Ext2FSInode::write_bytes: writeBlock(%u) failed (lbi: %u)\n", block_list[bi], bi);
|
kprintf("Ext2FSInode::write_bytes: write_block(%u) failed (lbi: %u)\n", block_list[bi], bi);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
remaining_count -= num_bytes_to_copy;
|
remaining_count -= num_bytes_to_copy;
|
||||||
|
@ -569,7 +569,7 @@ ssize_t Ext2FSInode::write_bytes(off_t offset, size_t count, const byte* data, F
|
||||||
|
|
||||||
bool Ext2FSInode::traverse_as_directory(Function<bool(const FS::DirectoryEntry&)> callback) const
|
bool Ext2FSInode::traverse_as_directory(Function<bool(const FS::DirectoryEntry&)> callback) const
|
||||||
{
|
{
|
||||||
ASSERT(metadata().isDirectory());
|
ASSERT(metadata().is_directory());
|
||||||
|
|
||||||
#ifdef EXT2_DEBUG
|
#ifdef EXT2_DEBUG
|
||||||
kprintf("Ext2Inode::traverse_as_directory: inode=%u:\n", index());
|
kprintf("Ext2Inode::traverse_as_directory: inode=%u:\n", index());
|
||||||
|
@ -676,40 +676,40 @@ bool Ext2FS::write_directory_inode(unsigned directoryInode, Vector<DirectoryEntr
|
||||||
{
|
{
|
||||||
dbgprintf("Ext2FS: New directory inode %u contents to write:\n", directoryInode);
|
dbgprintf("Ext2FS: New directory inode %u contents to write:\n", directoryInode);
|
||||||
|
|
||||||
unsigned directorySize = 0;
|
unsigned directory_size = 0;
|
||||||
for (auto& entry : entries) {
|
for (auto& entry : entries) {
|
||||||
//kprintf(" - %08u %s\n", entry.inode.index(), entry.name);
|
//kprintf(" - %08u %s\n", entry.inode.index(), entry.name);
|
||||||
directorySize += EXT2_DIR_REC_LEN(entry.name_length);
|
directory_size += EXT2_DIR_REC_LEN(entry.name_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned blocksNeeded = ceilDiv(directorySize, blockSize());
|
unsigned blocks_needed = ceil_div(directory_size, block_size());
|
||||||
unsigned occupiedSize = blocksNeeded * blockSize();
|
unsigned occupied_size = blocks_needed * block_size();
|
||||||
|
|
||||||
dbgprintf("Ext2FS: directory size: %u (occupied: %u)\n", directorySize, occupiedSize);
|
dbgprintf("Ext2FS: directory size: %u (occupied: %u)\n", directory_size, occupied_size);
|
||||||
|
|
||||||
auto directoryData = ByteBuffer::create_uninitialized(occupiedSize);
|
auto directory_data = ByteBuffer::create_uninitialized(occupied_size);
|
||||||
|
|
||||||
BufferStream stream(directoryData);
|
BufferStream stream(directory_data);
|
||||||
for (unsigned i = 0; i < entries.size(); ++i) {
|
for (unsigned i = 0; i < entries.size(); ++i) {
|
||||||
auto& entry = entries[i];
|
auto& entry = entries[i];
|
||||||
|
|
||||||
unsigned recordLength = EXT2_DIR_REC_LEN(entry.name_length);
|
unsigned record_length = EXT2_DIR_REC_LEN(entry.name_length);
|
||||||
if (i == entries.size() - 1)
|
if (i == entries.size() - 1)
|
||||||
recordLength += occupiedSize - directorySize;
|
record_length += occupied_size - directory_size;
|
||||||
|
|
||||||
dbgprintf("* inode: %u", entry.inode.index());
|
dbgprintf("* inode: %u", entry.inode.index());
|
||||||
dbgprintf(", name_len: %u", word(entry.name_length));
|
dbgprintf(", name_len: %u", word(entry.name_length));
|
||||||
dbgprintf(", rec_len: %u", word(recordLength));
|
dbgprintf(", rec_len: %u", word(record_length));
|
||||||
dbgprintf(", file_type: %u", byte(entry.fileType));
|
dbgprintf(", file_type: %u", byte(entry.file_type));
|
||||||
dbgprintf(", name: %s\n", entry.name);
|
dbgprintf(", name: %s\n", entry.name);
|
||||||
|
|
||||||
stream << dword(entry.inode.index());
|
stream << dword(entry.inode.index());
|
||||||
stream << word(recordLength);
|
stream << word(record_length);
|
||||||
stream << byte(entry.name_length);
|
stream << byte(entry.name_length);
|
||||||
stream << byte(entry.fileType);
|
stream << byte(entry.file_type);
|
||||||
stream << entry.name;
|
stream << entry.name;
|
||||||
|
|
||||||
unsigned padding = recordLength - entry.name_length - 8;
|
unsigned padding = record_length - entry.name_length - 8;
|
||||||
//dbgprintf(" *** pad %u bytes\n", padding);
|
//dbgprintf(" *** pad %u bytes\n", padding);
|
||||||
for (unsigned j = 0; j < padding; ++j) {
|
for (unsigned j = 0; j < padding; ++j) {
|
||||||
stream << byte(0);
|
stream << byte(0);
|
||||||
|
@ -719,9 +719,9 @@ bool Ext2FS::write_directory_inode(unsigned directoryInode, Vector<DirectoryEntr
|
||||||
stream.fill_to_end(0);
|
stream.fill_to_end(0);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
kprintf("data to write (%u):\n", directoryData.size());
|
kprintf("data to write (%u):\n", directory_data.size());
|
||||||
for (unsigned i = 0; i < directoryData.size(); ++i) {
|
for (unsigned i = 0; i < directory_data.size(); ++i) {
|
||||||
kprintf("%02x ", directoryData[i]);
|
kprintf("%02x ", directory_data[i]);
|
||||||
if ((i + 1) % 8 == 0)
|
if ((i + 1) % 8 == 0)
|
||||||
kprintf(" ");
|
kprintf(" ");
|
||||||
if ((i + 1) % 16 == 0)
|
if ((i + 1) % 16 == 0)
|
||||||
|
@ -731,8 +731,8 @@ bool Ext2FS::write_directory_inode(unsigned directoryInode, Vector<DirectoryEntr
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
auto directory_inode = get_inode({ fsid(), directoryInode });
|
auto directory_inode = get_inode({ fsid(), directoryInode });
|
||||||
ssize_t nwritten = directory_inode->write_bytes(0, directoryData.size(), directoryData.pointer(), nullptr);
|
ssize_t nwritten = directory_inode->write_bytes(0, directory_data.size(), directory_data.pointer(), nullptr);
|
||||||
return nwritten == directoryData.size();
|
return nwritten == directory_data.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned Ext2FS::inodes_per_block() const
|
unsigned Ext2FS::inodes_per_block() const
|
||||||
|
@ -757,19 +757,19 @@ unsigned Ext2FS::blocks_per_group() const
|
||||||
|
|
||||||
void Ext2FS::dump_block_bitmap(unsigned groupIndex) const
|
void Ext2FS::dump_block_bitmap(unsigned groupIndex) const
|
||||||
{
|
{
|
||||||
ASSERT(groupIndex <= m_blockGroupCount);
|
ASSERT(groupIndex <= m_block_group_count);
|
||||||
auto& bgd = group_descriptor(groupIndex);
|
auto& bgd = group_descriptor(groupIndex);
|
||||||
|
|
||||||
unsigned blocksInGroup = min(blocks_per_group(), super_block().s_blocks_count);
|
unsigned blocks_in_group = min(blocks_per_group(), super_block().s_blocks_count);
|
||||||
unsigned blockCount = ceilDiv(blocksInGroup, 8u);
|
unsigned block_count = ceil_div(blocks_in_group, 8u);
|
||||||
|
|
||||||
auto bitmapBlocks = readBlocks(bgd.bg_block_bitmap, blockCount);
|
auto bitmap_blocks = read_blocks(bgd.bg_block_bitmap, block_count);
|
||||||
ASSERT(bitmapBlocks);
|
ASSERT(bitmap_blocks);
|
||||||
|
|
||||||
kprintf("ext2fs: group[%u] block bitmap (bitmap occupies %u blocks):\n", groupIndex, blockCount);
|
kprintf("ext2fs: group[%u] block bitmap (bitmap occupies %u blocks):\n", groupIndex, block_count);
|
||||||
|
|
||||||
auto bitmap = Bitmap::wrap(bitmapBlocks.pointer(), blocksInGroup);
|
auto bitmap = Bitmap::wrap(bitmap_blocks.pointer(), blocks_in_group);
|
||||||
for (unsigned i = 0; i < blocksInGroup; ++i) {
|
for (unsigned i = 0; i < blocks_in_group; ++i) {
|
||||||
kprintf("%c", bitmap.get(i) ? '1' : '0');
|
kprintf("%c", bitmap.get(i) ? '1' : '0');
|
||||||
}
|
}
|
||||||
kprintf("\n");
|
kprintf("\n");
|
||||||
|
@ -787,17 +787,17 @@ void Ext2FS::dump_inode_bitmap(unsigned groupIndex) const
|
||||||
template<typename F>
|
template<typename F>
|
||||||
void Ext2FS::traverse_inode_bitmap(unsigned groupIndex, F callback) const
|
void Ext2FS::traverse_inode_bitmap(unsigned groupIndex, F callback) const
|
||||||
{
|
{
|
||||||
ASSERT(groupIndex <= m_blockGroupCount);
|
ASSERT(groupIndex <= m_block_group_count);
|
||||||
auto& bgd = group_descriptor(groupIndex);
|
auto& bgd = group_descriptor(groupIndex);
|
||||||
|
|
||||||
unsigned inodesInGroup = min(inodes_per_group(), super_block().s_inodes_count);
|
unsigned inodes_in_group = min(inodes_per_group(), super_block().s_inodes_count);
|
||||||
unsigned blockCount = ceilDiv(inodesInGroup, 8u);
|
unsigned block_count = ceil_div(inodes_in_group, 8u);
|
||||||
|
|
||||||
for (unsigned i = 0; i < blockCount; ++i) {
|
for (unsigned i = 0; i < block_count; ++i) {
|
||||||
auto block = readBlock(bgd.bg_inode_bitmap + i);
|
auto block = read_block(bgd.bg_inode_bitmap + i);
|
||||||
ASSERT(block);
|
ASSERT(block);
|
||||||
bool shouldContinue = callback(i * (blockSize() / 8) + 1, Bitmap::wrap(block.pointer(), inodesInGroup));
|
bool should_continue = callback(i * (block_size() / 8) + 1, Bitmap::wrap(block.pointer(), inodes_in_group));
|
||||||
if (!shouldContinue)
|
if (!should_continue)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -805,30 +805,30 @@ void Ext2FS::traverse_inode_bitmap(unsigned groupIndex, F callback) const
|
||||||
template<typename F>
|
template<typename F>
|
||||||
void Ext2FS::traverse_block_bitmap(unsigned groupIndex, F callback) const
|
void Ext2FS::traverse_block_bitmap(unsigned groupIndex, F callback) const
|
||||||
{
|
{
|
||||||
ASSERT(groupIndex <= m_blockGroupCount);
|
ASSERT(groupIndex <= m_block_group_count);
|
||||||
auto& bgd = group_descriptor(groupIndex);
|
auto& bgd = group_descriptor(groupIndex);
|
||||||
|
|
||||||
unsigned blocksInGroup = min(blocks_per_group(), super_block().s_blocks_count);
|
unsigned blocks_in_group = min(blocks_per_group(), super_block().s_blocks_count);
|
||||||
unsigned blockCount = ceilDiv(blocksInGroup, 8u);
|
unsigned block_count = ceil_div(blocks_in_group, 8u);
|
||||||
|
|
||||||
for (unsigned i = 0; i < blockCount; ++i) {
|
for (unsigned i = 0; i < block_count; ++i) {
|
||||||
auto block = readBlock(bgd.bg_block_bitmap + i);
|
auto block = read_block(bgd.bg_block_bitmap + i);
|
||||||
ASSERT(block);
|
ASSERT(block);
|
||||||
bool shouldContinue = callback(i * (blockSize() / 8) + 1, Bitmap::wrap(block.pointer(), blocksInGroup));
|
bool should_continue = callback(i * (block_size() / 8) + 1, Bitmap::wrap(block.pointer(), blocks_in_group));
|
||||||
if (!shouldContinue)
|
if (!should_continue)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Ext2FS::write_ext2_inode(unsigned inode, const ext2_inode& e2inode)
|
bool Ext2FS::write_ext2_inode(unsigned inode, const ext2_inode& e2inode)
|
||||||
{
|
{
|
||||||
unsigned blockIndex;
|
unsigned block_index;
|
||||||
unsigned offset;
|
unsigned offset;
|
||||||
auto block = read_block_containing_inode(inode, blockIndex, offset);
|
auto block = read_block_containing_inode(inode, block_index, offset);
|
||||||
if (!block)
|
if (!block)
|
||||||
return false;
|
return false;
|
||||||
memcpy(reinterpret_cast<ext2_inode*>(block.offset_pointer(offset)), &e2inode, inode_size());
|
memcpy(reinterpret_cast<ext2_inode*>(block.offset_pointer(offset)), &e2inode, inode_size());
|
||||||
writeBlock(blockIndex, block);
|
write_block(block_index, block);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -864,36 +864,36 @@ Vector<Ext2FS::BlockIndex> Ext2FS::allocate_blocks(unsigned group, unsigned coun
|
||||||
return blocks;
|
return blocks;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned Ext2FS::allocate_inode(unsigned preferredGroup, unsigned expectedSize)
|
unsigned Ext2FS::allocate_inode(unsigned preferred_group, unsigned expected_size)
|
||||||
{
|
{
|
||||||
dbgprintf("Ext2FS: allocate_inode(preferredGroup: %u, expectedSize: %u)\n", preferredGroup, expectedSize);
|
dbgprintf("Ext2FS: allocate_inode(preferredGroup: %u, expectedSize: %u)\n", preferred_group, expected_size);
|
||||||
|
|
||||||
unsigned neededBlocks = ceilDiv(expectedSize, blockSize());
|
unsigned needed_blocks = ceil_div(expected_size, block_size());
|
||||||
|
|
||||||
dbgprintf("Ext2FS: minimum needed blocks: %u\n", neededBlocks);
|
dbgprintf("Ext2FS: minimum needed blocks: %u\n", needed_blocks);
|
||||||
|
|
||||||
unsigned groupIndex = 0;
|
unsigned groupIndex = 0;
|
||||||
|
|
||||||
auto isSuitableGroup = [this, neededBlocks] (unsigned groupIndex) {
|
auto is_suitable_group = [this, needed_blocks] (unsigned groupIndex) {
|
||||||
auto& bgd = group_descriptor(groupIndex);
|
auto& bgd = group_descriptor(groupIndex);
|
||||||
return bgd.bg_free_inodes_count && bgd.bg_free_blocks_count >= neededBlocks;
|
return bgd.bg_free_inodes_count && bgd.bg_free_blocks_count >= needed_blocks;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (preferredGroup && isSuitableGroup(preferredGroup)) {
|
if (preferred_group && is_suitable_group(preferred_group)) {
|
||||||
groupIndex = preferredGroup;
|
groupIndex = preferred_group;
|
||||||
} else {
|
} else {
|
||||||
for (unsigned i = 1; i <= m_blockGroupCount; ++i) {
|
for (unsigned i = 1; i <= m_block_group_count; ++i) {
|
||||||
if (isSuitableGroup(i))
|
if (is_suitable_group(i))
|
||||||
groupIndex = i;
|
groupIndex = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!groupIndex) {
|
if (!groupIndex) {
|
||||||
kprintf("Ext2FS: allocate_inode: no suitable group found for new inode with %u blocks needed :(\n", neededBlocks);
|
kprintf("Ext2FS: allocate_inode: no suitable group found for new inode with %u blocks needed :(\n", needed_blocks);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
dbgprintf("Ext2FS: allocate_inode: found suitable group [%u] for new inode with %u blocks needed :^)\n", groupIndex, neededBlocks);
|
dbgprintf("Ext2FS: allocate_inode: found suitable group [%u] for new inode with %u blocks needed :^)\n", groupIndex, needed_blocks);
|
||||||
|
|
||||||
unsigned firstFreeInodeInGroup = 0;
|
unsigned firstFreeInodeInGroup = 0;
|
||||||
traverse_inode_bitmap(groupIndex, [&firstFreeInodeInGroup] (unsigned firstInodeInBitmap, const Bitmap& bitmap) {
|
traverse_inode_bitmap(groupIndex, [&firstFreeInodeInGroup] (unsigned firstInodeInBitmap, const Bitmap& bitmap) {
|
||||||
|
@ -931,10 +931,10 @@ bool Ext2FS::get_inode_allocation_state(InodeIndex index) const
|
||||||
if (index == 0)
|
if (index == 0)
|
||||||
return true;
|
return true;
|
||||||
auto& bgd = group_descriptor(group_index_from_inode(index));
|
auto& bgd = group_descriptor(group_index_from_inode(index));
|
||||||
unsigned inodes_per_bitmap_block = blockSize() * 8;
|
unsigned inodes_per_bitmap_block = block_size() * 8;
|
||||||
unsigned bitmap_block_index = (index - 1) / inodes_per_bitmap_block;
|
unsigned bitmap_block_index = (index - 1) / inodes_per_bitmap_block;
|
||||||
unsigned bit_index = (index - 1) % inodes_per_bitmap_block;
|
unsigned bit_index = (index - 1) % inodes_per_bitmap_block;
|
||||||
auto block = readBlock(bgd.bg_inode_bitmap + bitmap_block_index);
|
auto block = read_block(bgd.bg_inode_bitmap + bitmap_block_index);
|
||||||
ASSERT(block);
|
ASSERT(block);
|
||||||
auto bitmap = Bitmap::wrap(block.pointer(), block.size());
|
auto bitmap = Bitmap::wrap(block.pointer(), block.size());
|
||||||
return bitmap.get(bit_index);
|
return bitmap.get(bit_index);
|
||||||
|
@ -945,20 +945,20 @@ bool Ext2FS::set_inode_allocation_state(unsigned index, bool newState)
|
||||||
auto& bgd = group_descriptor(group_index_from_inode(index));
|
auto& bgd = group_descriptor(group_index_from_inode(index));
|
||||||
|
|
||||||
// Update inode bitmap
|
// Update inode bitmap
|
||||||
unsigned inodes_per_bitmap_block = blockSize() * 8;
|
unsigned inodes_per_bitmap_block = block_size() * 8;
|
||||||
unsigned bitmap_block_index = (index - 1) / inodes_per_bitmap_block;
|
unsigned bitmap_block_index = (index - 1) / inodes_per_bitmap_block;
|
||||||
unsigned bit_index = (index - 1) % inodes_per_bitmap_block;
|
unsigned bit_index = (index - 1) % inodes_per_bitmap_block;
|
||||||
auto block = readBlock(bgd.bg_inode_bitmap + bitmap_block_index);
|
auto block = read_block(bgd.bg_inode_bitmap + bitmap_block_index);
|
||||||
ASSERT(block);
|
ASSERT(block);
|
||||||
auto bitmap = Bitmap::wrap(block.pointer(), block.size());
|
auto bitmap = Bitmap::wrap(block.pointer(), block.size());
|
||||||
bool currentState = bitmap.get(bit_index);
|
bool current_state = bitmap.get(bit_index);
|
||||||
dbgprintf("Ext2FS: set_inode_allocation_state(%u) %u -> %u\n", index, currentState, newState);
|
dbgprintf("Ext2FS: set_inode_allocation_state(%u) %u -> %u\n", index, current_state, newState);
|
||||||
|
|
||||||
if (currentState == newState)
|
if (current_state == newState)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
bitmap.set(bit_index, newState);
|
bitmap.set(bit_index, newState);
|
||||||
writeBlock(bgd.bg_inode_bitmap + bitmap_block_index, block);
|
write_block(bgd.bg_inode_bitmap + bitmap_block_index, block);
|
||||||
|
|
||||||
// Update superblock
|
// Update superblock
|
||||||
auto& sb = *reinterpret_cast<ext2_super_block*>(m_cached_super_block.pointer());
|
auto& sb = *reinterpret_cast<ext2_super_block*>(m_cached_super_block.pointer());
|
||||||
|
@ -970,53 +970,53 @@ bool Ext2FS::set_inode_allocation_state(unsigned index, bool newState)
|
||||||
write_super_block(sb);
|
write_super_block(sb);
|
||||||
|
|
||||||
// Update BGD
|
// Update BGD
|
||||||
auto& mutableBGD = const_cast<ext2_group_desc&>(bgd);
|
auto& mutable_bgd = const_cast<ext2_group_desc&>(bgd);
|
||||||
if (newState)
|
if (newState)
|
||||||
--mutableBGD.bg_free_inodes_count;
|
--mutable_bgd.bg_free_inodes_count;
|
||||||
else
|
else
|
||||||
++mutableBGD.bg_free_inodes_count;
|
++mutable_bgd.bg_free_inodes_count;
|
||||||
dbgprintf("Ext2FS: group free inode count %u -> %u\n", bgd.bg_free_inodes_count, bgd.bg_free_inodes_count - 1);
|
dbgprintf("Ext2FS: group free inode count %u -> %u\n", bgd.bg_free_inodes_count, bgd.bg_free_inodes_count - 1);
|
||||||
|
|
||||||
flush_block_group_descriptor_table();
|
flush_block_group_descriptor_table();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Ext2FS::set_block_allocation_state(GroupIndex group, BlockIndex bi, bool newState)
|
bool Ext2FS::set_block_allocation_state(GroupIndex group, BlockIndex bi, bool new_state)
|
||||||
{
|
{
|
||||||
dbgprintf("Ext2FS: set_block_allocation_state(group=%u, block=%u, state=%u)\n", group, bi, newState);
|
dbgprintf("Ext2FS: set_block_allocation_state(group=%u, block=%u, state=%u)\n", group, bi, new_state);
|
||||||
auto& bgd = group_descriptor(group);
|
auto& bgd = group_descriptor(group);
|
||||||
|
|
||||||
// Update block bitmap
|
// Update block bitmap
|
||||||
unsigned blocksPerBitmapBlock = blockSize() * 8;
|
unsigned blocks_per_bitmap_block = block_size() * 8;
|
||||||
unsigned bitmapBlockIndex = (bi - 1) / blocksPerBitmapBlock;
|
unsigned bitmap_block_index = (bi - 1) / blocks_per_bitmap_block;
|
||||||
unsigned bitIndex = (bi - 1) % blocksPerBitmapBlock;
|
unsigned bit_index = (bi - 1) % blocks_per_bitmap_block;
|
||||||
auto block = readBlock(bgd.bg_block_bitmap + bitmapBlockIndex);
|
auto block = read_block(bgd.bg_block_bitmap + bitmap_block_index);
|
||||||
ASSERT(block);
|
ASSERT(block);
|
||||||
auto bitmap = Bitmap::wrap(block.pointer(), blocksPerBitmapBlock);
|
auto bitmap = Bitmap::wrap(block.pointer(), blocks_per_bitmap_block);
|
||||||
bool currentState = bitmap.get(bitIndex);
|
bool current_state = bitmap.get(bit_index);
|
||||||
dbgprintf("Ext2FS: block %u state: %u -> %u\n", bi, currentState, newState);
|
dbgprintf("Ext2FS: block %u state: %u -> %u\n", bi, current_state, new_state);
|
||||||
|
|
||||||
if (currentState == newState)
|
if (current_state == new_state)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
bitmap.set(bitIndex, newState);
|
bitmap.set(bit_index, new_state);
|
||||||
writeBlock(bgd.bg_block_bitmap + bitmapBlockIndex, block);
|
write_block(bgd.bg_block_bitmap + bitmap_block_index, block);
|
||||||
|
|
||||||
// Update superblock
|
// Update superblock
|
||||||
auto& sb = *reinterpret_cast<ext2_super_block*>(m_cached_super_block.pointer());
|
auto& sb = *reinterpret_cast<ext2_super_block*>(m_cached_super_block.pointer());
|
||||||
dbgprintf("Ext2FS: superblock free block count %u -> %u\n", sb.s_free_blocks_count, sb.s_free_blocks_count - 1);
|
dbgprintf("Ext2FS: superblock free block count %u -> %u\n", sb.s_free_blocks_count, sb.s_free_blocks_count - 1);
|
||||||
if (newState)
|
if (new_state)
|
||||||
--sb.s_free_blocks_count;
|
--sb.s_free_blocks_count;
|
||||||
else
|
else
|
||||||
++sb.s_free_blocks_count;
|
++sb.s_free_blocks_count;
|
||||||
write_super_block(sb);
|
write_super_block(sb);
|
||||||
|
|
||||||
// Update BGD
|
// Update BGD
|
||||||
auto& mutableBGD = const_cast<ext2_group_desc&>(bgd);
|
auto& mutable_bgd = const_cast<ext2_group_desc&>(bgd);
|
||||||
if (newState)
|
if (new_state)
|
||||||
--mutableBGD.bg_free_blocks_count;
|
--mutable_bgd.bg_free_blocks_count;
|
||||||
else
|
else
|
||||||
++mutableBGD.bg_free_blocks_count;
|
++mutable_bgd.bg_free_blocks_count;
|
||||||
dbgprintf("Ext2FS: group free block count %u -> %u\n", bgd.bg_free_blocks_count, bgd.bg_free_blocks_count - 1);
|
dbgprintf("Ext2FS: group free block count %u -> %u\n", bgd.bg_free_blocks_count, bgd.bg_free_blocks_count - 1);
|
||||||
|
|
||||||
flush_block_group_descriptor_table();
|
flush_block_group_descriptor_table();
|
||||||
|
@ -1034,7 +1034,7 @@ RetainPtr<Inode> Ext2FS::create_directory(InodeIdentifier parent_id, const Strin
|
||||||
|
|
||||||
// NOTE: When creating a new directory, make the size 1 block.
|
// NOTE: When creating a new directory, make the size 1 block.
|
||||||
// There's probably a better strategy here, but this works for now.
|
// There's probably a better strategy here, but this works for now.
|
||||||
auto inode = create_inode(parent_id, name, mode, blockSize(), error);
|
auto inode = create_inode(parent_id, name, mode, block_size(), error);
|
||||||
if (!inode)
|
if (!inode)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
|
@ -1077,7 +1077,7 @@ RetainPtr<Inode> Ext2FS::create_inode(InodeIdentifier parent_id, const String& n
|
||||||
return { };
|
return { };
|
||||||
}
|
}
|
||||||
|
|
||||||
auto needed_blocks = ceilDiv(size, blockSize());
|
auto needed_blocks = ceil_div(size, block_size());
|
||||||
auto blocks = allocate_blocks(group_index_from_inode(inode_id), needed_blocks);
|
auto blocks = allocate_blocks(group_index_from_inode(inode_id), needed_blocks);
|
||||||
if (blocks.size() != needed_blocks) {
|
if (blocks.size() != needed_blocks) {
|
||||||
kprintf("Ext2FS: create_inode: allocate_blocks failed\n");
|
kprintf("Ext2FS: create_inode: allocate_blocks failed\n");
|
||||||
|
@ -1085,24 +1085,24 @@ RetainPtr<Inode> Ext2FS::create_inode(InodeIdentifier parent_id, const String& n
|
||||||
return { };
|
return { };
|
||||||
}
|
}
|
||||||
|
|
||||||
byte fileType = 0;
|
byte file_type = 0;
|
||||||
if (isRegularFile(mode))
|
if (is_regular_file(mode))
|
||||||
fileType = EXT2_FT_REG_FILE;
|
file_type = EXT2_FT_REG_FILE;
|
||||||
else if (isDirectory(mode))
|
else if (is_directory(mode))
|
||||||
fileType = EXT2_FT_DIR;
|
file_type = EXT2_FT_DIR;
|
||||||
else if (isCharacterDevice(mode))
|
else if (is_character_device(mode))
|
||||||
fileType = EXT2_FT_CHRDEV;
|
file_type = EXT2_FT_CHRDEV;
|
||||||
else if (isBlockDevice(mode))
|
else if (is_block_device(mode))
|
||||||
fileType = EXT2_FT_BLKDEV;
|
file_type = EXT2_FT_BLKDEV;
|
||||||
else if (isFIFO(mode))
|
else if (is_fifo(mode))
|
||||||
fileType = EXT2_FT_FIFO;
|
file_type = EXT2_FT_FIFO;
|
||||||
else if (isSocket(mode))
|
else if (is_socket(mode))
|
||||||
fileType = EXT2_FT_SOCK;
|
file_type = EXT2_FT_SOCK;
|
||||||
else if (isSymbolicLink(mode))
|
else if (is_symlink(mode))
|
||||||
fileType = EXT2_FT_SYMLINK;
|
file_type = EXT2_FT_SYMLINK;
|
||||||
|
|
||||||
// Try adding it to the directory first, in case the name is already in use.
|
// Try adding it to the directory first, in case the name is already in use.
|
||||||
bool success = parent_inode->add_child({ fsid(), inode_id }, name, fileType, error);
|
bool success = parent_inode->add_child({ fsid(), inode_id }, name, file_type, error);
|
||||||
if (!success)
|
if (!success)
|
||||||
return { };
|
return { };
|
||||||
|
|
||||||
|
@ -1115,11 +1115,11 @@ RetainPtr<Inode> Ext2FS::create_inode(InodeIdentifier parent_id, const String& n
|
||||||
ASSERT(success);
|
ASSERT(success);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned initialLinksCount;
|
unsigned initial_links_count;
|
||||||
if (isDirectory(mode))
|
if (is_directory(mode))
|
||||||
initialLinksCount = 2; // (parent directory + "." entry in self)
|
initial_links_count = 2; // (parent directory + "." entry in self)
|
||||||
else
|
else
|
||||||
initialLinksCount = 1;
|
initial_links_count = 1;
|
||||||
|
|
||||||
auto timestamp = RTC::now();
|
auto timestamp = RTC::now();
|
||||||
ext2_inode e2inode;
|
ext2_inode e2inode;
|
||||||
|
@ -1132,7 +1132,7 @@ RetainPtr<Inode> Ext2FS::create_inode(InodeIdentifier parent_id, const String& n
|
||||||
e2inode.i_mtime = timestamp;
|
e2inode.i_mtime = timestamp;
|
||||||
e2inode.i_dtime = 0;
|
e2inode.i_dtime = 0;
|
||||||
e2inode.i_gid = 0;
|
e2inode.i_gid = 0;
|
||||||
e2inode.i_links_count = initialLinksCount;
|
e2inode.i_links_count = initial_links_count;
|
||||||
|
|
||||||
success = write_block_list_for_inode(inode_id, e2inode, blocks);
|
success = write_block_list_for_inode(inode_id, e2inode, blocks);
|
||||||
ASSERT(success);
|
ASSERT(success);
|
||||||
|
|
|
@ -18,7 +18,7 @@ public:
|
||||||
virtual ~Ext2FSInode() override;
|
virtual ~Ext2FSInode() override;
|
||||||
|
|
||||||
size_t size() const { return m_raw_inode.i_size; }
|
size_t size() const { return m_raw_inode.i_size; }
|
||||||
bool is_symlink() const { return isSymbolicLink(m_raw_inode.i_mode); }
|
bool is_symlink() const { return ::is_symlink(m_raw_inode.i_mode); }
|
||||||
|
|
||||||
// ^Inode (Retainable magic)
|
// ^Inode (Retainable magic)
|
||||||
virtual void one_retain_left() override;
|
virtual void one_retain_left() override;
|
||||||
|
@ -78,7 +78,7 @@ private:
|
||||||
unsigned inode_size() const;
|
unsigned inode_size() const;
|
||||||
|
|
||||||
bool write_ext2_inode(unsigned, const ext2_inode&);
|
bool write_ext2_inode(unsigned, const ext2_inode&);
|
||||||
ByteBuffer read_block_containing_inode(unsigned inode, unsigned& blockIndex, unsigned& offset) const;
|
ByteBuffer read_block_containing_inode(unsigned inode, unsigned& block_index, unsigned& offset) const;
|
||||||
|
|
||||||
ByteBuffer read_super_block() const;
|
ByteBuffer read_super_block() const;
|
||||||
bool write_super_block(const ext2_super_block&);
|
bool write_super_block(const ext2_super_block&);
|
||||||
|
@ -102,7 +102,7 @@ private:
|
||||||
template<typename F> void traverse_inode_bitmap(unsigned groupIndex, F) const;
|
template<typename F> void traverse_inode_bitmap(unsigned groupIndex, F) const;
|
||||||
template<typename F> void traverse_block_bitmap(unsigned groupIndex, F) const;
|
template<typename F> void traverse_block_bitmap(unsigned groupIndex, F) const;
|
||||||
|
|
||||||
bool add_inode_to_directory(InodeIndex parent, InodeIndex child, const String& name, byte fileType, int& error);
|
bool add_inode_to_directory(InodeIndex parent, InodeIndex child, const String& name, byte file_type, int& error);
|
||||||
bool write_directory_inode(unsigned directoryInode, Vector<DirectoryEntry>&&);
|
bool write_directory_inode(unsigned directoryInode, Vector<DirectoryEntry>&&);
|
||||||
bool get_inode_allocation_state(InodeIndex) const;
|
bool get_inode_allocation_state(InodeIndex) const;
|
||||||
bool set_inode_allocation_state(unsigned inode, bool);
|
bool set_inode_allocation_state(unsigned inode, bool);
|
||||||
|
@ -121,7 +121,7 @@ private:
|
||||||
|
|
||||||
BlockListShape compute_block_list_shape(unsigned blocks);
|
BlockListShape compute_block_list_shape(unsigned blocks);
|
||||||
|
|
||||||
unsigned m_blockGroupCount { 0 };
|
unsigned m_block_group_count { 0 };
|
||||||
|
|
||||||
mutable ByteBuffer m_cached_super_block;
|
mutable ByteBuffer m_cached_super_block;
|
||||||
mutable ByteBuffer m_cached_group_descriptor_table;
|
mutable ByteBuffer m_cached_group_descriptor_table;
|
||||||
|
|
|
@ -47,7 +47,7 @@ bool FileBackedDiskDevice::write_block(unsigned index, const byte* data)
|
||||||
bool FileBackedDiskDevice::read_internal(DiskOffset offset, unsigned length, byte* out) const
|
bool FileBackedDiskDevice::read_internal(DiskOffset offset, unsigned length, byte* out) const
|
||||||
{
|
{
|
||||||
#ifndef IGNORE_FILE_LENGTH
|
#ifndef IGNORE_FILE_LENGTH
|
||||||
if (offset + length >= m_fileLength)
|
if (offset + length >= m_file_length)
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
#ifdef FBBD_DEBUG
|
#ifdef FBBD_DEBUG
|
||||||
|
@ -62,7 +62,7 @@ bool FileBackedDiskDevice::read_internal(DiskOffset offset, unsigned length, byt
|
||||||
bool FileBackedDiskDevice::write_internal(DiskOffset offset, unsigned length, const byte* data)
|
bool FileBackedDiskDevice::write_internal(DiskOffset offset, unsigned length, const byte* data)
|
||||||
{
|
{
|
||||||
#ifndef IGNORE_FILE_LENGTH
|
#ifndef IGNORE_FILE_LENGTH
|
||||||
if (offset + length >= m_fileLength)
|
if (offset + length >= m_file_length)
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
#ifdef FBBD_DEBUG
|
#ifdef FBBD_DEBUG
|
||||||
|
|
|
@ -60,10 +60,10 @@ RetainPtr<FileDescriptor> FileDescriptor::clone()
|
||||||
: FileDescriptor::create_pipe_writer(*m_fifo);
|
: FileDescriptor::create_pipe_writer(*m_fifo);
|
||||||
} else {
|
} else {
|
||||||
if (m_device) {
|
if (m_device) {
|
||||||
descriptor = FileDescriptor::create(m_device.copyRef());
|
descriptor = FileDescriptor::create(m_device.copy_ref());
|
||||||
descriptor->m_inode = m_inode.copyRef();
|
descriptor->m_inode = m_inode.copy_ref();
|
||||||
} else {
|
} else {
|
||||||
descriptor = FileDescriptor::create(m_inode.copyRef());
|
descriptor = FileDescriptor::create(m_inode.copy_ref());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!descriptor)
|
if (!descriptor)
|
||||||
|
@ -74,7 +74,7 @@ RetainPtr<FileDescriptor> FileDescriptor::clone()
|
||||||
return descriptor;
|
return descriptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool additionWouldOverflow(off_t a, off_t b)
|
bool addition_would_overflow(off_t a, off_t b)
|
||||||
{
|
{
|
||||||
ASSERT(a > 0);
|
ASSERT(a > 0);
|
||||||
uint64_t ua = a;
|
uint64_t ua = a;
|
||||||
|
@ -88,19 +88,19 @@ int FileDescriptor::fstat(stat* buffer)
|
||||||
return -EBADF;
|
return -EBADF;
|
||||||
|
|
||||||
auto metadata = this->metadata();
|
auto metadata = this->metadata();
|
||||||
if (!metadata.isValid())
|
if (!metadata.is_valid())
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
buffer->st_dev = encodedDevice(metadata.majorDevice, metadata.minorDevice);
|
buffer->st_dev = encoded_device(metadata.major_device, metadata.minor_device);
|
||||||
buffer->st_ino = metadata.inode.index();
|
buffer->st_ino = metadata.inode.index();
|
||||||
buffer->st_mode = metadata.mode;
|
buffer->st_mode = metadata.mode;
|
||||||
buffer->st_nlink = metadata.linkCount;
|
buffer->st_nlink = metadata.link_count;
|
||||||
buffer->st_uid = metadata.uid;
|
buffer->st_uid = metadata.uid;
|
||||||
buffer->st_gid = metadata.gid;
|
buffer->st_gid = metadata.gid;
|
||||||
buffer->st_rdev = 0; // FIXME
|
buffer->st_rdev = 0; // FIXME
|
||||||
buffer->st_size = metadata.size;
|
buffer->st_size = metadata.size;
|
||||||
buffer->st_blksize = metadata.blockSize;
|
buffer->st_blksize = metadata.block_size;
|
||||||
buffer->st_blocks = metadata.blockCount;
|
buffer->st_blocks = metadata.block_count;
|
||||||
buffer->st_atime = metadata.atime;
|
buffer->st_atime = metadata.atime;
|
||||||
buffer->st_mtime = metadata.mtime;
|
buffer->st_mtime = metadata.mtime;
|
||||||
buffer->st_ctime = metadata.ctime;
|
buffer->st_ctime = metadata.ctime;
|
||||||
|
@ -116,10 +116,10 @@ off_t FileDescriptor::seek(off_t offset, int whence)
|
||||||
// FIXME: The file type should be cached on the vnode.
|
// FIXME: The file type should be cached on the vnode.
|
||||||
// It's silly that we have to do a full metadata lookup here.
|
// It's silly that we have to do a full metadata lookup here.
|
||||||
auto metadata = this->metadata();
|
auto metadata = this->metadata();
|
||||||
if (!metadata.isValid())
|
if (!metadata.is_valid())
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
if (metadata.isSocket() || metadata.isFIFO())
|
if (metadata.is_socket() || metadata.is_fifo())
|
||||||
return -ESPIPE;
|
return -ESPIPE;
|
||||||
|
|
||||||
off_t newOffset;
|
off_t newOffset;
|
||||||
|
@ -217,23 +217,23 @@ ByteBuffer FileDescriptor::read_entire_file(Process& process)
|
||||||
bool FileDescriptor::is_directory() const
|
bool FileDescriptor::is_directory() const
|
||||||
{
|
{
|
||||||
ASSERT(!is_fifo());
|
ASSERT(!is_fifo());
|
||||||
return metadata().isDirectory();
|
return metadata().is_directory();
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t FileDescriptor::get_dir_entries(byte* buffer, size_t size)
|
ssize_t FileDescriptor::get_dir_entries(byte* buffer, size_t size)
|
||||||
{
|
{
|
||||||
auto metadata = this->metadata();
|
auto metadata = this->metadata();
|
||||||
if (!metadata.isValid())
|
if (!metadata.is_valid())
|
||||||
return -EIO;
|
return -EIO;
|
||||||
if (!metadata.isDirectory())
|
if (!metadata.is_directory())
|
||||||
return -ENOTDIR;
|
return -ENOTDIR;
|
||||||
|
|
||||||
// FIXME: Compute the actual size needed.
|
// FIXME: Compute the actual size needed.
|
||||||
auto tempBuffer = ByteBuffer::create_uninitialized(2048);
|
auto temp_buffer = ByteBuffer::create_uninitialized(2048);
|
||||||
BufferStream stream(tempBuffer);
|
BufferStream stream(temp_buffer);
|
||||||
VFS::the().traverse_directory_inode(*m_inode, [&stream] (auto& entry) {
|
VFS::the().traverse_directory_inode(*m_inode, [&stream] (auto& entry) {
|
||||||
stream << (dword)entry.inode.index();
|
stream << (dword)entry.inode.index();
|
||||||
stream << (byte)entry.fileType;
|
stream << (byte)entry.file_type;
|
||||||
stream << (dword)entry.name_length;
|
stream << (dword)entry.name_length;
|
||||||
stream << entry.name;
|
stream << entry.name;
|
||||||
return true;
|
return true;
|
||||||
|
@ -242,7 +242,7 @@ ssize_t FileDescriptor::get_dir_entries(byte* buffer, size_t size)
|
||||||
if (size < stream.offset())
|
if (size < stream.offset())
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
memcpy(buffer, tempBuffer.pointer(), stream.offset());
|
memcpy(buffer, temp_buffer.pointer(), stream.offset());
|
||||||
return stream.offset();
|
return stream.offset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -76,7 +76,7 @@ ByteBuffer Inode::read_entire(FileDescriptor* descriptor) const
|
||||||
FS::DirectoryEntry::DirectoryEntry(const char* n, InodeIdentifier i, byte ft)
|
FS::DirectoryEntry::DirectoryEntry(const char* n, InodeIdentifier i, byte ft)
|
||||||
: name_length(strlen(n))
|
: name_length(strlen(n))
|
||||||
, inode(i)
|
, inode(i)
|
||||||
, fileType(ft)
|
, file_type(ft)
|
||||||
{
|
{
|
||||||
memcpy(name, n, name_length);
|
memcpy(name, n, name_length);
|
||||||
name[name_length] = '\0';
|
name[name_length] = '\0';
|
||||||
|
@ -85,7 +85,7 @@ FS::DirectoryEntry::DirectoryEntry(const char* n, InodeIdentifier i, byte ft)
|
||||||
FS::DirectoryEntry::DirectoryEntry(const char* n, size_t nl, InodeIdentifier i, byte ft)
|
FS::DirectoryEntry::DirectoryEntry(const char* n, size_t nl, InodeIdentifier i, byte ft)
|
||||||
: name_length(nl)
|
: name_length(nl)
|
||||||
, inode(i)
|
, inode(i)
|
||||||
, fileType(ft)
|
, file_type(ft)
|
||||||
{
|
{
|
||||||
memcpy(name, n, nl);
|
memcpy(name, n, nl);
|
||||||
name[nl] = '\0';
|
name[nl] = '\0';
|
||||||
|
|
|
@ -37,12 +37,12 @@ public:
|
||||||
bool is_readonly() const { return m_readonly; }
|
bool is_readonly() const { return m_readonly; }
|
||||||
|
|
||||||
struct DirectoryEntry {
|
struct DirectoryEntry {
|
||||||
DirectoryEntry(const char* name, InodeIdentifier, byte fileType);
|
DirectoryEntry(const char* name, InodeIdentifier, byte file_type);
|
||||||
DirectoryEntry(const char* name, size_t name_length, InodeIdentifier, byte fileType);
|
DirectoryEntry(const char* name, size_t name_length, InodeIdentifier, byte file_type);
|
||||||
char name[256];
|
char name[256];
|
||||||
size_t name_length { 0 };
|
size_t name_length { 0 };
|
||||||
InodeIdentifier inode;
|
InodeIdentifier inode;
|
||||||
byte fileType { 0 };
|
byte file_type { 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
virtual RetainPtr<Inode> create_inode(InodeIdentifier parentInode, const String& name, mode_t, unsigned size, int& error) = 0;
|
virtual RetainPtr<Inode> create_inode(InodeIdentifier parentInode, const String& name, mode_t, unsigned size, int& error) = 0;
|
||||||
|
@ -71,9 +71,9 @@ public:
|
||||||
unsigned index() const { return m_index; }
|
unsigned index() const { return m_index; }
|
||||||
|
|
||||||
size_t size() const { return metadata().size; }
|
size_t size() const { return metadata().size; }
|
||||||
bool is_symlink() const { return metadata().isSymbolicLink(); }
|
bool is_symlink() const { return metadata().is_symlink(); }
|
||||||
bool is_directory() const { return metadata().isDirectory(); }
|
bool is_directory() const { return metadata().is_directory(); }
|
||||||
bool is_character_device() const { return metadata().isCharacterDevice(); }
|
bool is_character_device() const { return metadata().is_character_device(); }
|
||||||
mode_t mode() const { return metadata().mode; }
|
mode_t mode() const { return metadata().mode; }
|
||||||
|
|
||||||
InodeIdentifier identifier() const { return { fsid(), index() }; }
|
InodeIdentifier identifier() const { return { fsid(), index() }; }
|
||||||
|
|
|
@ -9,8 +9,8 @@ struct InodeMetadata;
|
||||||
class InodeIdentifier {
|
class InodeIdentifier {
|
||||||
public:
|
public:
|
||||||
InodeIdentifier() { }
|
InodeIdentifier() { }
|
||||||
InodeIdentifier(dword fileSystemID, dword inode)
|
InodeIdentifier(dword fsid, dword inode)
|
||||||
: m_fsid(fileSystemID)
|
: m_fsid(fsid)
|
||||||
, m_index(inode)
|
, m_index(inode)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,21 +4,21 @@
|
||||||
#include "UnixTypes.h"
|
#include "UnixTypes.h"
|
||||||
#include <AK/HashTable.h>
|
#include <AK/HashTable.h>
|
||||||
|
|
||||||
inline bool isDirectory(mode_t mode) { return (mode & 0170000) == 0040000; }
|
inline bool is_directory(mode_t mode) { return (mode & 0170000) == 0040000; }
|
||||||
inline bool isCharacterDevice(mode_t mode) { return (mode & 0170000) == 0020000; }
|
inline bool is_character_device(mode_t mode) { return (mode & 0170000) == 0020000; }
|
||||||
inline bool isBlockDevice(mode_t mode) { return (mode & 0170000) == 0060000; }
|
inline bool is_block_device(mode_t mode) { return (mode & 0170000) == 0060000; }
|
||||||
inline bool isRegularFile(mode_t mode) { return (mode & 0170000) == 0100000; }
|
inline bool is_regular_file(mode_t mode) { return (mode & 0170000) == 0100000; }
|
||||||
inline bool isFIFO(mode_t mode) { return (mode & 0170000) == 0010000; }
|
inline bool is_fifo(mode_t mode) { return (mode & 0170000) == 0010000; }
|
||||||
inline bool isSymbolicLink(mode_t mode) { return (mode & 0170000) == 0120000; }
|
inline bool is_symlink(mode_t mode) { return (mode & 0170000) == 0120000; }
|
||||||
inline bool isSocket(mode_t mode) { return (mode & 0170000) == 0140000; }
|
inline bool is_socket(mode_t mode) { return (mode & 0170000) == 0140000; }
|
||||||
inline bool isSticky(mode_t mode) { return mode & 01000; }
|
inline bool is_sticky(mode_t mode) { return mode & 01000; }
|
||||||
inline bool isSetUID(mode_t mode) { return mode & 04000; }
|
inline bool is_setuid(mode_t mode) { return mode & 04000; }
|
||||||
inline bool isSetGID(mode_t mode) { return mode & 02000; }
|
inline bool is_setgid(mode_t mode) { return mode & 02000; }
|
||||||
|
|
||||||
struct InodeMetadata {
|
struct InodeMetadata {
|
||||||
bool isValid() const { return inode.is_valid(); }
|
bool is_valid() const { return inode.is_valid(); }
|
||||||
|
|
||||||
bool mayExecute(uid_t u, const HashTable<gid_t>& g) const
|
bool may_execute(uid_t u, const HashTable<gid_t>& g) const
|
||||||
{
|
{
|
||||||
if (uid == u)
|
if (uid == u)
|
||||||
return mode & 0100;
|
return mode & 0100;
|
||||||
|
@ -27,31 +27,31 @@ struct InodeMetadata {
|
||||||
return mode & 0001;
|
return mode & 0001;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isDirectory() const { return ::isDirectory(mode); }
|
bool is_directory() const { return ::is_directory(mode); }
|
||||||
bool isCharacterDevice() const { return ::isCharacterDevice(mode); }
|
bool is_character_device() const { return ::is_character_device(mode); }
|
||||||
bool isBlockDevice() const { return ::isBlockDevice(mode); }
|
bool is_block_device() const { return ::is_block_device(mode); }
|
||||||
bool isRegularFile() const { return ::isRegularFile(mode); }
|
bool is_regular_file() const { return ::is_regular_file(mode); }
|
||||||
bool isFIFO() const { return ::isFIFO(mode); }
|
bool is_fifo() const { return ::is_fifo(mode); }
|
||||||
bool isSymbolicLink() const { return ::isSymbolicLink(mode); }
|
bool is_symlink() const { return ::is_symlink(mode); }
|
||||||
bool isSocket() const { return ::isSocket(mode); }
|
bool is_socket() const { return ::is_socket(mode); }
|
||||||
bool isSticky() const { return ::isSticky(mode); }
|
bool is_sticky() const { return ::is_sticky(mode); }
|
||||||
bool isSetUID() const { return ::isSetUID(mode); }
|
bool is_setuid() const { return ::is_setuid(mode); }
|
||||||
bool isSetGID() const { return ::isSetGID(mode); }
|
bool is_setgid() const { return ::is_setgid(mode); }
|
||||||
|
|
||||||
InodeIdentifier inode;
|
InodeIdentifier inode;
|
||||||
off_t size { 0 };
|
off_t size { 0 };
|
||||||
mode_t mode { 0 };
|
mode_t mode { 0 };
|
||||||
uid_t uid { 0 };
|
uid_t uid { 0 };
|
||||||
gid_t gid { 0 };
|
gid_t gid { 0 };
|
||||||
nlink_t linkCount { 0 };
|
nlink_t link_count { 0 };
|
||||||
time_t atime { 0 };
|
time_t atime { 0 };
|
||||||
time_t ctime { 0 };
|
time_t ctime { 0 };
|
||||||
time_t mtime { 0 };
|
time_t mtime { 0 };
|
||||||
time_t dtime { 0 };
|
time_t dtime { 0 };
|
||||||
blkcnt_t blockCount { 0 };
|
blkcnt_t block_count { 0 };
|
||||||
blksize_t blockSize { 0 };
|
blksize_t block_size { 0 };
|
||||||
unsigned majorDevice { 0 };
|
unsigned major_device { 0 };
|
||||||
unsigned minorDevice { 0 };
|
unsigned minor_device { 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -89,21 +89,21 @@ void dump_backtrace(bool use_ksyms)
|
||||||
};
|
};
|
||||||
Vector<RecognizedSymbol> recognized_symbols;
|
Vector<RecognizedSymbol> recognized_symbols;
|
||||||
if (use_ksyms) {
|
if (use_ksyms) {
|
||||||
for (dword* stackPtr = (dword*)&use_ksyms; current->validate_read_from_kernel(LinearAddress((dword)stackPtr)); stackPtr = (dword*)*stackPtr) {
|
for (dword* stack_ptr = (dword*)&use_ksyms; current->validate_read_from_kernel(LinearAddress((dword)stack_ptr)); stack_ptr = (dword*)*stack_ptr) {
|
||||||
dword retaddr = stackPtr[1];
|
dword retaddr = stack_ptr[1];
|
||||||
if (auto* ksym = ksymbolicate(retaddr))
|
if (auto* ksym = ksymbolicate(retaddr))
|
||||||
recognized_symbols.append({ retaddr, ksym });
|
recognized_symbols.append({ retaddr, ksym });
|
||||||
}
|
}
|
||||||
} else{
|
} else{
|
||||||
for (dword* stackPtr = (dword*)&use_ksyms; current->validate_read_from_kernel(LinearAddress((dword)stackPtr)); stackPtr = (dword*)*stackPtr) {
|
for (dword* stack_ptr = (dword*)&use_ksyms; current->validate_read_from_kernel(LinearAddress((dword)stack_ptr)); stack_ptr = (dword*)*stack_ptr) {
|
||||||
dword retaddr = stackPtr[1];
|
dword retaddr = stack_ptr[1];
|
||||||
kprintf("%x (next: %x)\n", retaddr, stackPtr ? (dword*)*stackPtr : 0);
|
kprintf("%x (next: %x)\n", retaddr, stack_ptr ? (dword*)*stack_ptr : 0);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
size_t bytesNeeded = 0;
|
size_t bytes_needed = 0;
|
||||||
for (auto& symbol : recognized_symbols) {
|
for (auto& symbol : recognized_symbols) {
|
||||||
bytesNeeded += strlen(symbol.ksym->name) + 8 + 16;
|
bytes_needed += strlen(symbol.ksym->name) + 8 + 16;
|
||||||
}
|
}
|
||||||
for (auto& symbol : recognized_symbols) {
|
for (auto& symbol : recognized_symbols) {
|
||||||
unsigned offset = symbol.address - symbol.ksym->address;
|
unsigned offset = symbol.address - symbol.ksym->address;
|
||||||
|
|
|
@ -112,7 +112,7 @@ RetainPtr<PhysicalPage> MemoryManager::allocate_page_table(PageDirectory& page_d
|
||||||
auto physical_page = allocate_supervisor_physical_page();
|
auto physical_page = allocate_supervisor_physical_page();
|
||||||
if (!physical_page)
|
if (!physical_page)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
page_directory.m_physical_pages.set(index, physical_page.copyRef());
|
page_directory.m_physical_pages.set(index, physical_page.copy_ref());
|
||||||
return physical_page;
|
return physical_page;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,7 +144,7 @@ auto MemoryManager::ensure_pte(PageDirectory& page_directory, LinearAddress ladd
|
||||||
#endif
|
#endif
|
||||||
if (page_directory_index == 0) {
|
if (page_directory_index == 0) {
|
||||||
ASSERT(&page_directory == m_kernel_page_directory.ptr());
|
ASSERT(&page_directory == m_kernel_page_directory.ptr());
|
||||||
pde.setPageTableBase((dword)m_page_table_zero);
|
pde.set_page_table_base((dword)m_page_table_zero);
|
||||||
pde.set_user_allowed(false);
|
pde.set_user_allowed(false);
|
||||||
pde.set_present(true);
|
pde.set_present(true);
|
||||||
pde.set_writable(true);
|
pde.set_writable(true);
|
||||||
|
@ -161,14 +161,14 @@ auto MemoryManager::ensure_pte(PageDirectory& page_directory, LinearAddress ladd
|
||||||
page_table->paddr().get());
|
page_table->paddr().get());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pde.setPageTableBase(page_table->paddr().get());
|
pde.set_page_table_base(page_table->paddr().get());
|
||||||
pde.set_user_allowed(true);
|
pde.set_user_allowed(true);
|
||||||
pde.set_present(true);
|
pde.set_present(true);
|
||||||
pde.set_writable(true);
|
pde.set_writable(true);
|
||||||
page_directory.m_physical_pages.set(page_directory_index, move(page_table));
|
page_directory.m_physical_pages.set(page_directory_index, move(page_table));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return PageTableEntry(&pde.pageTableBase()[page_table_index]);
|
return PageTableEntry(&pde.page_table_base()[page_table_index]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MemoryManager::map_protected(LinearAddress laddr, size_t length)
|
void MemoryManager::map_protected(LinearAddress laddr, size_t length)
|
||||||
|
@ -176,13 +176,13 @@ void MemoryManager::map_protected(LinearAddress laddr, size_t length)
|
||||||
InterruptDisabler disabler;
|
InterruptDisabler disabler;
|
||||||
// FIXME: ASSERT(linearAddress is 4KB aligned);
|
// FIXME: ASSERT(linearAddress is 4KB aligned);
|
||||||
for (dword offset = 0; offset < length; offset += PAGE_SIZE) {
|
for (dword offset = 0; offset < length; offset += PAGE_SIZE) {
|
||||||
auto pteAddress = laddr.offset(offset);
|
auto pte_address = laddr.offset(offset);
|
||||||
auto pte = ensure_pte(kernel_page_directory(), pteAddress);
|
auto pte = ensure_pte(kernel_page_directory(), pte_address);
|
||||||
pte.set_physical_page_base(pteAddress.get());
|
pte.set_physical_page_base(pte_address.get());
|
||||||
pte.set_user_allowed(false);
|
pte.set_user_allowed(false);
|
||||||
pte.set_present(false);
|
pte.set_present(false);
|
||||||
pte.set_writable(false);
|
pte.set_writable(false);
|
||||||
flush_tlb(pteAddress);
|
flush_tlb(pte_address);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,13 +191,13 @@ void MemoryManager::create_identity_mapping(PageDirectory& page_directory, Linea
|
||||||
InterruptDisabler disabler;
|
InterruptDisabler disabler;
|
||||||
ASSERT((laddr.get() & ~PAGE_MASK) == 0);
|
ASSERT((laddr.get() & ~PAGE_MASK) == 0);
|
||||||
for (dword offset = 0; offset < size; offset += PAGE_SIZE) {
|
for (dword offset = 0; offset < size; offset += PAGE_SIZE) {
|
||||||
auto pteAddress = laddr.offset(offset);
|
auto pte_address = laddr.offset(offset);
|
||||||
auto pte = ensure_pte(page_directory, pteAddress);
|
auto pte = ensure_pte(page_directory, pte_address);
|
||||||
pte.set_physical_page_base(pteAddress.get());
|
pte.set_physical_page_base(pte_address.get());
|
||||||
pte.set_user_allowed(false);
|
pte.set_user_allowed(false);
|
||||||
pte.set_present(true);
|
pte.set_present(true);
|
||||||
pte.set_writable(true);
|
pte.set_writable(true);
|
||||||
page_directory.flush(pteAddress);
|
page_directory.flush(pte_address);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -560,7 +560,7 @@ RetainPtr<Region> Region::clone()
|
||||||
|
|
||||||
if (m_shared || (m_readable && !m_writable)) {
|
if (m_shared || (m_readable && !m_writable)) {
|
||||||
// Create a new region backed by the same VMObject.
|
// Create a new region backed by the same VMObject.
|
||||||
return adopt(*new Region(laddr(), size(), m_vmo.copyRef(), m_offset_in_vmo, String(m_name), m_readable, m_writable));
|
return adopt(*new Region(laddr(), size(), m_vmo.copy_ref(), m_offset_in_vmo, String(m_name), m_readable, m_writable));
|
||||||
}
|
}
|
||||||
|
|
||||||
dbgprintf("%s<%u> Region::clone(): cowing %s (L%x)\n",
|
dbgprintf("%s<%u> Region::clone(): cowing %s (L%x)\n",
|
||||||
|
@ -647,7 +647,7 @@ RetainPtr<VMObject> VMObject::create_file_backed(RetainPtr<Inode>&& inode, size_
|
||||||
InterruptDisabler disabler;
|
InterruptDisabler disabler;
|
||||||
if (inode->vmo())
|
if (inode->vmo())
|
||||||
return static_cast<VMObject*>(inode->vmo());
|
return static_cast<VMObject*>(inode->vmo());
|
||||||
size = ceilDiv(size, PAGE_SIZE) * PAGE_SIZE;
|
size = ceil_div(size, PAGE_SIZE) * PAGE_SIZE;
|
||||||
auto vmo = adopt(*new VMObject(move(inode), size));
|
auto vmo = adopt(*new VMObject(move(inode), size));
|
||||||
vmo->inode()->set_vmo(vmo.ptr());
|
vmo->inode()->set_vmo(vmo.ptr());
|
||||||
return vmo;
|
return vmo;
|
||||||
|
@ -655,13 +655,13 @@ RetainPtr<VMObject> VMObject::create_file_backed(RetainPtr<Inode>&& inode, size_
|
||||||
|
|
||||||
RetainPtr<VMObject> VMObject::create_anonymous(size_t size)
|
RetainPtr<VMObject> VMObject::create_anonymous(size_t size)
|
||||||
{
|
{
|
||||||
size = ceilDiv(size, PAGE_SIZE) * PAGE_SIZE;
|
size = ceil_div(size, PAGE_SIZE) * PAGE_SIZE;
|
||||||
return adopt(*new VMObject(size));
|
return adopt(*new VMObject(size));
|
||||||
}
|
}
|
||||||
|
|
||||||
RetainPtr<VMObject> VMObject::create_framebuffer_wrapper(PhysicalAddress paddr, size_t size)
|
RetainPtr<VMObject> VMObject::create_framebuffer_wrapper(PhysicalAddress paddr, size_t size)
|
||||||
{
|
{
|
||||||
size = ceilDiv(size, PAGE_SIZE) * PAGE_SIZE;
|
size = ceil_div(size, PAGE_SIZE) * PAGE_SIZE;
|
||||||
return adopt(*new VMObject(paddr, size));
|
return adopt(*new VMObject(paddr, size));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -264,8 +264,8 @@ private:
|
||||||
struct PageDirectoryEntry {
|
struct PageDirectoryEntry {
|
||||||
explicit PageDirectoryEntry(dword* pde) : m_pde(pde) { }
|
explicit PageDirectoryEntry(dword* pde) : m_pde(pde) { }
|
||||||
|
|
||||||
dword* pageTableBase() { return reinterpret_cast<dword*>(raw() & 0xfffff000u); }
|
dword* page_table_base() { return reinterpret_cast<dword*>(raw() & 0xfffff000u); }
|
||||||
void setPageTableBase(dword value)
|
void set_page_table_base(dword value)
|
||||||
{
|
{
|
||||||
*m_pde &= 0xfff;
|
*m_pde &= 0xfff;
|
||||||
*m_pde |= value & 0xfffff000;
|
*m_pde |= value & 0xfffff000;
|
||||||
|
|
|
@ -90,7 +90,7 @@ void initialize()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
word getISR()
|
word get_isr()
|
||||||
{
|
{
|
||||||
IO::out8(PIC0_CTL, 0x0b);
|
IO::out8(PIC0_CTL, 0x0b);
|
||||||
IO::out8(PIC1_CTL, 0x0b);
|
IO::out8(PIC1_CTL, 0x0b);
|
||||||
|
|
|
@ -8,7 +8,7 @@ void enable(byte number);
|
||||||
void disable(byte number);
|
void disable(byte number);
|
||||||
void eoi(byte number);
|
void eoi(byte number);
|
||||||
void initialize();
|
void initialize();
|
||||||
word getISR();
|
word get_isr();
|
||||||
word get_irr();
|
word get_irr();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,21 +94,21 @@ ByteBuffer procfs$pid_vmo(Process& process)
|
||||||
ByteBuffer procfs$pid_stack(Process& process)
|
ByteBuffer procfs$pid_stack(Process& process)
|
||||||
{
|
{
|
||||||
ProcessInspectionHandle handle(process);
|
ProcessInspectionHandle handle(process);
|
||||||
ProcessPagingScope pagingScope(process);
|
ProcessPagingScope paging_scope(process);
|
||||||
struct RecognizedSymbol {
|
struct RecognizedSymbol {
|
||||||
dword address;
|
dword address;
|
||||||
const KSym* ksym;
|
const KSym* ksym;
|
||||||
};
|
};
|
||||||
Vector<RecognizedSymbol> recognizedSymbols;
|
Vector<RecognizedSymbol> recognized_symbols;
|
||||||
if (auto* eipKsym = ksymbolicate(process.tss().eip))
|
if (auto* eip_ksym = ksymbolicate(process.tss().eip))
|
||||||
recognizedSymbols.append({ process.tss().eip, eipKsym });
|
recognized_symbols.append({ process.tss().eip, eip_ksym });
|
||||||
for (dword* stackPtr = (dword*)process.framePtr(); process.validate_read_from_kernel(LinearAddress((dword)stackPtr)); stackPtr = (dword*)*stackPtr) {
|
for (dword* stack_ptr = (dword*)process.frame_ptr(); process.validate_read_from_kernel(LinearAddress((dword)stack_ptr)); stack_ptr = (dword*)*stack_ptr) {
|
||||||
dword retaddr = stackPtr[1];
|
dword retaddr = stack_ptr[1];
|
||||||
if (auto* ksym = ksymbolicate(retaddr))
|
if (auto* ksym = ksymbolicate(retaddr))
|
||||||
recognizedSymbols.append({ retaddr, ksym });
|
recognized_symbols.append({ retaddr, ksym });
|
||||||
}
|
}
|
||||||
StringBuilder builder;
|
StringBuilder builder;
|
||||||
for (auto& symbol : recognizedSymbols) {
|
for (auto& symbol : recognized_symbols) {
|
||||||
unsigned offset = symbol.address - symbol.ksym->address;
|
unsigned offset = symbol.address - symbol.ksym->address;
|
||||||
builder.appendf("%p %s +%u\n", symbol.address, symbol.ksym->name, offset);
|
builder.appendf("%p %s +%u\n", symbol.address, symbol.ksym->name, offset);
|
||||||
}
|
}
|
||||||
|
@ -306,7 +306,7 @@ ByteBuffer procfs$kmalloc(SynthFSInode&)
|
||||||
ByteBuffer procfs$summary(SynthFSInode&)
|
ByteBuffer procfs$summary(SynthFSInode&)
|
||||||
{
|
{
|
||||||
InterruptDisabler disabler;
|
InterruptDisabler disabler;
|
||||||
auto processes = Process::allProcesses();
|
auto processes = Process::all_processes();
|
||||||
StringBuilder builder;
|
StringBuilder builder;
|
||||||
builder.appendf("PID TPG PGP SID OWNER STATE PPID NSCHED FDS TTY NAME\n");
|
builder.appendf("PID TPG PGP SID OWNER STATE PPID NSCHED FDS TTY NAME\n");
|
||||||
for (auto* process : processes) {
|
for (auto* process : processes) {
|
||||||
|
@ -316,9 +316,9 @@ ByteBuffer procfs$summary(SynthFSInode&)
|
||||||
process->pgid(),
|
process->pgid(),
|
||||||
process->sid(),
|
process->sid(),
|
||||||
process->uid(),
|
process->uid(),
|
||||||
toString(process->state()),
|
to_string(process->state()),
|
||||||
process->ppid(),
|
process->ppid(),
|
||||||
process->timesScheduled(),
|
process->times_scheduled(),
|
||||||
process->number_of_open_file_descriptors(),
|
process->number_of_open_file_descriptors(),
|
||||||
process->tty() ? strrchr(process->tty()->tty_name().characters(), '/') + 1 : "n/a",
|
process->tty() ? strrchr(process->tty()->tty_name().characters(), '/') + 1 : "n/a",
|
||||||
process->name().characters());
|
process->name().characters());
|
||||||
|
|
|
@ -19,7 +19,6 @@ public:
|
||||||
void remove_process(Process&);
|
void remove_process(Process&);
|
||||||
|
|
||||||
void add_sys_file(String&&, Function<ByteBuffer(SynthFSInode&)>&& read_callback, Function<ssize_t(SynthFSInode&, const ByteBuffer&)>&& write_callback);
|
void add_sys_file(String&&, Function<ByteBuffer(SynthFSInode&)>&& read_callback, Function<ssize_t(SynthFSInode&, const ByteBuffer&)>&& write_callback);
|
||||||
|
|
||||||
void add_sys_bool(String&&, bool*, Function<void()>&& change_callback = nullptr);
|
void add_sys_bool(String&&, bool*, Function<void()>&& change_callback = nullptr);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -27,22 +27,22 @@
|
||||||
#define SIGNAL_DEBUG
|
#define SIGNAL_DEBUG
|
||||||
#define MAX_PROCESS_GIDS 32
|
#define MAX_PROCESS_GIDS 32
|
||||||
|
|
||||||
static const dword defaultStackSize = 16384;
|
static const dword default_stack_size = 16384;
|
||||||
|
|
||||||
static pid_t next_pid;
|
static pid_t next_pid;
|
||||||
InlineLinkedList<Process>* g_processes;
|
InlineLinkedList<Process>* g_processes;
|
||||||
static String* s_hostname;
|
static String* s_hostname;
|
||||||
|
|
||||||
static String& hostnameStorage(InterruptDisabler&)
|
static String& hostname_storage(InterruptDisabler&)
|
||||||
{
|
{
|
||||||
ASSERT(s_hostname);
|
ASSERT(s_hostname);
|
||||||
return *s_hostname;
|
return *s_hostname;
|
||||||
}
|
}
|
||||||
|
|
||||||
static String getHostname()
|
static String get_hostname()
|
||||||
{
|
{
|
||||||
InterruptDisabler disabler;
|
InterruptDisabler disabler;
|
||||||
return hostnameStorage(disabler).isolated_copy();
|
return hostname_storage(disabler).isolated_copy();
|
||||||
}
|
}
|
||||||
|
|
||||||
CoolGlobals* g_cool_globals;
|
CoolGlobals* g_cool_globals;
|
||||||
|
@ -59,7 +59,7 @@ void Process::initialize()
|
||||||
initialize_gui_statics();
|
initialize_gui_statics();
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<Process*> Process::allProcesses()
|
Vector<Process*> Process::all_processes()
|
||||||
{
|
{
|
||||||
InterruptDisabler disabler;
|
InterruptDisabler disabler;
|
||||||
Vector<Process*> processes;
|
Vector<Process*> processes;
|
||||||
|
@ -74,8 +74,8 @@ Region* Process::allocate_region(LinearAddress laddr, size_t size, String&& name
|
||||||
size = PAGE_ROUND_UP(size);
|
size = PAGE_ROUND_UP(size);
|
||||||
// FIXME: This needs sanity checks. What if this overlaps existing regions?
|
// FIXME: This needs sanity checks. What if this overlaps existing regions?
|
||||||
if (laddr.is_null()) {
|
if (laddr.is_null()) {
|
||||||
laddr = m_nextRegion;
|
laddr = m_next_region;
|
||||||
m_nextRegion = m_nextRegion.offset(size).offset(PAGE_SIZE);
|
m_next_region = m_next_region.offset(size).offset(PAGE_SIZE);
|
||||||
}
|
}
|
||||||
laddr.mask(0xfffff000);
|
laddr.mask(0xfffff000);
|
||||||
m_regions.append(adopt(*new Region(laddr, size, move(name), is_readable, is_writable)));
|
m_regions.append(adopt(*new Region(laddr, size, move(name), is_readable, is_writable)));
|
||||||
|
@ -90,8 +90,8 @@ Region* Process::allocate_file_backed_region(LinearAddress laddr, size_t size, R
|
||||||
size = PAGE_ROUND_UP(size);
|
size = PAGE_ROUND_UP(size);
|
||||||
// FIXME: This needs sanity checks. What if this overlaps existing regions?
|
// FIXME: This needs sanity checks. What if this overlaps existing regions?
|
||||||
if (laddr.is_null()) {
|
if (laddr.is_null()) {
|
||||||
laddr = m_nextRegion;
|
laddr = m_next_region;
|
||||||
m_nextRegion = m_nextRegion.offset(size).offset(PAGE_SIZE);
|
m_next_region = m_next_region.offset(size).offset(PAGE_SIZE);
|
||||||
}
|
}
|
||||||
laddr.mask(0xfffff000);
|
laddr.mask(0xfffff000);
|
||||||
m_regions.append(adopt(*new Region(laddr, size, move(inode), move(name), is_readable, is_writable)));
|
m_regions.append(adopt(*new Region(laddr, size, move(inode), move(name), is_readable, is_writable)));
|
||||||
|
@ -105,12 +105,12 @@ Region* Process::allocate_region_with_vmo(LinearAddress laddr, size_t size, Reta
|
||||||
size = PAGE_ROUND_UP(size);
|
size = PAGE_ROUND_UP(size);
|
||||||
// FIXME: This needs sanity checks. What if this overlaps existing regions?
|
// FIXME: This needs sanity checks. What if this overlaps existing regions?
|
||||||
if (laddr.is_null()) {
|
if (laddr.is_null()) {
|
||||||
laddr = m_nextRegion;
|
laddr = m_next_region;
|
||||||
m_nextRegion = m_nextRegion.offset(size).offset(PAGE_SIZE);
|
m_next_region = m_next_region.offset(size).offset(PAGE_SIZE);
|
||||||
}
|
}
|
||||||
laddr.mask(0xfffff000);
|
laddr.mask(0xfffff000);
|
||||||
offset_in_vmo &= PAGE_MASK;
|
offset_in_vmo &= PAGE_MASK;
|
||||||
size = ceilDiv(size, PAGE_SIZE) * PAGE_SIZE;
|
size = ceil_div(size, PAGE_SIZE) * PAGE_SIZE;
|
||||||
m_regions.append(adopt(*new Region(laddr, size, move(vmo), offset_in_vmo, move(name), is_readable, is_writable)));
|
m_regions.append(adopt(*new Region(laddr, size, move(vmo), offset_in_vmo, move(name), is_readable, is_writable)));
|
||||||
MM.map_region(*this, *m_regions.last());
|
MM.map_region(*this, *m_regions.last());
|
||||||
return m_regions.last().ptr();
|
return m_regions.last().ptr();
|
||||||
|
@ -129,7 +129,7 @@ bool Process::deallocate_region(Region& region)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Region* Process::regionFromRange(LinearAddress laddr, size_t size)
|
Region* Process::region_from_range(LinearAddress laddr, size_t size)
|
||||||
{
|
{
|
||||||
for (auto& region : m_regions) {
|
for (auto& region : m_regions) {
|
||||||
if (region->laddr() == laddr && region->size() == size)
|
if (region->laddr() == laddr && region->size() == size)
|
||||||
|
@ -142,7 +142,7 @@ int Process::sys$set_mmap_name(void* addr, size_t size, const char* name)
|
||||||
{
|
{
|
||||||
if (!validate_read_str(name))
|
if (!validate_read_str(name))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
auto* region = regionFromRange(LinearAddress((dword)addr), size);
|
auto* region = region_from_range(LinearAddress((dword)addr), size);
|
||||||
if (!region)
|
if (!region)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
region->set_name(String(name));
|
region->set_name(String(name));
|
||||||
|
@ -193,7 +193,7 @@ void* Process::sys$mmap(const Syscall::SC_mmap_params* params)
|
||||||
int Process::sys$munmap(void* addr, size_t size)
|
int Process::sys$munmap(void* addr, size_t size)
|
||||||
{
|
{
|
||||||
InterruptDisabler disabler;
|
InterruptDisabler disabler;
|
||||||
auto* region = regionFromRange(LinearAddress((dword)addr), size);
|
auto* region = region_from_range(LinearAddress((dword)addr), size);
|
||||||
if (!region)
|
if (!region)
|
||||||
return -1;
|
return -1;
|
||||||
if (!deallocate_region(*region))
|
if (!deallocate_region(*region))
|
||||||
|
@ -205,7 +205,7 @@ int Process::sys$gethostname(char* buffer, size_t size)
|
||||||
{
|
{
|
||||||
if (!validate_write(buffer, size))
|
if (!validate_write(buffer, size))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
auto hostname = getHostname();
|
auto hostname = get_hostname();
|
||||||
if (size < (hostname.length() + 1))
|
if (size < (hostname.length() + 1))
|
||||||
return -ENAMETOOLONG;
|
return -ENAMETOOLONG;
|
||||||
memcpy(buffer, hostname.characters(), size);
|
memcpy(buffer, hostname.characters(), size);
|
||||||
|
@ -214,7 +214,7 @@ int Process::sys$gethostname(char* buffer, size_t size)
|
||||||
|
|
||||||
Process* Process::fork(RegisterDump& regs)
|
Process* Process::fork(RegisterDump& regs)
|
||||||
{
|
{
|
||||||
auto* child = new Process(String(m_name), m_uid, m_gid, m_pid, m_ring, m_cwd.copyRef(), m_executable.copyRef(), m_tty, this);
|
auto* child = new Process(String(m_name), m_uid, m_gid, m_pid, m_ring, m_cwd.copy_ref(), m_executable.copy_ref(), m_tty, this);
|
||||||
if (!child)
|
if (!child)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
|
@ -235,7 +235,7 @@ Process* Process::fork(RegisterDump& regs)
|
||||||
child->m_regions.append(move(cloned_region));
|
child->m_regions.append(move(cloned_region));
|
||||||
MM.map_region(*child, *child->m_regions.last());
|
MM.map_region(*child, *child->m_regions.last());
|
||||||
if (region.ptr() == m_display_framebuffer_region.ptr())
|
if (region.ptr() == m_display_framebuffer_region.ptr())
|
||||||
child->m_display_framebuffer_region = child->m_regions.last().copyRef();
|
child->m_display_framebuffer_region = child->m_regions.last().copy_ref();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto gid : m_gids)
|
for (auto gid : m_gids)
|
||||||
|
@ -298,7 +298,7 @@ int Process::do_exec(const String& path, Vector<String>&& arguments, Vector<Stri
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!descriptor->metadata().mayExecute(m_euid, m_gids))
|
if (!descriptor->metadata().may_execute(m_euid, m_gids))
|
||||||
return -EACCES;
|
return -EACCES;
|
||||||
|
|
||||||
if (!descriptor->metadata().size) {
|
if (!descriptor->metadata().size) {
|
||||||
|
@ -317,7 +317,7 @@ int Process::do_exec(const String& path, Vector<String>&& arguments, Vector<Stri
|
||||||
|
|
||||||
auto vmo = VMObject::create_file_backed(descriptor->inode(), descriptor->metadata().size);
|
auto vmo = VMObject::create_file_backed(descriptor->inode(), descriptor->metadata().size);
|
||||||
vmo->set_name(descriptor->absolute_path());
|
vmo->set_name(descriptor->absolute_path());
|
||||||
auto* region = allocate_region_with_vmo(LinearAddress(), descriptor->metadata().size, vmo.copyRef(), 0, "helper", true, false);
|
auto* region = allocate_region_with_vmo(LinearAddress(), descriptor->metadata().size, vmo.copy_ref(), 0, "helper", true, false);
|
||||||
|
|
||||||
// FIXME: Should we consider doing on-demand paging here? Is it actually useful?
|
// FIXME: Should we consider doing on-demand paging here? Is it actually useful?
|
||||||
bool success = region->page_in();
|
bool success = region->page_in();
|
||||||
|
@ -332,7 +332,7 @@ int Process::do_exec(const String& path, Vector<String>&& arguments, Vector<Stri
|
||||||
ASSERT(size);
|
ASSERT(size);
|
||||||
ASSERT(alignment == PAGE_SIZE);
|
ASSERT(alignment == PAGE_SIZE);
|
||||||
size = ((size / 4096) + 1) * 4096; // FIXME: Use ceil_div?
|
size = ((size / 4096) + 1) * 4096; // FIXME: Use ceil_div?
|
||||||
(void) allocate_region_with_vmo(laddr, size, vmo.copyRef(), offset_in_image, String(name), is_readable, is_writable);
|
(void) allocate_region_with_vmo(laddr, size, vmo.copy_ref(), offset_in_image, String(name), is_readable, is_writable);
|
||||||
return laddr.as_ptr();
|
return laddr.as_ptr();
|
||||||
};
|
};
|
||||||
loader.alloc_section_hook = [&] (LinearAddress laddr, size_t size, size_t alignment, bool is_readable, bool is_writable, const String& name) {
|
loader.alloc_section_hook = [&] (LinearAddress laddr, size_t size, size_t alignment, bool is_readable, bool is_writable, const String& name) {
|
||||||
|
@ -400,10 +400,10 @@ int Process::do_exec(const String& path, Vector<String>&& arguments, Vector<Stri
|
||||||
m_tss.gs = 0x23;
|
m_tss.gs = 0x23;
|
||||||
m_tss.ss = 0x23;
|
m_tss.ss = 0x23;
|
||||||
m_tss.cr3 = page_directory().cr3();
|
m_tss.cr3 = page_directory().cr3();
|
||||||
m_stack_region = allocate_region(LinearAddress(), defaultStackSize, "stack");
|
m_stack_region = allocate_region(LinearAddress(), default_stack_size, "stack");
|
||||||
ASSERT(m_stack_region);
|
ASSERT(m_stack_region);
|
||||||
m_stackTop3 = m_stack_region->laddr().offset(defaultStackSize).get();
|
m_stack_top3 = m_stack_region->laddr().offset(default_stack_size).get();
|
||||||
m_tss.esp = m_stackTop3;
|
m_tss.esp = m_stack_top3;
|
||||||
m_tss.ss0 = 0x10;
|
m_tss.ss0 = 0x10;
|
||||||
m_tss.esp0 = old_esp0;
|
m_tss.esp0 = old_esp0;
|
||||||
m_tss.ss2 = m_pid;
|
m_tss.ss2 = m_pid;
|
||||||
|
@ -490,7 +490,7 @@ Process* Process::create_user_process(const String& path, uid_t uid, gid_t gid,
|
||||||
{
|
{
|
||||||
InterruptDisabler disabler;
|
InterruptDisabler disabler;
|
||||||
if (auto* parent = Process::from_pid(parent_pid))
|
if (auto* parent = Process::from_pid(parent_pid))
|
||||||
cwd = parent->m_cwd.copyRef();
|
cwd = parent->m_cwd.copy_ref();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!cwd)
|
if (!cwd)
|
||||||
|
@ -634,9 +634,9 @@ Process::Process(String&& name, uid_t uid, gid_t gid, pid_t ppid, RingLevel ring
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fork_parent)
|
if (fork_parent)
|
||||||
m_nextRegion = fork_parent->m_nextRegion;
|
m_next_region = fork_parent->m_next_region;
|
||||||
else
|
else
|
||||||
m_nextRegion = LinearAddress(0x10000000);
|
m_next_region = LinearAddress(0x10000000);
|
||||||
|
|
||||||
if (fork_parent) {
|
if (fork_parent) {
|
||||||
memcpy(&m_tss, &fork_parent->m_tss, sizeof(m_tss));
|
memcpy(&m_tss, &fork_parent->m_tss, sizeof(m_tss));
|
||||||
|
@ -647,7 +647,7 @@ Process::Process(String&& name, uid_t uid, gid_t gid, pid_t ppid, RingLevel ring
|
||||||
m_tss.eflags = 0x0202;
|
m_tss.eflags = 0x0202;
|
||||||
word cs, ds, ss;
|
word cs, ds, ss;
|
||||||
|
|
||||||
if (isRing0()) {
|
if (is_ring0()) {
|
||||||
cs = 0x08;
|
cs = 0x08;
|
||||||
ds = 0x10;
|
ds = 0x10;
|
||||||
ss = 0x10;
|
ss = 0x10;
|
||||||
|
@ -667,34 +667,34 @@ Process::Process(String&& name, uid_t uid, gid_t gid, pid_t ppid, RingLevel ring
|
||||||
|
|
||||||
m_tss.cr3 = page_directory().cr3();
|
m_tss.cr3 = page_directory().cr3();
|
||||||
|
|
||||||
if (isRing0()) {
|
if (is_ring0()) {
|
||||||
// FIXME: This memory is leaked.
|
// FIXME: This memory is leaked.
|
||||||
// But uh, there's also no kernel process termination, so I guess it's not technically leaked...
|
// But uh, there's also no kernel process termination, so I guess it's not technically leaked...
|
||||||
dword stackBottom = (dword)kmalloc_eternal(defaultStackSize);
|
dword stack_bottom = (dword)kmalloc_eternal(default_stack_size);
|
||||||
m_stackTop0 = (stackBottom + defaultStackSize) & 0xffffff8;
|
m_stack_top0 = (stack_bottom + default_stack_size) & 0xffffff8;
|
||||||
m_tss.esp = m_stackTop0;
|
m_tss.esp = m_stack_top0;
|
||||||
} else {
|
} else {
|
||||||
if (fork_parent) {
|
if (fork_parent) {
|
||||||
m_stackTop3 = fork_parent->m_stackTop3;
|
m_stack_top3 = fork_parent->m_stack_top3;
|
||||||
} else {
|
} else {
|
||||||
auto* region = allocate_region(LinearAddress(), defaultStackSize, "stack");
|
auto* region = allocate_region(LinearAddress(), default_stack_size, "stack");
|
||||||
ASSERT(region);
|
ASSERT(region);
|
||||||
m_stackTop3 = region->laddr().offset(defaultStackSize).get();
|
m_stack_top3 = region->laddr().offset(default_stack_size).get();
|
||||||
m_tss.esp = m_stackTop3;
|
m_tss.esp = m_stack_top3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isRing3()) {
|
if (is_ring3()) {
|
||||||
// Ring3 processes need a separate stack for Ring0.
|
// Ring3 processes need a separate stack for Ring0.
|
||||||
m_kernelStack = kmalloc(defaultStackSize);
|
m_kernel_stack = kmalloc(default_stack_size);
|
||||||
m_stackTop0 = ((dword)m_kernelStack + defaultStackSize) & 0xffffff8;
|
m_stack_top0 = ((dword)m_kernel_stack + default_stack_size) & 0xffffff8;
|
||||||
m_tss.ss0 = 0x10;
|
m_tss.ss0 = 0x10;
|
||||||
m_tss.esp0 = m_stackTop0;
|
m_tss.esp0 = m_stack_top0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// HACK: Ring2 SS in the TSS is the current PID.
|
// HACK: Ring2 SS in the TSS is the current PID.
|
||||||
m_tss.ss2 = m_pid;
|
m_tss.ss2 = m_pid;
|
||||||
m_farPtr.offset = 0x98765432;
|
m_far_ptr.offset = 0x98765432;
|
||||||
}
|
}
|
||||||
|
|
||||||
Process::~Process()
|
Process::~Process()
|
||||||
|
@ -709,13 +709,13 @@ Process::~Process()
|
||||||
if (selector())
|
if (selector())
|
||||||
gdt_free_entry(selector());
|
gdt_free_entry(selector());
|
||||||
|
|
||||||
if (m_kernelStack) {
|
if (m_kernel_stack) {
|
||||||
kfree(m_kernelStack);
|
kfree(m_kernel_stack);
|
||||||
m_kernelStack = nullptr;
|
m_kernel_stack = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Process::dumpRegions()
|
void Process::dump_regions()
|
||||||
{
|
{
|
||||||
kprintf("Process %s(%u) regions:\n", name().characters(), pid());
|
kprintf("Process %s(%u) regions:\n", name().characters(), pid());
|
||||||
kprintf("BEGIN END SIZE NAME\n");
|
kprintf("BEGIN END SIZE NAME\n");
|
||||||
|
@ -818,7 +818,7 @@ bool Process::dispatch_signal(byte signal)
|
||||||
|
|
||||||
bool interrupting_in_kernel = (ret_cs & 3) == 0;
|
bool interrupting_in_kernel = (ret_cs & 3) == 0;
|
||||||
if (interrupting_in_kernel) {
|
if (interrupting_in_kernel) {
|
||||||
dbgprintf("dispatch_signal to %s(%u) in state=%s with return to %w:%x\n", name().characters(), pid(), toString(state()), ret_cs, ret_eip);
|
dbgprintf("dispatch_signal to %s(%u) in state=%s with return to %w:%x\n", name().characters(), pid(), to_string(state()), ret_cs, ret_eip);
|
||||||
ASSERT(is_blocked());
|
ASSERT(is_blocked());
|
||||||
m_tss_to_resume_kernel = m_tss;
|
m_tss_to_resume_kernel = m_tss;
|
||||||
#ifdef SIGNAL_DEBUG
|
#ifdef SIGNAL_DEBUG
|
||||||
|
@ -826,19 +826,19 @@ bool Process::dispatch_signal(byte signal)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
ProcessPagingScope pagingScope(*this);
|
ProcessPagingScope paging_scope(*this);
|
||||||
|
|
||||||
if (interrupting_in_kernel) {
|
if (interrupting_in_kernel) {
|
||||||
if (!m_signal_stack_user_region) {
|
if (!m_signal_stack_user_region) {
|
||||||
m_signal_stack_user_region = allocate_region(LinearAddress(), defaultStackSize, "signal stack (user)");
|
m_signal_stack_user_region = allocate_region(LinearAddress(), default_stack_size, "signal stack (user)");
|
||||||
ASSERT(m_signal_stack_user_region);
|
ASSERT(m_signal_stack_user_region);
|
||||||
m_signal_stack_kernel_region = allocate_region(LinearAddress(), defaultStackSize, "signal stack (kernel)");
|
m_signal_stack_kernel_region = allocate_region(LinearAddress(), default_stack_size, "signal stack (kernel)");
|
||||||
ASSERT(m_signal_stack_user_region);
|
ASSERT(m_signal_stack_user_region);
|
||||||
}
|
}
|
||||||
m_tss.ss = 0x23;
|
m_tss.ss = 0x23;
|
||||||
m_tss.esp = m_signal_stack_user_region->laddr().offset(defaultStackSize).get() & 0xfffffff8;
|
m_tss.esp = m_signal_stack_user_region->laddr().offset(default_stack_size).get() & 0xfffffff8;
|
||||||
m_tss.ss0 = 0x10;
|
m_tss.ss0 = 0x10;
|
||||||
m_tss.esp0 = m_signal_stack_kernel_region->laddr().offset(defaultStackSize).get() & 0xfffffff8;
|
m_tss.esp0 = m_signal_stack_kernel_region->laddr().offset(default_stack_size).get() & 0xfffffff8;
|
||||||
push_value_on_stack(ret_eflags);
|
push_value_on_stack(ret_eflags);
|
||||||
push_value_on_stack(ret_cs);
|
push_value_on_stack(ret_cs);
|
||||||
push_value_on_stack(ret_eip);
|
push_value_on_stack(ret_eip);
|
||||||
|
@ -903,7 +903,7 @@ bool Process::dispatch_signal(byte signal)
|
||||||
set_state(Skip1SchedulerPass);
|
set_state(Skip1SchedulerPass);
|
||||||
|
|
||||||
#ifdef SIGNAL_DEBUG
|
#ifdef SIGNAL_DEBUG
|
||||||
dbgprintf("signal: Okay, %s(%u) {%s} has been primed with signal handler %w:%x\n", name().characters(), pid(), toString(state()), m_tss.cs, m_tss.eip);
|
dbgprintf("signal: Okay, %s(%u) {%s} has been primed with signal handler %w:%x\n", name().characters(), pid(), to_string(state()), m_tss.cs, m_tss.eip);
|
||||||
#endif
|
#endif
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -935,7 +935,7 @@ void Process::crash()
|
||||||
ASSERT_INTERRUPTS_DISABLED();
|
ASSERT_INTERRUPTS_DISABLED();
|
||||||
ASSERT(state() != Dead);
|
ASSERT(state() != Dead);
|
||||||
m_termination_signal = SIGSEGV;
|
m_termination_signal = SIGSEGV;
|
||||||
dumpRegions();
|
dump_regions();
|
||||||
die();
|
die();
|
||||||
Scheduler::pick_next_and_switch_now();
|
Scheduler::pick_next_and_switch_now();
|
||||||
ASSERT_NOT_REACHED();
|
ASSERT_NOT_REACHED();
|
||||||
|
@ -996,10 +996,10 @@ int Process::sys$ttyname_r(int fd, char* buffer, size_t size)
|
||||||
return -EBADF;
|
return -EBADF;
|
||||||
if (!descriptor->is_tty())
|
if (!descriptor->is_tty())
|
||||||
return -ENOTTY;
|
return -ENOTTY;
|
||||||
auto ttyName = descriptor->tty()->tty_name();
|
auto tty_name = descriptor->tty()->tty_name();
|
||||||
if (size < ttyName.length() + 1)
|
if (size < tty_name.length() + 1)
|
||||||
return -ERANGE;
|
return -ERANGE;
|
||||||
strcpy(buffer, ttyName.characters());
|
strcpy(buffer, tty_name.characters());
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1246,7 +1246,7 @@ int Process::sys$readlink(const char* path, char* buffer, size_t size)
|
||||||
if (!descriptor)
|
if (!descriptor)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
if (!descriptor->metadata().isSymbolicLink())
|
if (!descriptor->metadata().is_symlink())
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
auto contents = descriptor->read_entire_file(*this);
|
auto contents = descriptor->read_entire_file(*this);
|
||||||
|
@ -1389,7 +1389,7 @@ int Process::sys$uname(utsname* buf)
|
||||||
strcpy(buf->release, "1.0-dev");
|
strcpy(buf->release, "1.0-dev");
|
||||||
strcpy(buf->version, "FIXME");
|
strcpy(buf->version, "FIXME");
|
||||||
strcpy(buf->machine, "i386");
|
strcpy(buf->machine, "i386");
|
||||||
strcpy(buf->nodename, getHostname().characters());
|
strcpy(buf->nodename, get_hostname().characters());
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1427,9 +1427,9 @@ int Process::sys$sleep(unsigned seconds)
|
||||||
if (!seconds)
|
if (!seconds)
|
||||||
return 0;
|
return 0;
|
||||||
sleep(seconds * TICKS_PER_SECOND);
|
sleep(seconds * TICKS_PER_SECOND);
|
||||||
if (m_wakeupTime > system.uptime) {
|
if (m_wakeup_time > system.uptime) {
|
||||||
ASSERT(m_was_interrupted_while_blocked);
|
ASSERT(m_was_interrupted_while_blocked);
|
||||||
dword ticks_left_until_original_wakeup_time = m_wakeupTime - system.uptime;
|
dword ticks_left_until_original_wakeup_time = m_wakeup_time - system.uptime;
|
||||||
return ticks_left_until_original_wakeup_time / TICKS_PER_SECOND;
|
return ticks_left_until_original_wakeup_time / TICKS_PER_SECOND;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1496,7 +1496,7 @@ int Process::reap(Process& process)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dbgprintf("reap: %s(%u) {%s}\n", process.name().characters(), process.pid(), toString(process.state()));
|
dbgprintf("reap: %s(%u) {%s}\n", process.name().characters(), process.pid(), to_string(process.state()));
|
||||||
ASSERT(process.state() == Dead);
|
ASSERT(process.state() == Dead);
|
||||||
g_processes->remove(&process);
|
g_processes->remove(&process);
|
||||||
delete &process;
|
delete &process;
|
||||||
|
@ -1576,7 +1576,7 @@ void Process::unblock()
|
||||||
void Process::block(Process::State new_state)
|
void Process::block(Process::State new_state)
|
||||||
{
|
{
|
||||||
if (state() != Process::Running) {
|
if (state() != Process::Running) {
|
||||||
kprintf("Process::block: %s(%u) block(%u/%s) with state=%u/%s\n", name().characters(), pid(), new_state, toString(new_state), state(), toString(state()));
|
kprintf("Process::block: %s(%u) block(%u/%s) with state=%u/%s\n", name().characters(), pid(), new_state, to_string(new_state), state(), to_string(state()));
|
||||||
}
|
}
|
||||||
ASSERT(state() == Process::Running);
|
ASSERT(state() == Process::Running);
|
||||||
system.nblocked++;
|
system.nblocked++;
|
||||||
|
@ -1593,7 +1593,7 @@ void block(Process::State state)
|
||||||
void sleep(dword ticks)
|
void sleep(dword ticks)
|
||||||
{
|
{
|
||||||
ASSERT(current->state() == Process::Running);
|
ASSERT(current->state() == Process::Running);
|
||||||
current->setWakeupTime(system.uptime + ticks);
|
current->set_wakeup_time(system.uptime + ticks);
|
||||||
current->block(Process::BlockedSleep);
|
current->block(Process::BlockedSleep);
|
||||||
sched_yield();
|
sched_yield();
|
||||||
}
|
}
|
||||||
|
@ -1619,7 +1619,7 @@ bool Process::validate_read_from_kernel(LinearAddress laddr) const
|
||||||
|
|
||||||
bool Process::validate_read(const void* address, size_t size) const
|
bool Process::validate_read(const void* address, size_t size) const
|
||||||
{
|
{
|
||||||
if (isRing0()) {
|
if (is_ring0()) {
|
||||||
if (is_inside_kernel_code(LinearAddress((dword)address)))
|
if (is_inside_kernel_code(LinearAddress((dword)address)))
|
||||||
return true;
|
return true;
|
||||||
if (is_kmalloc_address(address))
|
if (is_kmalloc_address(address))
|
||||||
|
@ -1639,7 +1639,7 @@ bool Process::validate_read(const void* address, size_t size) const
|
||||||
|
|
||||||
bool Process::validate_write(void* address, size_t size) const
|
bool Process::validate_write(void* address, size_t size) const
|
||||||
{
|
{
|
||||||
if (isRing0()) {
|
if (is_ring0()) {
|
||||||
if (is_kmalloc_address(address))
|
if (is_kmalloc_address(address))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,7 +55,7 @@ public:
|
||||||
static Process* create_user_process(const String& path, uid_t, gid_t, pid_t ppid, int& error, Vector<String>&& arguments = Vector<String>(), Vector<String>&& environment = Vector<String>(), TTY* = nullptr);
|
static Process* create_user_process(const String& path, uid_t, gid_t, pid_t ppid, int& error, Vector<String>&& arguments = Vector<String>(), Vector<String>&& environment = Vector<String>(), TTY* = nullptr);
|
||||||
~Process();
|
~Process();
|
||||||
|
|
||||||
static Vector<Process*> allProcesses();
|
static Vector<Process*> all_processes();
|
||||||
|
|
||||||
enum State {
|
enum State {
|
||||||
Invalid = 0,
|
Invalid = 0,
|
||||||
|
@ -78,8 +78,8 @@ public:
|
||||||
Ring3 = 3,
|
Ring3 = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
bool isRing0() const { return m_ring == Ring0; }
|
bool is_ring0() const { return m_ring == Ring0; }
|
||||||
bool isRing3() const { return m_ring == Ring3; }
|
bool is_ring3() const { return m_ring == Ring3; }
|
||||||
|
|
||||||
bool is_blocked() const
|
bool is_blocked() const
|
||||||
{
|
{
|
||||||
|
@ -98,7 +98,7 @@ public:
|
||||||
pid_t sid() const { return m_sid; }
|
pid_t sid() const { return m_sid; }
|
||||||
pid_t pgid() const { return m_pgid; }
|
pid_t pgid() const { return m_pgid; }
|
||||||
dword ticks() const { return m_ticks; }
|
dword ticks() const { return m_ticks; }
|
||||||
word selector() const { return m_farPtr.selector; }
|
word selector() const { return m_far_ptr.selector; }
|
||||||
TSS32& tss() { return m_tss; }
|
TSS32& tss() { return m_tss; }
|
||||||
State state() const { return m_state; }
|
State state() const { return m_state; }
|
||||||
uid_t uid() const { return m_uid; }
|
uid_t uid() const { return m_uid; }
|
||||||
|
@ -107,7 +107,7 @@ public:
|
||||||
gid_t egid() const { return m_egid; }
|
gid_t egid() const { return m_egid; }
|
||||||
pid_t ppid() const { return m_ppid; }
|
pid_t ppid() const { return m_ppid; }
|
||||||
|
|
||||||
const FarPtr& farPtr() const { return m_farPtr; }
|
const FarPtr& far_ptr() const { return m_far_ptr; }
|
||||||
|
|
||||||
FileDescriptor* file_descriptor(int fd);
|
FileDescriptor* file_descriptor(int fd);
|
||||||
const FileDescriptor* file_descriptor(int fd) const;
|
const FileDescriptor* file_descriptor(int fd) const;
|
||||||
|
@ -115,8 +115,8 @@ public:
|
||||||
void block(Process::State);
|
void block(Process::State);
|
||||||
void unblock();
|
void unblock();
|
||||||
|
|
||||||
void setWakeupTime(dword t) { m_wakeupTime = t; }
|
void set_wakeup_time(dword t) { m_wakeup_time = t; }
|
||||||
dword wakeupTime() const { return m_wakeupTime; }
|
dword wakeup_time() const { return m_wakeup_time; }
|
||||||
|
|
||||||
template<typename Callback> static void for_each(Callback);
|
template<typename Callback> static void for_each(Callback);
|
||||||
template<typename Callback> static void for_each_in_pgrp(pid_t, Callback);
|
template<typename Callback> static void for_each_in_pgrp(pid_t, Callback);
|
||||||
|
@ -124,10 +124,10 @@ public:
|
||||||
template<typename Callback> static void for_each_not_in_state(State, Callback);
|
template<typename Callback> static void for_each_not_in_state(State, Callback);
|
||||||
template<typename Callback> void for_each_child(Callback);
|
template<typename Callback> void for_each_child(Callback);
|
||||||
|
|
||||||
bool tick() { ++m_ticks; return --m_ticksLeft; }
|
bool tick() { ++m_ticks; return --m_ticks_left; }
|
||||||
void set_ticks_left(dword t) { m_ticksLeft = t; }
|
void set_ticks_left(dword t) { m_ticks_left = t; }
|
||||||
|
|
||||||
void setSelector(word s) { m_farPtr.selector = s; }
|
void set_selector(word s) { m_far_ptr.selector = s; }
|
||||||
void set_state(State s) { m_state = s; }
|
void set_state(State s) { m_state = s; }
|
||||||
void die();
|
void die();
|
||||||
|
|
||||||
|
@ -225,12 +225,12 @@ public:
|
||||||
const TTY* tty() const { return m_tty; }
|
const TTY* tty() const { return m_tty; }
|
||||||
void set_tty(TTY* tty) { m_tty = tty; }
|
void set_tty(TTY* tty) { m_tty = tty; }
|
||||||
|
|
||||||
size_t regionCount() const { return m_regions.size(); }
|
size_t region_count() const { return m_regions.size(); }
|
||||||
const Vector<RetainPtr<Region>>& regions() const { return m_regions; }
|
const Vector<RetainPtr<Region>>& regions() const { return m_regions; }
|
||||||
void dumpRegions();
|
void dump_regions();
|
||||||
|
|
||||||
void did_schedule() { ++m_timesScheduled; }
|
void did_schedule() { ++m_times_scheduled; }
|
||||||
dword timesScheduled() const { return m_timesScheduled; }
|
dword times_scheduled() const { return m_times_scheduled; }
|
||||||
|
|
||||||
dword m_ticks_in_user { 0 };
|
dword m_ticks_in_user { 0 };
|
||||||
dword m_ticks_in_kernel { 0 };
|
dword m_ticks_in_kernel { 0 };
|
||||||
|
@ -240,9 +240,9 @@ public:
|
||||||
|
|
||||||
pid_t waitee_pid() const { return m_waitee_pid; }
|
pid_t waitee_pid() const { return m_waitee_pid; }
|
||||||
|
|
||||||
dword framePtr() const { return m_tss.ebp; }
|
dword frame_ptr() const { return m_tss.ebp; }
|
||||||
dword stackPtr() const { return m_tss.esp; }
|
dword stack_ptr() const { return m_tss.esp; }
|
||||||
dword stackTop() const { return m_tss.ss == 0x10 ? m_stackTop0 : m_stackTop3; }
|
dword stack_top() const { return m_tss.ss == 0x10 ? m_stack_top0 : m_stack_top3; }
|
||||||
|
|
||||||
bool validate_read_from_kernel(LinearAddress) const;
|
bool validate_read_from_kernel(LinearAddress) const;
|
||||||
|
|
||||||
|
@ -306,12 +306,12 @@ private:
|
||||||
pid_t m_sid { 0 };
|
pid_t m_sid { 0 };
|
||||||
pid_t m_pgid { 0 };
|
pid_t m_pgid { 0 };
|
||||||
dword m_ticks { 0 };
|
dword m_ticks { 0 };
|
||||||
dword m_ticksLeft { 0 };
|
dword m_ticks_left { 0 };
|
||||||
dword m_stackTop0 { 0 };
|
dword m_stack_top0 { 0 };
|
||||||
dword m_stackTop3 { 0 };
|
dword m_stack_top3 { 0 };
|
||||||
FarPtr m_farPtr;
|
FarPtr m_far_ptr;
|
||||||
State m_state { Invalid };
|
State m_state { Invalid };
|
||||||
dword m_wakeupTime { 0 };
|
dword m_wakeup_time { 0 };
|
||||||
TSS32 m_tss;
|
TSS32 m_tss;
|
||||||
TSS32 m_tss_to_resume_kernel;
|
TSS32 m_tss_to_resume_kernel;
|
||||||
FPUState m_fpu_state;
|
FPUState m_fpu_state;
|
||||||
|
@ -325,8 +325,8 @@ private:
|
||||||
Vector<FileDescriptorAndFlags> m_fds;
|
Vector<FileDescriptorAndFlags> m_fds;
|
||||||
RingLevel m_ring { Ring0 };
|
RingLevel m_ring { Ring0 };
|
||||||
int m_error { 0 };
|
int m_error { 0 };
|
||||||
void* m_kernelStack { nullptr };
|
void* m_kernel_stack { nullptr };
|
||||||
dword m_timesScheduled { 0 };
|
dword m_times_scheduled { 0 };
|
||||||
pid_t m_waitee_pid { -1 };
|
pid_t m_waitee_pid { -1 };
|
||||||
int m_blocked_fd { -1 };
|
int m_blocked_fd { -1 };
|
||||||
Vector<int> m_select_read_fds;
|
Vector<int> m_select_read_fds;
|
||||||
|
@ -349,12 +349,12 @@ private:
|
||||||
Region* allocate_region_with_vmo(LinearAddress, size_t, RetainPtr<VMObject>&&, size_t offset_in_vmo, String&& name, bool is_readable, bool is_writable);
|
Region* allocate_region_with_vmo(LinearAddress, size_t, RetainPtr<VMObject>&&, size_t offset_in_vmo, String&& name, bool is_readable, bool is_writable);
|
||||||
bool deallocate_region(Region& region);
|
bool deallocate_region(Region& region);
|
||||||
|
|
||||||
Region* regionFromRange(LinearAddress, size_t);
|
Region* region_from_range(LinearAddress, size_t);
|
||||||
|
|
||||||
Vector<RetainPtr<Region>> m_regions;
|
Vector<RetainPtr<Region>> m_regions;
|
||||||
|
|
||||||
// FIXME: Implement some kind of ASLR?
|
// FIXME: Implement some kind of ASLR?
|
||||||
LinearAddress m_nextRegion;
|
LinearAddress m_next_region;
|
||||||
|
|
||||||
LinearAddress m_return_to_ring3_from_signal_trampoline;
|
LinearAddress m_return_to_ring3_from_signal_trampoline;
|
||||||
LinearAddress m_return_to_ring0_from_signal_trampoline;
|
LinearAddress m_return_to_ring0_from_signal_trampoline;
|
||||||
|
@ -411,7 +411,7 @@ private:
|
||||||
Process::State m_original_state { Process::Invalid };
|
Process::State m_original_state { Process::Invalid };
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline const char* toString(Process::State state)
|
static inline const char* to_string(Process::State state)
|
||||||
{
|
{
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case Process::Invalid: return "Invalid";
|
case Process::Invalid: return "Invalid";
|
||||||
|
|
|
@ -81,7 +81,7 @@ int Process::gui$destroy_window(int window_id)
|
||||||
if (it == m_windows.end())
|
if (it == m_windows.end())
|
||||||
return -EBADWINDOW;
|
return -EBADWINDOW;
|
||||||
auto message = make<WSMessage>(WSMessage::WM_DestroyWindow);
|
auto message = make<WSMessage>(WSMessage::WM_DestroyWindow);
|
||||||
WSMessageLoop::the().post_message((*it).value.leakPtr(), move(message), true);
|
WSMessageLoop::the().post_message((*it).value.leak_ptr(), move(message), true);
|
||||||
m_windows.remove(window_id);
|
m_windows.remove(window_id);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -264,7 +264,7 @@ void Process::destroy_all_windows()
|
||||||
{
|
{
|
||||||
for (auto& it : m_windows) {
|
for (auto& it : m_windows) {
|
||||||
auto message = make<WSMessage>(WSMessage::WM_DestroyWindow);
|
auto message = make<WSMessage>(WSMessage::WM_DestroyWindow);
|
||||||
WSMessageLoop::the().post_message(it.value.leakPtr(), move(message), true);
|
WSMessageLoop::the().post_message(it.value.leak_ptr(), move(message), true);
|
||||||
}
|
}
|
||||||
m_windows.clear();
|
m_windows.clear();
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,21 +18,21 @@ public:
|
||||||
Queue() { }
|
Queue() { }
|
||||||
~Queue()
|
~Queue()
|
||||||
{
|
{
|
||||||
while (!isEmpty())
|
while (!is_empty())
|
||||||
dequeue();
|
dequeue();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isEmpty() const { return !m_head; }
|
bool is_empty() const { return !m_head; }
|
||||||
void enqueue(T&& item)
|
void enqueue(T&& item)
|
||||||
{
|
{
|
||||||
auto* newNode = new Node(move(item));
|
auto* new_node = new Node(move(item));
|
||||||
if (!m_head) {
|
if (!m_head) {
|
||||||
m_head = newNode;
|
m_head = new_node;
|
||||||
m_tail = newNode;
|
m_tail = new_node;
|
||||||
} else if (m_tail) {
|
} else if (m_tail) {
|
||||||
newNode->prev = m_tail;
|
new_node->prev = m_tail;
|
||||||
m_tail->next = newNode;
|
m_tail->next = new_node;
|
||||||
m_tail = newNode;
|
m_tail = new_node;
|
||||||
}
|
}
|
||||||
dump("enqueue");
|
dump("enqueue");
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,34 +4,34 @@
|
||||||
|
|
||||||
namespace RTC {
|
namespace RTC {
|
||||||
|
|
||||||
static time_t s_bootTime;
|
static time_t s_boot_time;
|
||||||
|
|
||||||
void initialize()
|
void initialize()
|
||||||
{
|
{
|
||||||
byte cmosMode = CMOS::read(0x0b);
|
byte cmos_mode = CMOS::read(0x0b);
|
||||||
cmosMode |= 2; // 24 hour mode
|
cmos_mode |= 2; // 24 hour mode
|
||||||
cmosMode |= 4; // No BCD mode
|
cmos_mode |= 4; // No BCD mode
|
||||||
CMOS::write(0x0b, cmosMode);
|
CMOS::write(0x0b, cmos_mode);
|
||||||
|
|
||||||
s_bootTime = now();
|
s_boot_time = now();
|
||||||
}
|
}
|
||||||
|
|
||||||
time_t bootTime()
|
time_t boot_time()
|
||||||
{
|
{
|
||||||
return s_bootTime;
|
return s_boot_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool updateInProgress()
|
static bool update_in_progress()
|
||||||
{
|
{
|
||||||
return CMOS::read(0x0a) & 0x80;
|
return CMOS::read(0x0a) & 0x80;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool isLeapYear(unsigned year)
|
inline bool is_leap_year(unsigned year)
|
||||||
{
|
{
|
||||||
return ((year % 4 == 0) && ((year % 100 != 0) || (year % 400) == 0));
|
return ((year % 4 == 0) && ((year % 100 != 0) || (year % 400) == 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned daysInMonthsSinceStartOfYear(unsigned month, unsigned year)
|
static unsigned days_in_months_since_start_of_year(unsigned month, unsigned year)
|
||||||
{
|
{
|
||||||
switch (month) {
|
switch (month) {
|
||||||
case 11: return 30;
|
case 11: return 30;
|
||||||
|
@ -44,7 +44,7 @@ static unsigned daysInMonthsSinceStartOfYear(unsigned month, unsigned year)
|
||||||
case 4: return 30;
|
case 4: return 30;
|
||||||
case 3: return 31;
|
case 3: return 31;
|
||||||
case 2:
|
case 2:
|
||||||
if (isLeapYear(year))
|
if (is_leap_year(year))
|
||||||
return 29;
|
return 29;
|
||||||
return 28;
|
return 28;
|
||||||
case 1: return 31;
|
case 1: return 31;
|
||||||
|
@ -52,12 +52,12 @@ static unsigned daysInMonthsSinceStartOfYear(unsigned month, unsigned year)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned daysInYearsSinceEpoch(unsigned year)
|
static unsigned days_in_years_since_epoch(unsigned year)
|
||||||
{
|
{
|
||||||
unsigned days = 0;
|
unsigned days = 0;
|
||||||
while (year > 1969) {
|
while (year > 1969) {
|
||||||
days += 365;
|
days += 365;
|
||||||
if (isLeapYear(year))
|
if (is_leap_year(year))
|
||||||
++days;
|
++days;
|
||||||
--year;
|
--year;
|
||||||
}
|
}
|
||||||
|
@ -69,7 +69,7 @@ time_t now()
|
||||||
// FIXME: We should probably do something more robust here.
|
// FIXME: We should probably do something more robust here.
|
||||||
// Perhaps read all the values twice and verify that they were identical.
|
// Perhaps read all the values twice and verify that they were identical.
|
||||||
// We don't want to be caught in the middle of an RTC register update.
|
// We don't want to be caught in the middle of an RTC register update.
|
||||||
while (updateInProgress())
|
while (update_in_progress())
|
||||||
;
|
;
|
||||||
|
|
||||||
unsigned year = (CMOS::read(0x32) * 100) + CMOS::read(0x09);
|
unsigned year = (CMOS::read(0x32) * 100) + CMOS::read(0x09);
|
||||||
|
@ -81,8 +81,8 @@ time_t now()
|
||||||
|
|
||||||
ASSERT(year >= 2018);
|
ASSERT(year >= 2018);
|
||||||
|
|
||||||
return daysInYearsSinceEpoch(year - 1) * 86400
|
return days_in_years_since_epoch(year - 1) * 86400
|
||||||
+ daysInMonthsSinceStartOfYear(month - 1, year) * 86400
|
+ days_in_months_since_start_of_year(month - 1, year) * 86400
|
||||||
+ day * 86400
|
+ day * 86400
|
||||||
+ hour * 3600
|
+ hour * 3600
|
||||||
+ minute * 60
|
+ minute * 60
|
||||||
|
|
|
@ -6,7 +6,7 @@ namespace RTC {
|
||||||
|
|
||||||
void initialize();
|
void initialize();
|
||||||
time_t now();
|
time_t now();
|
||||||
time_t bootTime();
|
time_t boot_time();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ bool Scheduler::pick_next()
|
||||||
// Check and unblock processes whose wait conditions have been met.
|
// Check and unblock processes whose wait conditions have been met.
|
||||||
Process::for_each([] (auto& process) {
|
Process::for_each([] (auto& process) {
|
||||||
if (process.state() == Process::BlockedSleep) {
|
if (process.state() == Process::BlockedSleep) {
|
||||||
if (process.wakeupTime() <= system.uptime)
|
if (process.wakeup_time() <= system.uptime)
|
||||||
process.unblock();
|
process.unblock();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -139,11 +139,11 @@ bool Scheduler::pick_next()
|
||||||
for (auto* process = g_processes->head(); process; process = process->next()) {
|
for (auto* process = g_processes->head(); process; process = process->next()) {
|
||||||
//if (process->state() == Process::BlockedWait || process->state() == Process::BlockedSleep)
|
//if (process->state() == Process::BlockedWait || process->state() == Process::BlockedSleep)
|
||||||
// continue;
|
// continue;
|
||||||
dbgprintf("[K%x] % 12s %s(%u) @ %w:%x\n", process, toString(process->state()), process->name().characters(), process->pid(), process->tss().cs, process->tss().eip);
|
dbgprintf("[K%x] % 12s %s(%u) @ %w:%x\n", process, to_string(process->state()), process->name().characters(), process->pid(), process->tss().cs, process->tss().eip);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
auto* prevHead = g_processes->head();
|
auto* previous_head = g_processes->head();
|
||||||
for (;;) {
|
for (;;) {
|
||||||
// Move head to tail.
|
// Move head to tail.
|
||||||
g_processes->append(g_processes->remove_head());
|
g_processes->append(g_processes->remove_head());
|
||||||
|
@ -156,7 +156,7 @@ bool Scheduler::pick_next()
|
||||||
return context_switch(*process);
|
return context_switch(*process);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (process == prevHead) {
|
if (process == previous_head) {
|
||||||
// Back at process_head, nothing wants to run. Send in the colonel!
|
// Back at process_head, nothing wants to run. Send in the colonel!
|
||||||
return context_switch(*s_colonel_process);
|
return context_switch(*s_colonel_process);
|
||||||
}
|
}
|
||||||
|
@ -182,7 +182,7 @@ bool Scheduler::yield()
|
||||||
}
|
}
|
||||||
|
|
||||||
s_in_yield = false;
|
s_in_yield = false;
|
||||||
//dbgprintf("yield() jumping to new process: %x (%s)\n", current->farPtr().selector, current->name().characters());
|
//dbgprintf("yield() jumping to new process: %x (%s)\n", current->far_ptr().selector, current->name().characters());
|
||||||
switch_now();
|
switch_now();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -201,7 +201,7 @@ void Scheduler::switch_now()
|
||||||
flush_gdt();
|
flush_gdt();
|
||||||
asm("sti\n"
|
asm("sti\n"
|
||||||
"ljmp *(%%eax)\n"
|
"ljmp *(%%eax)\n"
|
||||||
::"a"(¤t->farPtr())
|
::"a"(¤t->far_ptr())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -238,10 +238,10 @@ bool Scheduler::context_switch(Process& process)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!process.selector()) {
|
if (!process.selector()) {
|
||||||
process.setSelector(gdt_alloc_entry());
|
process.set_selector(gdt_alloc_entry());
|
||||||
auto& descriptor = get_gdt_entry(process.selector());
|
auto& descriptor = get_gdt_entry(process.selector());
|
||||||
descriptor.setBase(&process.tss());
|
descriptor.set_base(&process.tss());
|
||||||
descriptor.setLimit(0xffff);
|
descriptor.set_limit(0xffff);
|
||||||
descriptor.dpl = 0;
|
descriptor.dpl = 0;
|
||||||
descriptor.segment_present = 1;
|
descriptor.segment_present = 1;
|
||||||
descriptor.granularity = 1;
|
descriptor.granularity = 1;
|
||||||
|
@ -264,8 +264,8 @@ int sched_yield()
|
||||||
static void initialize_redirection()
|
static void initialize_redirection()
|
||||||
{
|
{
|
||||||
auto& descriptor = get_gdt_entry(s_redirection.selector);
|
auto& descriptor = get_gdt_entry(s_redirection.selector);
|
||||||
descriptor.setBase(&s_redirection.tss);
|
descriptor.set_base(&s_redirection.tss);
|
||||||
descriptor.setLimit(0xffff);
|
descriptor.set_limit(0xffff);
|
||||||
descriptor.dpl = 0;
|
descriptor.dpl = 0;
|
||||||
descriptor.segment_present = 1;
|
descriptor.segment_present = 1;
|
||||||
descriptor.granularity = 1;
|
descriptor.granularity = 1;
|
||||||
|
|
|
@ -202,18 +202,18 @@ ssize_t SynthFSInode::read_bytes(off_t offset, size_t count, byte* buffer, FileD
|
||||||
ASSERT(offset >= 0);
|
ASSERT(offset >= 0);
|
||||||
ASSERT(buffer);
|
ASSERT(buffer);
|
||||||
|
|
||||||
ByteBuffer generatedData;
|
ByteBuffer generated_data;
|
||||||
if (m_generator) {
|
if (m_generator) {
|
||||||
if (!descriptor) {
|
if (!descriptor) {
|
||||||
generatedData = m_generator(const_cast<SynthFSInode&>(*this));
|
generated_data = m_generator(const_cast<SynthFSInode&>(*this));
|
||||||
} else {
|
} else {
|
||||||
if (!descriptor->generator_cache())
|
if (!descriptor->generator_cache())
|
||||||
descriptor->generator_cache() = m_generator(const_cast<SynthFSInode&>(*this));
|
descriptor->generator_cache() = m_generator(const_cast<SynthFSInode&>(*this));
|
||||||
generatedData = descriptor->generator_cache();
|
generated_data = descriptor->generator_cache();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto* data = generatedData ? &generatedData : &m_data;
|
auto* data = generated_data ? &generated_data : &m_data;
|
||||||
ssize_t nread = min(static_cast<off_t>(data->size() - offset), static_cast<off_t>(count));
|
ssize_t nread = min(static_cast<off_t>(data->size() - offset), static_cast<off_t>(count));
|
||||||
memcpy(buffer, data->pointer() + offset, nread);
|
memcpy(buffer, data->pointer() + offset, nread);
|
||||||
if (nread == 0 && descriptor && descriptor->generator_cache())
|
if (nread == 0 && descriptor && descriptor->generator_cache())
|
||||||
|
@ -228,14 +228,14 @@ bool SynthFSInode::traverse_as_directory(Function<bool(const FS::DirectoryEntry&
|
||||||
kprintf("SynthFS: traverse_as_directory %u\n", index());
|
kprintf("SynthFS: traverse_as_directory %u\n", index());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!m_metadata.isDirectory())
|
if (!m_metadata.is_directory())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
callback({ ".", 1, m_metadata.inode, 2 });
|
callback({ ".", 1, m_metadata.inode, 2 });
|
||||||
callback({ "..", 2, m_parent, 2 });
|
callback({ "..", 2, m_parent, 2 });
|
||||||
|
|
||||||
for (auto& child : m_children)
|
for (auto& child : m_children)
|
||||||
callback({ child->m_name.characters(), child->m_name.length(), child->m_metadata.inode, child->m_metadata.isDirectory() ? (byte)2 : (byte)1 });
|
callback({ child->m_name.characters(), child->m_name.length(), child->m_metadata.inode, child->m_metadata.is_directory() ? (byte)2 : (byte)1 });
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,13 +4,13 @@
|
||||||
#include "Console.h"
|
#include "Console.h"
|
||||||
#include "Scheduler.h"
|
#include "Scheduler.h"
|
||||||
|
|
||||||
extern "C" void syscall_entry(RegisterDump&);
|
extern "C" void syscall_trap_entry(RegisterDump&);
|
||||||
extern "C" void syscall_ISR();
|
extern "C" void syscall_trap_handler();
|
||||||
extern volatile RegisterDump* syscallRegDump;
|
extern volatile RegisterDump* syscallRegDump;
|
||||||
|
|
||||||
asm(
|
asm(
|
||||||
".globl syscall_ISR \n"
|
".globl syscall_trap_handler \n"
|
||||||
"syscall_ISR:\n"
|
"syscall_trap_handler:\n"
|
||||||
" pusha\n"
|
" pusha\n"
|
||||||
" pushw %ds\n"
|
" pushw %ds\n"
|
||||||
" pushw %es\n"
|
" pushw %es\n"
|
||||||
|
@ -26,7 +26,7 @@ asm(
|
||||||
" popw %fs\n"
|
" popw %fs\n"
|
||||||
" popw %gs\n"
|
" popw %gs\n"
|
||||||
" mov %esp, %eax\n"
|
" mov %esp, %eax\n"
|
||||||
" call syscall_entry\n"
|
" call syscall_trap_entry\n"
|
||||||
" popw %gs\n"
|
" popw %gs\n"
|
||||||
" popw %gs\n"
|
" popw %gs\n"
|
||||||
" popw %fs\n"
|
" popw %fs\n"
|
||||||
|
@ -40,7 +40,7 @@ namespace Syscall {
|
||||||
|
|
||||||
void initialize()
|
void initialize()
|
||||||
{
|
{
|
||||||
register_user_callable_interrupt_handler(0x80, syscall_ISR);
|
register_user_callable_interrupt_handler(0x80, syscall_trap_handler);
|
||||||
kprintf("syscall: int 0x80 handler installed\n");
|
kprintf("syscall: int 0x80 handler installed\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -232,7 +232,7 @@ static dword handle(RegisterDump& regs, dword function, dword arg1, dword arg2,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void syscall_entry(RegisterDump& regs)
|
void syscall_trap_entry(RegisterDump& regs)
|
||||||
{
|
{
|
||||||
dword function = regs.eax;
|
dword function = regs.eax;
|
||||||
dword arg1 = regs.edx;
|
dword arg1 = regs.edx;
|
||||||
|
|
|
@ -99,7 +99,7 @@ enum Function {
|
||||||
#undef __ENUMERATE_SYSCALL
|
#undef __ENUMERATE_SYSCALL
|
||||||
};
|
};
|
||||||
|
|
||||||
inline constexpr const char* toString(Function function)
|
inline constexpr const char* to_string(Function function)
|
||||||
{
|
{
|
||||||
switch (function) {
|
switch (function) {
|
||||||
#undef __ENUMERATE_SYSCALL
|
#undef __ENUMERATE_SYSCALL
|
||||||
|
|
|
@ -88,7 +88,7 @@ void VirtualConsole::switch_to(unsigned index)
|
||||||
s_consoles[s_active_console]->set_active(false);
|
s_consoles[s_active_console]->set_active(false);
|
||||||
s_active_console = index;
|
s_active_console = index;
|
||||||
s_consoles[s_active_console]->set_active(true);
|
s_consoles[s_active_console]->set_active(true);
|
||||||
Console::the().setImplementation(s_consoles[s_active_console]);
|
Console::the().set_implementation(s_consoles[s_active_console]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VirtualConsole::set_active(bool b)
|
void VirtualConsole::set_active(bool b)
|
||||||
|
@ -128,7 +128,7 @@ inline bool is_valid_final_character(byte ch)
|
||||||
return ch >= 0x40 && ch <= 0x7e;
|
return ch >= 0x40 && ch <= 0x7e;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned parseUInt(const String& str, bool& ok)
|
unsigned parse_uint(const String& str, bool& ok)
|
||||||
{
|
{
|
||||||
unsigned value = 0;
|
unsigned value = 0;
|
||||||
for (size_t i = 0; i < str.length(); ++i) {
|
for (size_t i = 0; i < str.length(); ++i) {
|
||||||
|
@ -302,11 +302,11 @@ void VirtualConsole::escape$J(const Vector<unsigned>& params)
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case 0:
|
case 0:
|
||||||
// FIXME: Clear from cursor to end of screen.
|
// FIXME: Clear from cursor to end of screen.
|
||||||
notImplemented();
|
not_implemented();
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
// FIXME: Clear from cursor to beginning of screen.
|
// FIXME: Clear from cursor to beginning of screen.
|
||||||
notImplemented();
|
not_implemented();
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
clear();
|
clear();
|
||||||
|
@ -324,7 +324,7 @@ void VirtualConsole::execute_escape_sequence(byte final)
|
||||||
Vector<unsigned> params;
|
Vector<unsigned> params;
|
||||||
for (auto& parampart : paramparts) {
|
for (auto& parampart : paramparts) {
|
||||||
bool ok;
|
bool ok;
|
||||||
unsigned value = parseUInt(parampart, ok);
|
unsigned value = parse_uint(parampart, ok);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
// FIXME: Should we do something else?
|
// FIXME: Should we do something else?
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -43,9 +43,9 @@ InodeIdentifier VFS::root_inode_id() const
|
||||||
return m_root_inode->identifier();
|
return m_root_inode->identifier();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool VFS::mount(RetainPtr<FS>&& fileSystem, const String& path)
|
bool VFS::mount(RetainPtr<FS>&& file_system, const String& path)
|
||||||
{
|
{
|
||||||
ASSERT(fileSystem);
|
ASSERT(file_system);
|
||||||
int error;
|
int error;
|
||||||
auto inode = resolve_path(path, root_inode_id(), error);
|
auto inode = resolve_path(path, root_inode_id(), error);
|
||||||
if (!inode.is_valid()) {
|
if (!inode.is_valid()) {
|
||||||
|
@ -53,21 +53,21 @@ bool VFS::mount(RetainPtr<FS>&& fileSystem, const String& path)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
kprintf("VFS: mounting %s{%p} at %s (inode: %u)\n", fileSystem->class_name(), fileSystem.ptr(), path.characters(), inode.index());
|
kprintf("VFS: mounting %s{%p} at %s (inode: %u)\n", file_system->class_name(), file_system.ptr(), path.characters(), inode.index());
|
||||||
// FIXME: check that this is not already a mount point
|
// FIXME: check that this is not already a mount point
|
||||||
auto mount = make<Mount>(inode, move(fileSystem));
|
auto mount = make<Mount>(inode, move(file_system));
|
||||||
m_mounts.append(move(mount));
|
m_mounts.append(move(mount));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool VFS::mount_root(RetainPtr<FS>&& fileSystem)
|
bool VFS::mount_root(RetainPtr<FS>&& file_system)
|
||||||
{
|
{
|
||||||
if (m_root_inode) {
|
if (m_root_inode) {
|
||||||
kprintf("VFS: mount_root can't mount another root\n");
|
kprintf("VFS: mount_root can't mount another root\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto mount = make<Mount>(InodeIdentifier(), move(fileSystem));
|
auto mount = make<Mount>(InodeIdentifier(), move(file_system));
|
||||||
|
|
||||||
auto root_inode_id = mount->guest().fs()->root_inode();
|
auto root_inode_id = mount->guest().fs()->root_inode();
|
||||||
auto root_inode = mount->guest().fs()->get_inode(root_inode_id);
|
auto root_inode = mount->guest().fs()->get_inode(root_inode_id);
|
||||||
|
@ -112,18 +112,18 @@ bool VFS::is_vfs_root(InodeIdentifier inode) const
|
||||||
void VFS::traverse_directory_inode(Inode& dir_inode, Function<bool(const FS::DirectoryEntry&)> callback)
|
void VFS::traverse_directory_inode(Inode& dir_inode, Function<bool(const FS::DirectoryEntry&)> callback)
|
||||||
{
|
{
|
||||||
dir_inode.traverse_as_directory([&] (const FS::DirectoryEntry& entry) {
|
dir_inode.traverse_as_directory([&] (const FS::DirectoryEntry& entry) {
|
||||||
InodeIdentifier resolvedInode;
|
InodeIdentifier resolved_inode;
|
||||||
if (auto mount = find_mount_for_host(entry.inode))
|
if (auto mount = find_mount_for_host(entry.inode))
|
||||||
resolvedInode = mount->guest();
|
resolved_inode = mount->guest();
|
||||||
else
|
else
|
||||||
resolvedInode = entry.inode;
|
resolved_inode = entry.inode;
|
||||||
|
|
||||||
if (dir_inode.identifier().is_root_inode() && !is_vfs_root(dir_inode.identifier()) && !strcmp(entry.name, "..")) {
|
if (dir_inode.identifier().is_root_inode() && !is_vfs_root(dir_inode.identifier()) && !strcmp(entry.name, "..")) {
|
||||||
auto mount = find_mount_for_guest(entry.inode);
|
auto mount = find_mount_for_guest(entry.inode);
|
||||||
ASSERT(mount);
|
ASSERT(mount);
|
||||||
resolvedInode = mount->host();
|
resolved_inode = mount->host();
|
||||||
}
|
}
|
||||||
callback(FS::DirectoryEntry(entry.name, entry.name_length, resolvedInode, entry.fileType));
|
callback(FS::DirectoryEntry(entry.name, entry.name_length, resolved_inode, entry.file_type));
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -146,10 +146,10 @@ RetainPtr<FileDescriptor> VFS::open(const String& path, int& error, int options,
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
auto metadata = inode->metadata();
|
auto metadata = inode->metadata();
|
||||||
if (!(options & O_DONT_OPEN_DEVICE) && metadata.isCharacterDevice()) {
|
if (!(options & O_DONT_OPEN_DEVICE) && metadata.is_character_device()) {
|
||||||
auto it = m_character_devices.find(encodedDevice(metadata.majorDevice, metadata.minorDevice));
|
auto it = m_character_devices.find(encoded_device(metadata.major_device, metadata.minor_device));
|
||||||
if (it == m_character_devices.end()) {
|
if (it == m_character_devices.end()) {
|
||||||
kprintf("VFS::open: no such character device %u,%u\n", metadata.majorDevice, metadata.minorDevice);
|
kprintf("VFS::open: no such character device %u,%u\n", metadata.major_device, metadata.minor_device);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
auto descriptor = (*it).value->open(error, options);
|
auto descriptor = (*it).value->open(error, options);
|
||||||
|
@ -164,7 +164,7 @@ RetainPtr<FileDescriptor> VFS::create(const String& path, int& error, int option
|
||||||
(void) options;
|
(void) options;
|
||||||
error = -EWHYTHO;
|
error = -EWHYTHO;
|
||||||
|
|
||||||
if (!isSocket(mode) && !isFIFO(mode) && !isBlockDevice(mode) && !isCharacterDevice(mode)) {
|
if (!is_socket(mode) && !is_fifo(mode) && !is_block_device(mode) && !is_character_device(mode)) {
|
||||||
// Turn it into a regular file. (This feels rather hackish.)
|
// Turn it into a regular file. (This feels rather hackish.)
|
||||||
mode |= 0100000;
|
mode |= 0100000;
|
||||||
}
|
}
|
||||||
|
@ -412,7 +412,7 @@ String VFS::absolute_path(Inode& core_inode)
|
||||||
auto parent_inode = get_inode(parent);
|
auto parent_inode = get_inode(parent);
|
||||||
builder.append(parent_inode->reverse_lookup(child));
|
builder.append(parent_inode->reverse_lookup(child));
|
||||||
}
|
}
|
||||||
return builder.build();
|
return builder.to_string();
|
||||||
}
|
}
|
||||||
|
|
||||||
InodeIdentifier VFS::resolve_path(const String& path, InodeIdentifier base, int& error, int options, InodeIdentifier* parent_id)
|
InodeIdentifier VFS::resolve_path(const String& path, InodeIdentifier base, int& error, int options, InodeIdentifier* parent_id)
|
||||||
|
@ -447,7 +447,7 @@ InodeIdentifier VFS::resolve_path(const String& path, InodeIdentifier base, int&
|
||||||
return { };
|
return { };
|
||||||
}
|
}
|
||||||
auto metadata = crumb_inode->metadata();
|
auto metadata = crumb_inode->metadata();
|
||||||
if (!metadata.isDirectory()) {
|
if (!metadata.is_directory()) {
|
||||||
#ifdef VFS_DEBUG
|
#ifdef VFS_DEBUG
|
||||||
kprintf("parent of <%s> not directory, it's inode %u:%u / %u:%u, mode: %u, size: %u\n", part.characters(), inode.fsid(), inode.index(), metadata.inode.fsid(), metadata.inode.index(), metadata.mode, metadata.size);
|
kprintf("parent of <%s> not directory, it's inode %u:%u / %u:%u, mode: %u, size: %u\n", part.characters(), inode.fsid(), inode.index(), metadata.inode.fsid(), metadata.inode.index(), metadata.mode, metadata.size);
|
||||||
#endif
|
#endif
|
||||||
|
@ -482,13 +482,13 @@ InodeIdentifier VFS::resolve_path(const String& path, InodeIdentifier base, int&
|
||||||
}
|
}
|
||||||
crumb_inode = get_inode(crumb_id);
|
crumb_inode = get_inode(crumb_id);
|
||||||
metadata = crumb_inode->metadata();
|
metadata = crumb_inode->metadata();
|
||||||
if (metadata.isDirectory()) {
|
if (metadata.is_directory()) {
|
||||||
if (i != parts.size() - 1) {
|
if (i != parts.size() - 1) {
|
||||||
if (parent_id)
|
if (parent_id)
|
||||||
*parent_id = crumb_id;
|
*parent_id = crumb_id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (metadata.isSymbolicLink()) {
|
if (metadata.is_symlink()) {
|
||||||
if (i == parts.size() - 1) {
|
if (i == parts.size() - 1) {
|
||||||
if (options & O_NOFOLLOW) {
|
if (options & O_NOFOLLOW) {
|
||||||
error = -ELOOP;
|
error = -ELOOP;
|
||||||
|
@ -517,17 +517,17 @@ VFS::Mount::Mount(InodeIdentifier host, RetainPtr<FS>&& guest_fs)
|
||||||
|
|
||||||
void VFS::register_character_device(CharacterDevice& device)
|
void VFS::register_character_device(CharacterDevice& device)
|
||||||
{
|
{
|
||||||
m_character_devices.set(encodedDevice(device.major(), device.minor()), &device);
|
m_character_devices.set(encoded_device(device.major(), device.minor()), &device);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VFS::unregister_character_device(CharacterDevice& device)
|
void VFS::unregister_character_device(CharacterDevice& device)
|
||||||
{
|
{
|
||||||
m_character_devices.remove(encodedDevice(device.major(), device.minor()));
|
m_character_devices.remove(encoded_device(device.major(), device.minor()));
|
||||||
}
|
}
|
||||||
|
|
||||||
CharacterDevice* VFS::get_device(unsigned major, unsigned minor)
|
CharacterDevice* VFS::get_device(unsigned major, unsigned minor)
|
||||||
{
|
{
|
||||||
auto it = m_character_devices.find(encodedDevice(major, minor));
|
auto it = m_character_devices.find(encoded_device(major, minor));
|
||||||
if (it == m_character_devices.end())
|
if (it == m_character_devices.end())
|
||||||
return nullptr;
|
return nullptr;
|
||||||
return (*it).value;
|
return (*it).value;
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
class CharacterDevice;
|
class CharacterDevice;
|
||||||
class FileDescriptor;
|
class FileDescriptor;
|
||||||
|
|
||||||
inline constexpr dword encodedDevice(unsigned major, unsigned minor)
|
inline constexpr dword encoded_device(unsigned major, unsigned minor)
|
||||||
{
|
{
|
||||||
return (minor & 0xff) | (major << 8) | ((minor & ~0xff) << 12);
|
return (minor & 0xff) | (major << 8) | ((minor & ~0xff) << 12);
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ static DescriptorTablePointer s_gdtr;
|
||||||
static Descriptor* s_idt;
|
static Descriptor* s_idt;
|
||||||
static Descriptor* s_gdt;
|
static Descriptor* s_gdt;
|
||||||
|
|
||||||
static IRQHandler** s_irqHandler;
|
static IRQHandler** s_irq_handler;
|
||||||
|
|
||||||
static Vector<word, KmallocEternalAllocator>* s_gdt_freelist;
|
static Vector<word, KmallocEternalAllocator>* s_gdt_freelist;
|
||||||
|
|
||||||
|
@ -125,11 +125,11 @@ asm( \
|
||||||
EH_ENTRY_NO_CODE(6);
|
EH_ENTRY_NO_CODE(6);
|
||||||
void exception_6_handler(RegisterDump& regs)
|
void exception_6_handler(RegisterDump& regs)
|
||||||
{
|
{
|
||||||
kprintf("%s invalid opcode: %u(%s)\n", current->isRing0() ? "Kernel" : "Process", current->pid(), current->name().characters());
|
kprintf("%s invalid opcode: %u(%s)\n", current->is_ring0() ? "Kernel" : "Process", current->pid(), current->name().characters());
|
||||||
|
|
||||||
word ss;
|
word ss;
|
||||||
dword esp;
|
dword esp;
|
||||||
if (current->isRing0()) {
|
if (current->is_ring0()) {
|
||||||
ss = regs.ds;
|
ss = regs.ds;
|
||||||
esp = regs.esp;
|
esp = regs.esp;
|
||||||
} else {
|
} else {
|
||||||
|
@ -142,7 +142,7 @@ void exception_6_handler(RegisterDump& regs)
|
||||||
kprintf("eax=%x ebx=%x ecx=%x edx=%x\n", regs.eax, regs.ebx, regs.ecx, regs.edx);
|
kprintf("eax=%x ebx=%x ecx=%x edx=%x\n", regs.eax, regs.ebx, regs.ecx, regs.edx);
|
||||||
kprintf("ebp=%x esp=%x esi=%x edi=%x\n", regs.ebp, esp, regs.esi, regs.edi);
|
kprintf("ebp=%x esp=%x esi=%x edi=%x\n", regs.ebp, esp, regs.esi, regs.edi);
|
||||||
|
|
||||||
if (current->isRing0()) {
|
if (current->is_ring0()) {
|
||||||
kprintf("Oh shit, we've crashed in ring 0 :(\n");
|
kprintf("Oh shit, we've crashed in ring 0 :(\n");
|
||||||
HANG;
|
HANG;
|
||||||
}
|
}
|
||||||
|
@ -175,11 +175,11 @@ void exception_7_handler(RegisterDump& regs)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef FPU_EXCEPTION_DEBUG
|
#ifdef FPU_EXCEPTION_DEBUG
|
||||||
kprintf("%s FPU not available exception: %u(%s)\n", current->isRing0() ? "Kernel" : "Process", current->pid(), current->name().characters());
|
kprintf("%s FPU not available exception: %u(%s)\n", current->is_ring0() ? "Kernel" : "Process", current->pid(), current->name().characters());
|
||||||
|
|
||||||
word ss;
|
word ss;
|
||||||
dword esp;
|
dword esp;
|
||||||
if (current->isRing0()) {
|
if (current->is_ring0()) {
|
||||||
ss = regs.ds;
|
ss = regs.ds;
|
||||||
esp = regs.esp;
|
esp = regs.esp;
|
||||||
} else {
|
} else {
|
||||||
|
@ -199,11 +199,11 @@ void exception_7_handler(RegisterDump& regs)
|
||||||
EH_ENTRY(13);
|
EH_ENTRY(13);
|
||||||
void exception_13_handler(RegisterDumpWithExceptionCode& regs)
|
void exception_13_handler(RegisterDumpWithExceptionCode& regs)
|
||||||
{
|
{
|
||||||
kprintf("%s GPF: %u(%s)\n", current->isRing0() ? "Kernel" : "User", current->pid(), current->name().characters());
|
kprintf("%s GPF: %u(%s)\n", current->is_ring0() ? "Kernel" : "User", current->pid(), current->name().characters());
|
||||||
|
|
||||||
word ss;
|
word ss;
|
||||||
dword esp;
|
dword esp;
|
||||||
if (current->isRing0()) {
|
if (current->is_ring0()) {
|
||||||
ss = regs.ds;
|
ss = regs.ds;
|
||||||
esp = regs.esp;
|
esp = regs.esp;
|
||||||
} else {
|
} else {
|
||||||
|
@ -217,7 +217,7 @@ void exception_13_handler(RegisterDumpWithExceptionCode& regs)
|
||||||
kprintf("eax=%x ebx=%x ecx=%x edx=%x\n", regs.eax, regs.ebx, regs.ecx, regs.edx);
|
kprintf("eax=%x ebx=%x ecx=%x edx=%x\n", regs.eax, regs.ebx, regs.ecx, regs.edx);
|
||||||
kprintf("ebp=%x esp=%x esi=%x edi=%x\n", regs.ebp, esp, regs.esi, regs.edi);
|
kprintf("ebp=%x esp=%x esi=%x edi=%x\n", regs.ebp, esp, regs.esi, regs.edi);
|
||||||
|
|
||||||
if (current->isRing0()) {
|
if (current->is_ring0()) {
|
||||||
kprintf("Oh shit, we've crashed in ring 0 :(\n");
|
kprintf("Oh shit, we've crashed in ring 0 :(\n");
|
||||||
HANG;
|
HANG;
|
||||||
}
|
}
|
||||||
|
@ -248,7 +248,7 @@ void exception_14_handler(RegisterDumpWithExceptionCode& regs)
|
||||||
|
|
||||||
word ss;
|
word ss;
|
||||||
dword esp;
|
dword esp;
|
||||||
if (current->isRing0()) {
|
if (current->is_ring0()) {
|
||||||
ss = regs.ds;
|
ss = regs.ds;
|
||||||
esp = regs.esp;
|
esp = regs.esp;
|
||||||
} else {
|
} else {
|
||||||
|
@ -278,9 +278,9 @@ void exception_14_handler(RegisterDumpWithExceptionCode& regs)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (current->isRing0()) {
|
if (current->is_ring0()) {
|
||||||
dump_registers_and_code();
|
dump_registers_and_code();
|
||||||
current->dumpRegions();
|
current->dump_regions();
|
||||||
HANG;
|
HANG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -335,7 +335,7 @@ EH(12, "Stack exception")
|
||||||
EH(15, "Unknown error")
|
EH(15, "Unknown error")
|
||||||
EH(16, "Coprocessor error")
|
EH(16, "Coprocessor error")
|
||||||
|
|
||||||
static void writeRawGDTEntry(word selector, dword low, dword high)
|
static void write_raw_gdt_entry(word selector, dword low, dword high)
|
||||||
{
|
{
|
||||||
word i = (selector & 0xfffc) >> 3;
|
word i = (selector & 0xfffc) >> 3;
|
||||||
s_gdt[i].low = low;
|
s_gdt[i].low = low;
|
||||||
|
@ -348,7 +348,7 @@ static void writeRawGDTEntry(word selector, dword low, dword high)
|
||||||
|
|
||||||
void write_gdt_entry(word selector, Descriptor& descriptor)
|
void write_gdt_entry(word selector, Descriptor& descriptor)
|
||||||
{
|
{
|
||||||
writeRawGDTEntry(selector, descriptor.low, descriptor.high);
|
write_raw_gdt_entry(selector, descriptor.low, descriptor.high);
|
||||||
}
|
}
|
||||||
|
|
||||||
Descriptor& get_gdt_entry(word selector)
|
Descriptor& get_gdt_entry(word selector)
|
||||||
|
@ -378,11 +378,11 @@ void gdt_init()
|
||||||
s_gdtr.address = s_gdt;
|
s_gdtr.address = s_gdt;
|
||||||
s_gdtr.size = (s_gdtLength * 8) - 1;
|
s_gdtr.size = (s_gdtLength * 8) - 1;
|
||||||
|
|
||||||
writeRawGDTEntry(0x0000, 0x00000000, 0x00000000);
|
write_raw_gdt_entry(0x0000, 0x00000000, 0x00000000);
|
||||||
writeRawGDTEntry(0x0008, 0x0000ffff, 0x00cf9a00);
|
write_raw_gdt_entry(0x0008, 0x0000ffff, 0x00cf9a00);
|
||||||
writeRawGDTEntry(0x0010, 0x0000ffff, 0x00cf9200);
|
write_raw_gdt_entry(0x0010, 0x0000ffff, 0x00cf9200);
|
||||||
writeRawGDTEntry(0x0018, 0x0000ffff, 0x00cffa00);
|
write_raw_gdt_entry(0x0018, 0x0000ffff, 0x00cffa00);
|
||||||
writeRawGDTEntry(0x0020, 0x0000ffff, 0x00cff200);
|
write_raw_gdt_entry(0x0020, 0x0000ffff, 0x00cff200);
|
||||||
|
|
||||||
flush_gdt();
|
flush_gdt();
|
||||||
}
|
}
|
||||||
|
@ -395,15 +395,15 @@ static void unimp_trap()
|
||||||
|
|
||||||
void register_irq_handler(byte irq, IRQHandler& handler)
|
void register_irq_handler(byte irq, IRQHandler& handler)
|
||||||
{
|
{
|
||||||
ASSERT(!s_irqHandler[irq]);
|
ASSERT(!s_irq_handler[irq]);
|
||||||
s_irqHandler[irq] = &handler;
|
s_irq_handler[irq] = &handler;
|
||||||
register_interrupt_handler(IRQ_VECTOR_BASE + irq, asm_irq_entry);
|
register_interrupt_handler(IRQ_VECTOR_BASE + irq, asm_irq_entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
void unregister_irq_handler(byte irq, IRQHandler& handler)
|
void unregister_irq_handler(byte irq, IRQHandler& handler)
|
||||||
{
|
{
|
||||||
ASSERT(s_irqHandler[irq] == &handler);
|
ASSERT(s_irq_handler[irq] == &handler);
|
||||||
s_irqHandler[irq] = nullptr;
|
s_irq_handler[irq] = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void register_interrupt_handler(byte index, void (*f)())
|
void register_interrupt_handler(byte index, void (*f)())
|
||||||
|
@ -467,9 +467,9 @@ void idt_init()
|
||||||
|
|
||||||
register_interrupt_handler(0x57, irq7_handler);
|
register_interrupt_handler(0x57, irq7_handler);
|
||||||
|
|
||||||
s_irqHandler = static_cast<IRQHandler**>(kmalloc_eternal(sizeof(IRQHandler*) * 16));
|
s_irq_handler = static_cast<IRQHandler**>(kmalloc_eternal(sizeof(IRQHandler*) * 16));
|
||||||
for (byte i = 0; i < 16; ++i) {
|
for (byte i = 0; i < 16; ++i) {
|
||||||
s_irqHandler[i] = nullptr;
|
s_irq_handler[i] = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
flush_idt();
|
flush_idt();
|
||||||
|
@ -482,7 +482,7 @@ void load_task_register(word selector)
|
||||||
|
|
||||||
void handle_irq()
|
void handle_irq()
|
||||||
{
|
{
|
||||||
word isr = PIC::getISR();
|
word isr = PIC::get_isr();
|
||||||
if (!isr) {
|
if (!isr) {
|
||||||
kprintf("Spurious IRQ\n");
|
kprintf("Spurious IRQ\n");
|
||||||
return;
|
return;
|
||||||
|
@ -498,8 +498,8 @@ void handle_irq()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s_irqHandler[irq])
|
if (s_irq_handler[irq])
|
||||||
s_irqHandler[irq]->handle_irq();
|
s_irq_handler[irq]->handle_irq();
|
||||||
PIC::eoi(irq);
|
PIC::eoi(irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,14 +43,14 @@ union Descriptor {
|
||||||
TrapGate_32bit = 0xf,
|
TrapGate_32bit = 0xf,
|
||||||
};
|
};
|
||||||
|
|
||||||
void setBase(void* b)
|
void set_base(void* b)
|
||||||
{
|
{
|
||||||
base_lo = (dword)(b) & 0xffff;
|
base_lo = (dword)(b) & 0xffff;
|
||||||
base_hi = ((dword)(b) >> 16) & 0xff;
|
base_hi = ((dword)(b) >> 16) & 0xff;
|
||||||
base_hi2 = ((dword)(b) >> 24) & 0xff;
|
base_hi2 = ((dword)(b) >> 24) & 0xff;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setLimit(dword l)
|
void set_limit(dword l)
|
||||||
{
|
{
|
||||||
limit_lo = (dword)l & 0xffff;
|
limit_lo = (dword)l & 0xffff;
|
||||||
limit_hi = ((dword)l >> 16) & 0xff;
|
limit_hi = ((dword)l >> 16) & 0xff;
|
||||||
|
@ -220,7 +220,7 @@ struct FPUState {
|
||||||
dword st[20];
|
dword st[20];
|
||||||
};
|
};
|
||||||
|
|
||||||
inline constexpr dword pageBaseOf(dword address)
|
inline constexpr dword page_base_of(dword address)
|
||||||
{
|
{
|
||||||
return address & 0xfffff000;
|
return address & 0xfffff000;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,14 +4,14 @@
|
||||||
#include "PIC.h"
|
#include "PIC.h"
|
||||||
#include "Scheduler.h"
|
#include "Scheduler.h"
|
||||||
|
|
||||||
#define IRQ_TIMER 0
|
#define IRQ_TIMER 0
|
||||||
|
|
||||||
extern "C" void tick_ISR();
|
extern "C" void timer_interrupt_entry();
|
||||||
extern "C" void clock_handle(RegisterDump&);
|
extern "C" void timer_interrupt_handler(RegisterDump&);
|
||||||
|
|
||||||
asm(
|
asm(
|
||||||
".globl tick_ISR \n"
|
".globl timer_interrupt_entry \n"
|
||||||
"tick_ISR: \n"
|
"timer_interrupt_entry: \n"
|
||||||
" pusha\n"
|
" pusha\n"
|
||||||
" pushw %ds\n"
|
" pushw %ds\n"
|
||||||
" pushw %es\n"
|
" pushw %es\n"
|
||||||
|
@ -27,7 +27,7 @@ asm(
|
||||||
" popw %fs\n"
|
" popw %fs\n"
|
||||||
" popw %gs\n"
|
" popw %gs\n"
|
||||||
" mov %esp, %eax\n"
|
" mov %esp, %eax\n"
|
||||||
" call clock_handle\n"
|
" call timer_interrupt_handler\n"
|
||||||
" popw %gs\n"
|
" popw %gs\n"
|
||||||
" popw %gs\n"
|
" popw %gs\n"
|
||||||
" popw %fs\n"
|
" popw %fs\n"
|
||||||
|
@ -53,12 +53,11 @@ asm(
|
||||||
#define MODE_RATE 0x04
|
#define MODE_RATE 0x04
|
||||||
#define MODE_SQUARE_WAVE 0x06
|
#define MODE_SQUARE_WAVE 0x06
|
||||||
|
|
||||||
#define WRITE_word 0x30
|
#define WRITE_WORD 0x30
|
||||||
|
|
||||||
/* Miscellaneous */
|
|
||||||
#define BASE_FREQUENCY 1193182
|
#define BASE_FREQUENCY 1193182
|
||||||
|
|
||||||
void clock_handle(RegisterDump& regs)
|
void timer_interrupt_handler(RegisterDump& regs)
|
||||||
{
|
{
|
||||||
IRQHandlerScope scope(IRQ_TIMER);
|
IRQHandlerScope scope(IRQ_TIMER);
|
||||||
Scheduler::timer_tick(regs);
|
Scheduler::timer_tick(regs);
|
||||||
|
@ -70,7 +69,7 @@ void initialize()
|
||||||
{
|
{
|
||||||
word timer_reload;
|
word timer_reload;
|
||||||
|
|
||||||
IO::out8(PIT_CTL, TIMER0_SELECT | WRITE_word | MODE_SQUARE_WAVE);
|
IO::out8(PIT_CTL, TIMER0_SELECT | WRITE_WORD | MODE_SQUARE_WAVE);
|
||||||
|
|
||||||
timer_reload = (BASE_FREQUENCY / TICKS_PER_SECOND);
|
timer_reload = (BASE_FREQUENCY / TICKS_PER_SECOND);
|
||||||
|
|
||||||
|
@ -79,7 +78,7 @@ void initialize()
|
||||||
IO::out8(TIMER0_CTL, LSB(timer_reload));
|
IO::out8(TIMER0_CTL, LSB(timer_reload));
|
||||||
IO::out8(TIMER0_CTL, MSB(timer_reload));
|
IO::out8(TIMER0_CTL, MSB(timer_reload));
|
||||||
|
|
||||||
register_interrupt_handler(IRQ_VECTOR_BASE + IRQ_TIMER, tick_ISR);
|
register_interrupt_handler(IRQ_VECTOR_BASE + IRQ_TIMER, timer_interrupt_entry);
|
||||||
|
|
||||||
PIC::enable(IRQ_TIMER);
|
PIC::enable(IRQ_TIMER);
|
||||||
}
|
}
|
||||||
|
|
|
@ -88,10 +88,10 @@ static void init_stage2()
|
||||||
vfs->register_character_device(*tty3);
|
vfs->register_character_device(*tty3);
|
||||||
|
|
||||||
auto dev_hd0 = IDEDiskDevice::create();
|
auto dev_hd0 = IDEDiskDevice::create();
|
||||||
auto e2fs = Ext2FS::create(dev_hd0.copyRef());
|
auto e2fs = Ext2FS::create(dev_hd0.copy_ref());
|
||||||
e2fs->initialize();
|
e2fs->initialize();
|
||||||
|
|
||||||
vfs->mount_root(e2fs.copyRef());
|
vfs->mount_root(e2fs.copy_ref());
|
||||||
|
|
||||||
load_ksyms();
|
load_ksyms();
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ int kprintf(const char* fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
int ret = printfInternal(console_putch, nullptr, fmt, ap);
|
int ret = printf_internal(console_putch, nullptr, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@ int ksprintf(char* buffer, const char* fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
int ret = printfInternal(buffer_putch, buffer, fmt, ap);
|
int ret = printf_internal(buffer_putch, buffer, fmt, ap);
|
||||||
buffer[ret] = '\0';
|
buffer[ret] = '\0';
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -44,7 +44,7 @@ extern "C" int dbgprintf(const char* fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
int ret = printfInternal(debugger_putch, nullptr, fmt, ap);
|
int ret = printf_internal(debugger_putch, nullptr, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -98,7 +98,7 @@ next_entry:
|
||||||
auto& e_gid_string = parts[2];
|
auto& e_gid_string = parts[2];
|
||||||
auto& e_members_string = parts[3];
|
auto& e_members_string = parts[3];
|
||||||
bool ok;
|
bool ok;
|
||||||
gid_t e_gid = e_gid_string.toUInt(ok);
|
gid_t e_gid = e_gid_string.to_uint(ok);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
fprintf(stderr, "getgrent(): Malformed GID on line %u\n", __grdb_line_number);
|
fprintf(stderr, "getgrent(): Malformed GID on line %u\n", __grdb_line_number);
|
||||||
goto next_entry;
|
goto next_entry;
|
||||||
|
|
|
@ -102,12 +102,12 @@ next_entry:
|
||||||
auto& e_dir = parts[5];
|
auto& e_dir = parts[5];
|
||||||
auto& e_shell = parts[6];
|
auto& e_shell = parts[6];
|
||||||
bool ok;
|
bool ok;
|
||||||
uid_t e_uid = e_uid_string.toUInt(ok);
|
uid_t e_uid = e_uid_string.to_uint(ok);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
fprintf(stderr, "getpwent(): Malformed UID on line %u\n", __pwdb_line_number);
|
fprintf(stderr, "getpwent(): Malformed UID on line %u\n", __pwdb_line_number);
|
||||||
goto next_entry;
|
goto next_entry;
|
||||||
}
|
}
|
||||||
gid_t e_gid = e_gid_string.toUInt(ok);
|
gid_t e_gid = e_gid_string.to_uint(ok);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
fprintf(stderr, "getpwent(): Malformed GID on line %u\n", __pwdb_line_number);
|
fprintf(stderr, "getpwent(): Malformed GID on line %u\n", __pwdb_line_number);
|
||||||
goto next_entry;
|
goto next_entry;
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
|
|
||||||
#define MAXLN 512
|
#define MAXLN 512
|
||||||
|
|
||||||
static const char* determineBase(const char* p, int& base)
|
static const char* determine_base(const char* p, int& base)
|
||||||
{
|
{
|
||||||
if (p[0] == '0') {
|
if (p[0] == '0') {
|
||||||
switch (p[1]) {
|
switch (p[1]) {
|
||||||
|
@ -111,7 +111,7 @@ int atob(unsigned int* vp, const char* p, int base)
|
||||||
unsigned long v;
|
unsigned long v;
|
||||||
|
|
||||||
if (base == 0)
|
if (base == 0)
|
||||||
p = determineBase(p, base);
|
p = determine_base(p, base);
|
||||||
if (_atob(&v, p, base)) {
|
if (_atob(&v, p, base)) {
|
||||||
*vp = v;
|
*vp = v;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -237,7 +237,7 @@ int dbgprintf(const char* fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
int ret = printfInternal(sys_putch, nullptr, fmt, ap);
|
int ret = printf_internal(sys_putch, nullptr, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -256,7 +256,7 @@ static void stream_putch(char*&, char ch)
|
||||||
int vfprintf(FILE* stream, const char* fmt, va_list ap)
|
int vfprintf(FILE* stream, const char* fmt, va_list ap)
|
||||||
{
|
{
|
||||||
__current_stream = stream;
|
__current_stream = stream;
|
||||||
return printfInternal(stream_putch, nullptr, fmt, ap);
|
return printf_internal(stream_putch, nullptr, fmt, ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
int fprintf(FILE* stream, const char* fmt, ...)
|
int fprintf(FILE* stream, const char* fmt, ...)
|
||||||
|
@ -272,7 +272,7 @@ int printf(const char* fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
int ret = printfInternal(stdout_putch, nullptr, fmt, ap);
|
int ret = printf_internal(stdout_putch, nullptr, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -284,7 +284,7 @@ static void buffer_putch(char*& bufptr, char ch)
|
||||||
|
|
||||||
int vsprintf(char* buffer, const char* fmt, va_list ap)
|
int vsprintf(char* buffer, const char* fmt, va_list ap)
|
||||||
{
|
{
|
||||||
int ret = printfInternal(buffer_putch, buffer, fmt, ap);
|
int ret = printf_internal(buffer_putch, buffer, fmt, ap);
|
||||||
buffer[ret] = '\0';
|
buffer[ret] = '\0';
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -311,7 +311,7 @@ static void sized_buffer_putch(char*& bufptr, char ch)
|
||||||
int vsnprintf(char* buffer, size_t size, const char* fmt, va_list ap)
|
int vsnprintf(char* buffer, size_t size, const char* fmt, va_list ap)
|
||||||
{
|
{
|
||||||
__vsnprintf_space_remaining = size;
|
__vsnprintf_space_remaining = size;
|
||||||
int ret = printfInternal(sized_buffer_putch, buffer, fmt, ap);
|
int ret = printf_internal(sized_buffer_putch, buffer, fmt, ap);
|
||||||
buffer[ret] = '\0';
|
buffer[ret] = '\0';
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -190,21 +190,21 @@ char* strrchr(const char* str, int ch)
|
||||||
|
|
||||||
char* strcat(char *dest, const char *src)
|
char* strcat(char *dest, const char *src)
|
||||||
{
|
{
|
||||||
size_t destLength = strlen(dest);
|
size_t dest_length = strlen(dest);
|
||||||
size_t i;
|
size_t i;
|
||||||
for (i = 0 ; src[i] != '\0' ; i++)
|
for (i = 0 ; src[i] != '\0' ; i++)
|
||||||
dest[destLength + i] = src[i];
|
dest[dest_length + i] = src[i];
|
||||||
dest[destLength + i] = '\0';
|
dest[dest_length + i] = '\0';
|
||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* strncat(char *dest, const char *src, size_t n)
|
char* strncat(char *dest, const char *src, size_t n)
|
||||||
{
|
{
|
||||||
size_t destLength = strlen(dest);
|
size_t dest_length = strlen(dest);
|
||||||
size_t i;
|
size_t i;
|
||||||
for (i = 0 ; i < n && src[i] != '\0' ; i++)
|
for (i = 0 ; i < n && src[i] != '\0' ; i++)
|
||||||
dest[destLength + i] = src[i];
|
dest[dest_length + i] = src[i];
|
||||||
dest[destLength + i] = '\0';
|
dest[dest_length + i] = '\0';
|
||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
#include "ClockWidget.h"
|
|
||||||
#include <SharedGraphics/Painter.h>
|
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
ClockWidget::ClockWidget(GWidget* parent)
|
|
||||||
: GWidget(parent)
|
|
||||||
{
|
|
||||||
setWindowRelativeRect({ 0, 0, 100, 40 });
|
|
||||||
startTimer(250);
|
|
||||||
}
|
|
||||||
|
|
||||||
ClockWidget::~ClockWidget()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void ClockWidget::paintEvent(PaintEvent&)
|
|
||||||
{
|
|
||||||
auto now = time(nullptr);
|
|
||||||
auto& tm = *localtime(&now);
|
|
||||||
|
|
||||||
char timeBuf[128];
|
|
||||||
sprintf(timeBuf, "%02u:%02u:%02u ", tm.tm_hour, tm.tm_min, tm.tm_sec);
|
|
||||||
|
|
||||||
Painter painter(*this);
|
|
||||||
painter.fill_rect(rect(), Color::MidGray);
|
|
||||||
painter.draw_text(rect(), timeBuf, Painter::TextAlignment::Center, Color::Black);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ClockWidget::timerEvent(TimerEvent&)
|
|
||||||
{
|
|
||||||
auto now = time(nullptr);
|
|
||||||
if (now == m_lastSeenTimestamp)
|
|
||||||
return;
|
|
||||||
m_lastSeenTimestamp = now;
|
|
||||||
update();
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Widget.h"
|
|
||||||
|
|
||||||
class ClockWidget final : public Widget {
|
|
||||||
public:
|
|
||||||
explicit ClockWidget(Widget* parent = nullptr);
|
|
||||||
virtual ~ClockWidget() override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
virtual void paintEvent(PaintEvent&) override;
|
|
||||||
virtual void timerEvent(TimerEvent&) override;
|
|
||||||
|
|
||||||
dword m_lastSeenTimestamp { 0 };
|
|
||||||
};
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ GCheckBox::GCheckBox(GWidget* parent)
|
||||||
: GWidget(parent)
|
: GWidget(parent)
|
||||||
{
|
{
|
||||||
if (!s_checked_bitmap)
|
if (!s_checked_bitmap)
|
||||||
s_checked_bitmap = CharacterBitmap::create_from_ascii(s_checked_bitmap_data, s_checked_bitmap_width, s_checked_bitmap_height).leakRef();
|
s_checked_bitmap = CharacterBitmap::create_from_ascii(s_checked_bitmap_data, s_checked_bitmap_width, s_checked_bitmap_height).leak_ref();
|
||||||
}
|
}
|
||||||
|
|
||||||
GCheckBox::~GCheckBox()
|
GCheckBox::~GCheckBox()
|
||||||
|
|
|
@ -7,15 +7,15 @@ GObject::GObject(GObject* parent)
|
||||||
: m_parent(parent)
|
: m_parent(parent)
|
||||||
{
|
{
|
||||||
if (m_parent)
|
if (m_parent)
|
||||||
m_parent->addChild(*this);
|
m_parent->add_child(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
GObject::~GObject()
|
GObject::~GObject()
|
||||||
{
|
{
|
||||||
if (m_parent)
|
if (m_parent)
|
||||||
m_parent->removeChild(*this);
|
m_parent->remove_child(*this);
|
||||||
auto childrenToDelete = move(m_children);
|
auto children_to_delete = move(m_children);
|
||||||
for (auto* child : childrenToDelete)
|
for (auto* child : children_to_delete)
|
||||||
delete child;
|
delete child;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,12 +35,12 @@ void GObject::event(GEvent& event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GObject::addChild(GObject& object)
|
void GObject::add_child(GObject& object)
|
||||||
{
|
{
|
||||||
m_children.append(&object);
|
m_children.append(&object);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GObject::removeChild(GObject& object)
|
void GObject::remove_child(GObject& object)
|
||||||
{
|
{
|
||||||
for (unsigned i = 0; i < m_children.size(); ++i) {
|
for (unsigned i = 0; i < m_children.size(); ++i) {
|
||||||
if (m_children[i] == &object) {
|
if (m_children[i] == &object) {
|
||||||
|
@ -54,19 +54,19 @@ void GObject::timer_event(GTimerEvent&)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void GObject::startTimer(int ms)
|
void GObject::start_timer(int ms)
|
||||||
{
|
{
|
||||||
if (m_timerID) {
|
if (m_timer_id) {
|
||||||
dbgprintf("GObject{%p} already has a timer!\n", this);
|
dbgprintf("GObject{%p} already has a timer!\n", this);
|
||||||
ASSERT_NOT_REACHED();
|
ASSERT_NOT_REACHED();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GObject::stopTimer()
|
void GObject::stop_timer()
|
||||||
{
|
{
|
||||||
if (!m_timerID)
|
if (!m_timer_id)
|
||||||
return;
|
return;
|
||||||
m_timerID = 0;
|
m_timer_id = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GObject::delete_later()
|
void GObject::delete_later()
|
||||||
|
|
|
@ -20,12 +20,12 @@ public:
|
||||||
GObject* parent() { return m_parent; }
|
GObject* parent() { return m_parent; }
|
||||||
const GObject* parent() const { return m_parent; }
|
const GObject* parent() const { return m_parent; }
|
||||||
|
|
||||||
void startTimer(int ms);
|
void start_timer(int ms);
|
||||||
void stopTimer();
|
void stop_timer();
|
||||||
bool hasTimer() const { return m_timerID; }
|
bool has_timer() const { return m_timer_id; }
|
||||||
|
|
||||||
void addChild(GObject&);
|
void add_child(GObject&);
|
||||||
void removeChild(GObject&);
|
void remove_child(GObject&);
|
||||||
|
|
||||||
void delete_later();
|
void delete_later();
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ private:
|
||||||
|
|
||||||
GObject* m_parent { nullptr };
|
GObject* m_parent { nullptr };
|
||||||
|
|
||||||
int m_timerID { 0 };
|
int m_timer_id { 0 };
|
||||||
|
|
||||||
Vector<GObject*> m_children;
|
Vector<GObject*> m_children;
|
||||||
};
|
};
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
GTextBox::GTextBox(GWidget* parent)
|
GTextBox::GTextBox(GWidget* parent)
|
||||||
: GWidget(parent)
|
: GWidget(parent)
|
||||||
{
|
{
|
||||||
startTimer(500);
|
start_timer(500);
|
||||||
}
|
}
|
||||||
|
|
||||||
GTextBox::~GTextBox()
|
GTextBox::~GTextBox()
|
||||||
|
@ -73,12 +73,12 @@ void GTextBox::handle_backspace()
|
||||||
}
|
}
|
||||||
|
|
||||||
char* buffer;
|
char* buffer;
|
||||||
auto newText = StringImpl::create_uninitialized(m_text.length() - 1, buffer);
|
auto new_text = StringImpl::create_uninitialized(m_text.length() - 1, buffer);
|
||||||
|
|
||||||
memcpy(buffer, m_text.characters(), m_cursor_position - 1);
|
memcpy(buffer, m_text.characters(), m_cursor_position - 1);
|
||||||
memcpy(buffer + m_cursor_position - 1, m_text.characters() + m_cursor_position, m_text.length() - (m_cursor_position - 1));
|
memcpy(buffer + m_cursor_position - 1, m_text.characters() + m_cursor_position, m_text.length() - (m_cursor_position - 1));
|
||||||
|
|
||||||
m_text = move(newText);
|
m_text = move(new_text);
|
||||||
--m_cursor_position;
|
--m_cursor_position;
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
@ -110,13 +110,13 @@ void GTextBox::keydown_event(GKeyEvent& event)
|
||||||
ASSERT(event.text().length() == 1);
|
ASSERT(event.text().length() == 1);
|
||||||
|
|
||||||
char* buffer;
|
char* buffer;
|
||||||
auto newText = StringImpl::create_uninitialized(m_text.length() + 1, buffer);
|
auto new_text = StringImpl::create_uninitialized(m_text.length() + 1, buffer);
|
||||||
|
|
||||||
memcpy(buffer, m_text.characters(), m_cursor_position);
|
memcpy(buffer, m_text.characters(), m_cursor_position);
|
||||||
buffer[m_cursor_position] = event.text()[0];
|
buffer[m_cursor_position] = event.text()[0];
|
||||||
memcpy(buffer + m_cursor_position + 1, m_text.characters() + m_cursor_position, m_text.length() - m_cursor_position);
|
memcpy(buffer + m_cursor_position + 1, m_text.characters() + m_cursor_position, m_text.length() - m_cursor_position);
|
||||||
|
|
||||||
m_text = move(newText);
|
m_text = move(new_text);
|
||||||
++m_cursor_position;
|
++m_cursor_position;
|
||||||
update();
|
update();
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -207,6 +207,6 @@ void GWindow::set_global_cursor_tracking_widget(GWidget* widget)
|
||||||
ASSERT(m_window_id);
|
ASSERT(m_window_id);
|
||||||
if (widget == m_global_cursor_tracking_widget.ptr())
|
if (widget == m_global_cursor_tracking_widget.ptr())
|
||||||
return;
|
return;
|
||||||
m_global_cursor_tracking_widget = widget ? widget->makeWeakPtr() : nullptr;
|
m_global_cursor_tracking_widget = widget ? widget->make_weak_ptr() : nullptr;
|
||||||
gui_set_global_cursor_tracking_enabled(m_window_id, widget != nullptr);
|
gui_set_global_cursor_tracking_enabled(m_window_id, widget != nullptr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ void Font::initialize()
|
||||||
Font& Font::default_font()
|
Font& Font::default_font()
|
||||||
{
|
{
|
||||||
if (!s_default_font)
|
if (!s_default_font)
|
||||||
s_default_font = adopt(*new Font(DEFAULT_FONT_NAME::glyphs, DEFAULT_FONT_NAME::glyph_width, DEFAULT_FONT_NAME::glyph_height, DEFAULT_FONT_NAME::first_glyph, DEFAULT_FONT_NAME::last_glyph)).leakRef();
|
s_default_font = adopt(*new Font(DEFAULT_FONT_NAME::glyphs, DEFAULT_FONT_NAME::glyph_width, DEFAULT_FONT_NAME::glyph_height, DEFAULT_FONT_NAME::first_glyph, DEFAULT_FONT_NAME::last_glyph)).leak_ref();
|
||||||
return *s_default_font;
|
return *s_default_font;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ Font::Font(const char* const* glyphs, byte glyph_width, byte glyph_height, byte
|
||||||
m_error_bitmap = CharacterBitmap::create_from_ascii(DEFAULT_FONT_NAME::error_glyph, m_glyph_width, m_glyph_height);
|
m_error_bitmap = CharacterBitmap::create_from_ascii(DEFAULT_FONT_NAME::error_glyph, m_glyph_width, m_glyph_height);
|
||||||
for (unsigned ch = 0; ch < 256; ++ch) {
|
for (unsigned ch = 0; ch < 256; ++ch) {
|
||||||
if (ch < m_first_glyph || ch > m_last_glyph) {
|
if (ch < m_first_glyph || ch > m_last_glyph) {
|
||||||
m_bitmaps[ch] = m_error_bitmap.copyRef();
|
m_bitmaps[ch] = m_error_bitmap.copy_ref();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const char* data = m_glyphs[(unsigned)ch - m_first_glyph];
|
const char* data = m_glyphs[(unsigned)ch - m_first_glyph];
|
||||||
|
|
|
@ -16,12 +16,12 @@ RetainPtr<GraphicsBitmap> GraphicsBitmap::create(Process& process, const Size& s
|
||||||
GraphicsBitmap::GraphicsBitmap(Process& process, const Size& size)
|
GraphicsBitmap::GraphicsBitmap(Process& process, const Size& size)
|
||||||
: m_size(size)
|
: m_size(size)
|
||||||
, m_pitch(size.width() * sizeof(RGBA32))
|
, m_pitch(size.width() * sizeof(RGBA32))
|
||||||
, m_client_process(process.makeWeakPtr())
|
, m_client_process(process.make_weak_ptr())
|
||||||
{
|
{
|
||||||
InterruptDisabler disabler;
|
InterruptDisabler disabler;
|
||||||
size_t size_in_bytes = size.width() * size.height() * sizeof(RGBA32);
|
size_t size_in_bytes = size.width() * size.height() * sizeof(RGBA32);
|
||||||
auto vmo = VMObject::create_anonymous(size_in_bytes);
|
auto vmo = VMObject::create_anonymous(size_in_bytes);
|
||||||
m_client_region = process.allocate_region_with_vmo(LinearAddress(), size_in_bytes, vmo.copyRef(), 0, "GraphicsBitmap (client)", true, true);
|
m_client_region = process.allocate_region_with_vmo(LinearAddress(), size_in_bytes, vmo.copy_ref(), 0, "GraphicsBitmap (client)", true, true);
|
||||||
m_client_region->set_shared(true);
|
m_client_region->set_shared(true);
|
||||||
m_client_region->commit();
|
m_client_region->commit();
|
||||||
auto& server = WSMessageLoop::the().server_process();
|
auto& server = WSMessageLoop::the().server_process();
|
||||||
|
|
|
@ -199,9 +199,9 @@ void Painter::draw_text(const Rect& rect, const String& text, TextAlignment alig
|
||||||
int text_width = text.length() * font().glyph_width();
|
int text_width = text.length() * font().glyph_width();
|
||||||
point = { rect.right() - text_width, rect.center().y() - (font().glyph_height() / 2) };
|
point = { rect.right() - text_width, rect.center().y() - (font().glyph_height() / 2) };
|
||||||
} else if (alignment == TextAlignment::Center) {
|
} else if (alignment == TextAlignment::Center) {
|
||||||
int textWidth = text.length() * font().glyph_width();
|
int text_width = text.length() * font().glyph_width();
|
||||||
point = rect.center();
|
point = rect.center();
|
||||||
point.move_by(-(textWidth / 2), -(font().glyph_height() / 2));
|
point.move_by(-(text_width / 2), -(font().glyph_height() / 2));
|
||||||
} else {
|
} else {
|
||||||
ASSERT_NOT_REACHED();
|
ASSERT_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
@ -283,14 +283,14 @@ void Painter::draw_line(const Point& p1, const Point& p2, Color color)
|
||||||
const double dy = point2.y() - point1.y();
|
const double dy = point2.y() - point1.y();
|
||||||
const double delta_error = fabs(dy / dx);
|
const double delta_error = fabs(dy / dx);
|
||||||
double error = 0;
|
double error = 0;
|
||||||
const double yStep = dy == 0 ? 0 : (dy > 0 ? 1 : -1);
|
const double y_step = dy == 0 ? 0 : (dy > 0 ? 1 : -1);
|
||||||
|
|
||||||
int y = point1.y();
|
int y = point1.y();
|
||||||
for (int x = point1.x(); x <= point2.x(); ++x) {
|
for (int x = point1.x(); x <= point2.x(); ++x) {
|
||||||
m_target->scanline(y)[x] = color.value();
|
m_target->scanline(y)[x] = color.value();
|
||||||
error += delta_error;
|
error += delta_error;
|
||||||
if (error >= 0.5) {
|
if (error >= 0.5) {
|
||||||
y = (double)y + yStep;
|
y = (double)y + y_step;
|
||||||
error -= 1.0;
|
error -= 1.0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -110,7 +110,7 @@ inline bool is_valid_final_character(byte ch)
|
||||||
return ch >= 0x40 && ch <= 0x7e;
|
return ch >= 0x40 && ch <= 0x7e;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned parseUInt(const String& str, bool& ok)
|
unsigned parse_uint(const String& str, bool& ok)
|
||||||
{
|
{
|
||||||
unsigned value = 0;
|
unsigned value = 0;
|
||||||
for (size_t i = 0; i < str.length(); ++i) {
|
for (size_t i = 0; i < str.length(); ++i) {
|
||||||
|
@ -341,7 +341,7 @@ void Terminal::execute_xterm_command()
|
||||||
{
|
{
|
||||||
m_final = '@';
|
m_final = '@';
|
||||||
bool ok;
|
bool ok;
|
||||||
unsigned value = parseUInt(String((const char*)m_xterm_param1.data(), m_xterm_param1.size()), ok);
|
unsigned value = parse_uint(String((const char*)m_xterm_param1.data(), m_xterm_param1.size()), ok);
|
||||||
if (ok) {
|
if (ok) {
|
||||||
switch (value) {
|
switch (value) {
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -363,7 +363,7 @@ void Terminal::execute_escape_sequence(byte final)
|
||||||
Vector<unsigned> params;
|
Vector<unsigned> params;
|
||||||
for (auto& parampart : paramparts) {
|
for (auto& parampart : paramparts) {
|
||||||
bool ok;
|
bool ok;
|
||||||
unsigned value = parseUInt(parampart, ok);
|
unsigned value = parse_uint(parampart, ok);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
// FIXME: Should we do something else?
|
// FIXME: Should we do something else?
|
||||||
return;
|
return;
|
||||||
|
@ -562,7 +562,7 @@ void Terminal::unimplemented_escape()
|
||||||
builder.append((char)m_intermediates[i]);
|
builder.append((char)m_intermediates[i]);
|
||||||
}
|
}
|
||||||
builder.append("))");
|
builder.append("))");
|
||||||
inject_string(builder.build());
|
inject_string(builder.to_string());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Terminal::unimplemented_xterm_escape()
|
void Terminal::unimplemented_xterm_escape()
|
||||||
|
|
|
@ -34,7 +34,7 @@ ClockWidget::ClockWidget(GWidget* parent)
|
||||||
: GWidget(parent)
|
: GWidget(parent)
|
||||||
{
|
{
|
||||||
set_relative_rect({ 0, 0, 100, 40 });
|
set_relative_rect({ 0, 0, 100, 40 });
|
||||||
startTimer(250);
|
start_timer(250);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClockWidget::paint_event(GPaintEvent&)
|
void ClockWidget::paint_event(GPaintEvent&)
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <AK/AKString.h>
|
#include <AK/AKString.h>
|
||||||
|
|
||||||
static unsigned parseUInt(const String& str, bool& ok)
|
static unsigned parse_uint(const String& str, bool& ok)
|
||||||
{
|
{
|
||||||
if (str.is_empty()) {
|
if (str.is_empty()) {
|
||||||
ok = false;
|
ok = false;
|
||||||
|
@ -40,13 +40,13 @@ int main(int argc, char** argv)
|
||||||
pid_argi = 2;
|
pid_argi = 2;
|
||||||
if (argv[1][0] != '-')
|
if (argv[1][0] != '-')
|
||||||
print_usage_and_exit();
|
print_usage_and_exit();
|
||||||
signum = parseUInt(&argv[1][1], ok);
|
signum = parse_uint(&argv[1][1], ok);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
printf("'%s' is not a valid signal number\n", &argv[1][1]);
|
printf("'%s' is not a valid signal number\n", &argv[1][1]);
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
unsigned pid = parseUInt(argv[pid_argi], ok);
|
unsigned pid = parse_uint(argv[pid_argi], ok);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
printf("'%s' is not a valid PID\n", argv[pid_argi]);
|
printf("'%s' is not a valid PID\n", argv[pid_argi]);
|
||||||
return 3;
|
return 3;
|
||||||
|
|
|
@ -184,12 +184,12 @@ static int sh_cd(int argc, char** argv)
|
||||||
else
|
else
|
||||||
sprintf(pathbuf, "%s/%s", g->cwd.characters(), argv[1]);
|
sprintf(pathbuf, "%s/%s", g->cwd.characters(), argv[1]);
|
||||||
|
|
||||||
FileSystemPath canonicalPath(pathbuf);
|
FileSystemPath canonical_path(pathbuf);
|
||||||
if (!canonicalPath.is_valid()) {
|
if (!canonical_path.is_valid()) {
|
||||||
printf("FileSystemPath failed to canonicalize '%s'\n", pathbuf);
|
printf("FileSystemPath failed to canonicalize '%s'\n", pathbuf);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
const char* path = canonicalPath.string().characters();
|
const char* path = canonical_path.string().characters();
|
||||||
|
|
||||||
struct stat st;
|
struct stat st;
|
||||||
int rc = stat(path, &st);
|
int rc = stat(path, &st);
|
||||||
|
@ -206,7 +206,7 @@ static int sh_cd(int argc, char** argv)
|
||||||
printf("chdir(%s) failed: %s\n", path, strerror(errno));
|
printf("chdir(%s) failed: %s\n", path, strerror(errno));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
g->cwd = canonicalPath.string();
|
g->cwd = canonical_path.string();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <AK/AKString.h>
|
#include <AK/AKString.h>
|
||||||
|
|
||||||
static unsigned parseUInt(const String& str, bool& ok)
|
static unsigned parse_uint(const String& str, bool& ok)
|
||||||
{
|
{
|
||||||
unsigned value = 0;
|
unsigned value = 0;
|
||||||
for (size_t i = 0; i < str.length(); ++i) {
|
for (size_t i = 0; i < str.length(); ++i) {
|
||||||
|
@ -29,7 +29,7 @@ int main(int argc, char** argv)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
bool ok;
|
bool ok;
|
||||||
unsigned secs = parseUInt(argv[1], ok);
|
unsigned secs = parse_uint(argv[1], ok);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
fprintf(stderr, "Not a valid number of seconds: \"%s\"\n", argv[1]);
|
fprintf(stderr, "Not a valid number of seconds: \"%s\"\n", argv[1]);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -84,7 +84,7 @@ static String read_var(const String& name)
|
||||||
StringBuilder builder;
|
StringBuilder builder;
|
||||||
builder.append("/proc/sys/");
|
builder.append("/proc/sys/");
|
||||||
builder.append(name);
|
builder.append(name);
|
||||||
auto path = builder.build();
|
auto path = builder.to_string();
|
||||||
int fd = open(path.characters(), O_RDONLY);
|
int fd = open(path.characters(), O_RDONLY);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
perror("open");
|
perror("open");
|
||||||
|
@ -105,7 +105,7 @@ static void write_var(const String& name, const String& value)
|
||||||
StringBuilder builder;
|
StringBuilder builder;
|
||||||
builder.append("/proc/sys/");
|
builder.append("/proc/sys/");
|
||||||
builder.append(name);
|
builder.append(name);
|
||||||
auto path = builder.build();
|
auto path = builder.to_string();
|
||||||
int fd = open(path.characters(), O_WRONLY);
|
int fd = open(path.characters(), O_WRONLY);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
perror("open");
|
perror("open");
|
||||||
|
|
|
@ -11,36 +11,36 @@
|
||||||
|
|
||||||
//#define DEBUG_COUNTERS
|
//#define DEBUG_COUNTERS
|
||||||
|
|
||||||
static const int windowTitleBarHeight = 16;
|
static const int window_titlebar_height = 16;
|
||||||
|
|
||||||
static inline Rect title_bar_rect(const Rect& window)
|
static inline Rect title_bar_rect(const Rect& window)
|
||||||
{
|
{
|
||||||
return {
|
return {
|
||||||
window.x() - 1,
|
window.x() - 1,
|
||||||
window.y() - windowTitleBarHeight,
|
window.y() - window_titlebar_height,
|
||||||
window.width() + 2,
|
window.width() + 2,
|
||||||
windowTitleBarHeight
|
window_titlebar_height
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline Rect title_bar_text_rect(const Rect& window)
|
static inline Rect title_bar_text_rect(const Rect& window)
|
||||||
{
|
{
|
||||||
auto titleBarRect = title_bar_rect(window);
|
auto titlebar_rect = title_bar_rect(window);
|
||||||
return {
|
return {
|
||||||
titleBarRect.x() + 2,
|
titlebar_rect.x() + 2,
|
||||||
titleBarRect.y(),
|
titlebar_rect.y(),
|
||||||
titleBarRect.width() - 4,
|
titlebar_rect.width() - 4,
|
||||||
titleBarRect.height()
|
titlebar_rect.height()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline Rect border_window_rect(const Rect& window)
|
static inline Rect border_window_rect(const Rect& window)
|
||||||
{
|
{
|
||||||
auto titleBarRect = title_bar_rect(window);
|
auto titlebar_rect = title_bar_rect(window);
|
||||||
return { titleBarRect.x() - 1,
|
return { titlebar_rect.x() - 1,
|
||||||
titleBarRect.y() - 1,
|
titlebar_rect.y() - 1,
|
||||||
titleBarRect.width() + 2,
|
titlebar_rect.width() + 2,
|
||||||
windowTitleBarHeight + window.height() + 3
|
window_titlebar_height + window.height() + 3
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,12 +148,12 @@ WSWindowManager::~WSWindowManager()
|
||||||
void WSWindowManager::paint_window_frame(WSWindow& window)
|
void WSWindowManager::paint_window_frame(WSWindow& window)
|
||||||
{
|
{
|
||||||
LOCKER(m_lock);
|
LOCKER(m_lock);
|
||||||
//printf("[WM] paintWindowFrame {%p}, rect: %d,%d %dx%d\n", &window, window.rect().x(), window.rect().y(), window.rect().width(), window.rect().height());
|
//printf("[WM] paint_window_frame {%p}, rect: %d,%d %dx%d\n", &window, window.rect().x(), window.rect().y(), window.rect().width(), window.rect().height());
|
||||||
|
|
||||||
auto titleBarRect = title_bar_rect(window.rect());
|
auto titlebar_rect = title_bar_rect(window.rect());
|
||||||
auto titleBarTitleRect = title_bar_text_rect(window.rect());
|
auto titlebar_title_rect = title_bar_text_rect(window.rect());
|
||||||
auto outerRect = outer_window_rect(window.rect());
|
auto outer_rect = outer_window_rect(window.rect());
|
||||||
auto borderRect = border_window_rect(window.rect());
|
auto border_rect = border_window_rect(window.rect());
|
||||||
|
|
||||||
Rect inner_border_rect {
|
Rect inner_border_rect {
|
||||||
window.x() - 1,
|
window.x() - 1,
|
||||||
|
@ -184,15 +184,15 @@ void WSWindowManager::paint_window_frame(WSWindow& window)
|
||||||
middle_border_color = Color::MidGray;
|
middle_border_color = Color::MidGray;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_back_painter->fill_rect_with_gradient(titleBarRect, border_color, border_color2);
|
m_back_painter->fill_rect_with_gradient(titlebar_rect, border_color, border_color2);
|
||||||
m_back_painter->draw_rect(borderRect, middle_border_color);
|
m_back_painter->draw_rect(border_rect, middle_border_color);
|
||||||
m_back_painter->draw_rect(outerRect, border_color);
|
m_back_painter->draw_rect(outer_rect, border_color);
|
||||||
m_back_painter->draw_rect(inner_border_rect, border_color);
|
m_back_painter->draw_rect(inner_border_rect, border_color);
|
||||||
m_back_painter->draw_text(titleBarTitleRect, window.title(), Painter::TextAlignment::CenterLeft, title_color);
|
m_back_painter->draw_text(titlebar_title_rect, window.title(), Painter::TextAlignment::CenterLeft, title_color);
|
||||||
|
|
||||||
Color metadata_color(96, 96, 96);
|
Color metadata_color(96, 96, 96);
|
||||||
m_back_painter->draw_text(
|
m_back_painter->draw_text(
|
||||||
titleBarTitleRect,
|
titlebar_title_rect,
|
||||||
String::format("%d:%d", window.pid(), window.window_id()),
|
String::format("%d:%d", window.pid(), window.window_id()),
|
||||||
Painter::TextAlignment::CenterRight,
|
Painter::TextAlignment::CenterRight,
|
||||||
metadata_color
|
metadata_color
|
||||||
|
@ -250,7 +250,7 @@ void WSWindowManager::handle_titlebar_mouse_event(WSWindow& window, WSMouseEvent
|
||||||
#ifdef DRAG_DEBUG
|
#ifdef DRAG_DEBUG
|
||||||
printf("[WM] Begin dragging WSWindow{%p}\n", &window);
|
printf("[WM] Begin dragging WSWindow{%p}\n", &window);
|
||||||
#endif
|
#endif
|
||||||
m_drag_window = window.makeWeakPtr();;
|
m_drag_window = window.make_weak_ptr();;
|
||||||
m_drag_origin = event.position();
|
m_drag_origin = event.position();
|
||||||
m_drag_window_origin = window.position();
|
m_drag_window_origin = window.position();
|
||||||
m_drag_start_rect = outer_window_rect(window.rect());
|
m_drag_start_rect = outer_window_rect(window.rect());
|
||||||
|
@ -265,7 +265,7 @@ void WSWindowManager::process_mouse_event(WSMouseEvent& event)
|
||||||
if (event.type() == WSMessage::MouseUp && event.button() == MouseButton::Left) {
|
if (event.type() == WSMessage::MouseUp && event.button() == MouseButton::Left) {
|
||||||
if (m_drag_window) {
|
if (m_drag_window) {
|
||||||
#ifdef DRAG_DEBUG
|
#ifdef DRAG_DEBUG
|
||||||
printf("[WM] Finish dragging WSWindow{%p}\n", m_dragWindow.ptr());
|
printf("[WM] Finish dragging WSWindow{%p}\n", m_drag_window.ptr());
|
||||||
#endif
|
#endif
|
||||||
invalidate(*m_drag_window);
|
invalidate(*m_drag_window);
|
||||||
m_drag_window->set_is_being_dragged(false);
|
m_drag_window->set_is_being_dragged(false);
|
||||||
|
@ -280,7 +280,7 @@ void WSWindowManager::process_mouse_event(WSMouseEvent& event)
|
||||||
auto old_window_rect = m_drag_window->rect();
|
auto old_window_rect = m_drag_window->rect();
|
||||||
Point pos = m_drag_window_origin;
|
Point pos = m_drag_window_origin;
|
||||||
#ifdef DRAG_DEBUG
|
#ifdef DRAG_DEBUG
|
||||||
dbgprintf("[WM] Dragging [origin: %d,%d] now: %d,%d\n", m_dragOrigin.x(), m_dragOrigin.y(), event.x(), event.y());
|
dbgprintf("[WM] Dragging [origin: %d,%d] now: %d,%d\n", m_drag_origin.x(), m_drag_origin.y(), event.x(), event.y());
|
||||||
#endif
|
#endif
|
||||||
pos.move_by(event.x() - m_drag_origin.x(), event.y() - m_drag_origin.y());
|
pos.move_by(event.x() - m_drag_origin.x(), event.y() - m_drag_origin.y());
|
||||||
m_drag_window->set_position_without_repaint(pos);
|
m_drag_window->set_position_without_repaint(pos);
|
||||||
|
@ -429,7 +429,7 @@ void WSWindowManager::set_active_window(WSWindow* window)
|
||||||
WSMessageLoop::the().post_message(previously_active_window, make<WSMessage>(WSMessage::WindowDeactivated));
|
WSMessageLoop::the().post_message(previously_active_window, make<WSMessage>(WSMessage::WindowDeactivated));
|
||||||
invalidate(*previously_active_window);
|
invalidate(*previously_active_window);
|
||||||
}
|
}
|
||||||
m_active_window = window->makeWeakPtr();
|
m_active_window = window->make_weak_ptr();
|
||||||
if (m_active_window) {
|
if (m_active_window) {
|
||||||
WSMessageLoop::the().post_message(m_active_window.ptr(), make<WSMessage>(WSMessage::WindowActivated));
|
WSMessageLoop::the().post_message(m_active_window.ptr(), make<WSMessage>(WSMessage::WindowActivated));
|
||||||
invalidate(*m_active_window);
|
invalidate(*m_active_window);
|
||||||
|
|
Loading…
Reference in a new issue