Compare commits

..

No commits in common. "5eb72da9c8bc565c847d78ec4eccfb29dcb04587" and "b2354ae3416c03ea093afa8dd0b1786b5ba577ac" have entirely different histories.

7 changed files with 42 additions and 78 deletions

View File

@ -2,7 +2,6 @@
#include <stdint.h> #include <stdint.h>
#include "glacier/container/array_iter.h"
#include "glacier/container/array_view.h" #include "glacier/container/array_view.h"
namespace glcr { namespace glcr {
@ -38,13 +37,6 @@ class Array {
uint64_t size() const { return size_; } uint64_t size() const { return size_; }
bool empty() const { return size_ == 0; } bool empty() const { return size_ == 0; }
typedef ArrayIterator<T> Iterator;
Iterator begin() { return {data_, size_}; }
const Iterator begin() const { return {data_, size_}; }
Iterator end() { return {nullptr, 0}; }
const Iterator end() const { return {nullptr, 0}; }
private: private:
T* data_; T* data_;
uint64_t size_; uint64_t size_;

View File

@ -1,40 +0,0 @@
#pragma once
#include <stdint.h>
namespace glcr {
template <typename T>
class ArrayIterator {
public:
ArrayIterator(T* item, uint64_t size) : item_(item), size_(size) {}
ArrayIterator next() {
if (size_ <= 1) {
return {nullptr, 0};
}
return {item_ + 1, size_ - 1};
}
ArrayIterator& operator++() {
if (size_ <= 1) {
item_ = nullptr;
size_ = 0;
} else {
item_++;
size_--;
}
return *this;
}
T& operator*() { return *item_; }
T* operator->() { return item_; }
bool operator==(const ArrayIterator& other) { return item_ == other.item_; }
bool operator!=(const ArrayIterator& other) { return item_ != other.item_; }
private:
T* item_;
uint64_t size_;
};
} // namespace glcr

View File

@ -2,8 +2,6 @@
#include <stdint.h> #include <stdint.h>
#include "glacier/container/array_iter.h"
namespace glcr { namespace glcr {
template <typename T> template <typename T>
@ -28,23 +26,6 @@ class ArrayView {
uint64_t size() const { return size_; } uint64_t size() const { return size_; }
bool empty() const { return size_; } bool empty() const { return size_; }
typedef ArrayIterator<T> Iterator;
Iterator begin() {
if (size_ == 0) {
return {nullptr, 0};
}
return {data_, size_};
}
const Iterator begin() const {
if (size_ == 0) {
return {nullptr, 0};
}
return {data_, size_};
}
Iterator end() { return {nullptr, 0}; }
const Iterator end() const { return {nullptr, 0}; }
private: private:
T* data_; T* data_;
uint64_t size_; uint64_t size_;

View File

@ -194,7 +194,8 @@ template <typename K, typename V, class H>
void HashMap<K, V, H>::Resize(uint64_t new_size) { void HashMap<K, V, H>::Resize(uint64_t new_size) {
Array<LinkedList<Pair<K, V>>> new_data(new_size); Array<LinkedList<Pair<K, V>>> new_data(new_size);
for (auto& ll : data_) { for (uint64_t i = 0; i < data_.size(); i++) {
auto& ll = data_[i];
while (!ll.empty()) { while (!ll.empty()) {
auto pair = ll.PopFront(); auto pair = ll.PopFront();
uint64_t hc = H()(pair.first()); uint64_t hc = H()(pair.first());

View File

@ -1,6 +1,5 @@
#pragma once #pragma once
#include <glacier/container/array_iter.h>
#include <glacier/memory/move.h> #include <glacier/memory/move.h>
#include <stdint.h> #include <stdint.h>
@ -49,7 +48,38 @@ class Vector {
T&& PopBack(); T&& PopBack();
typedef ArrayIterator<T> Iterator; // Forward Iter
class Iterator {
public:
Iterator(T* item, uint64_t size) : item_(item), size_(size) {}
Iterator next() {
if (size_ <= 1) {
return {nullptr, 0};
}
return {item_ + 1, size_ - 1};
}
Iterator& operator++() {
if (size_ <= 1) {
item_ = nullptr;
size_ = 0;
} else {
item_++;
size_--;
}
return *this;
}
T& operator*() { return *item_; }
T* operator->() { return item_; }
bool operator==(const Iterator& other) { return item_ == other.item_; }
bool operator!=(const Iterator& other) { return item_ != other.item_; }
private:
T* item_;
uint64_t size_;
};
Iterator begin() { return {data_, size_}; } Iterator begin() { return {data_, size_}; }
const Iterator begin() const { return {data_, size_}; } const Iterator begin() const { return {data_, size_}; }

View File

@ -47,16 +47,16 @@ VariableMemoryObject::VariableMemoryObject(uint64_t size) : size_(size) {
// FIXME: Do this lazily. // FIXME: Do this lazily.
uint64_t num_pages = size_ / 0x1000; uint64_t num_pages = size_ / 0x1000;
phys_page_list_ = glcr::Array<uint64_t>(num_pages); phys_page_list_ = glcr::Array<uint64_t>(num_pages);
for (uint64_t& page : phys_page_list_) { for (uint64_t i = 0; i < phys_page_list_.size(); i++) {
page = 0; phys_page_list_[i] = 0;
} }
} }
VariableMemoryObject::~VariableMemoryObject() { VariableMemoryObject::~VariableMemoryObject() {
for (uint64_t& page : phys_page_list_) { for (uint64_t p = 0; p < phys_page_list_.size(); p++) {
if (page != 0) { if (phys_page_list_[p] != 0) {
// TODO: We may be able to do some sort of coalescing here. // TODO: We may be able to do some sort of coalescing here.
phys_mem::FreePage(page); phys_mem::FreePage(phys_page_list_[p]);
} }
} }
} }

View File

@ -28,12 +28,12 @@ glcr::ErrorOr<IpcMessage> TranslateRequestToIpcMessage(const T& req) {
glcr::ArrayView<const z_cap_t> caps(req.caps, req.num_caps); glcr::ArrayView<const z_cap_t> caps(req.caps, req.num_caps);
message.caps.Resize(caps.size()); message.caps.Resize(caps.size());
for (uint64_t capid : caps) { for (uint64_t i = 0; i < caps.size(); i++) {
// FIXME: This would feel safer closer to the relevant syscall. // FIXME: This would feel safer closer to the relevant syscall.
// FIXME: Race conditions on get->check->release here. Would be better to // FIXME: Race conditions on get->check->release here. Would be better to
// have that as a single call on the process. (This pattern repeats other // have that as a single call on the process. (This pattern repeats other
// places too). // places too).
auto cap = gScheduler->CurrentProcess().GetCapability(capid); auto cap = gScheduler->CurrentProcess().GetCapability(caps[i]);
if (!cap) { if (!cap) {
return glcr::CAP_NOT_FOUND; return glcr::CAP_NOT_FOUND;
} }
@ -41,7 +41,7 @@ glcr::ErrorOr<IpcMessage> TranslateRequestToIpcMessage(const T& req) {
return glcr::CAP_PERMISSION_DENIED; return glcr::CAP_PERMISSION_DENIED;
} }
message.caps.PushBack( message.caps.PushBack(
gScheduler->CurrentProcess().ReleaseCapability(capid)); gScheduler->CurrentProcess().ReleaseCapability(caps[i]));
} }
return message; return message;