10#if defined(__GNUC__) && (__GNUC__<9) &&!defined(__clang__)
23#define metapageaddr(field) \
24 ((char *) &vmem.metapage->field - (char *) vmem.metapage)
39 for (
int j = 0;
j <
i;
j++) {
124#ifdef HAVE_CPP_THREADS
125 while (_lock.test_and_set()) {
127 bool empty = _owner < 0;
129 _owner =
vmem.current_process;
131 int p =
vmem.current_process;
132 vmem.metapage->process_info[
p].next = -1;
136 vmem.metapage->process_info[_tail].next =
p;
148#ifdef HAVE_CPP_THREADS
149 while (_lock.test_and_set()) {
153 _head =
vmem.metapage->process_info[_head].next;
163 vmem.metapage->allocator_lock.lock();
167 vmem.metapage->allocator_lock.unlock();
174 printf(
"%2d: %ld",
i, (
long)vaddr);
177 printf(
"(%ld)", (
long)prev);
186 printf(
" -> %ld", (
long)vaddr);
189 printf(
"(%ld)", (
long)prev);
201 vmem.ensure_is_mapped(vaddr);
203 VSeg
seg =
vmem.segment(vaddr);
205 int level =
seg.block_ptr(addr)->level();
214 Block *prev =
vmem.block_ptr(
block->prev);
219 prev->next =
block->next;
278 #if defined(__GNUC__) && (__GNUC__>11)
331 vmem.metapage->segment_count = 0;
341 +
sizeof(ProcessInfo) *
vmem.current_process);
347 +
sizeof(ProcessInfo) *
vmem.current_process);
385 int fd =
vmem.channels[
vmem.current_process].fd_read;
387 if (lock && sigstate ==
Waiting) {
427 using namespace internals;
429 for (
int p = 0;
p < MAX_PROCESS;
p++) {
430 if (vmem.metapage->process_info[
p].pid == 0) {
435 }
else if (pid == 0) {
437 int parent = vmem.current_process;
438 vmem.current_process =
p;
440 vmem.metapage->process_info[
p].pid =
getpid();
549 if (!
event->start_listen((
int) (n++))) {
555 event->stop_listen();
580#define metapageaddr(field) \
581 ((char *) &vmem.metapage->field - (char *) vmem.metapage)
596 for (
int j = 0;
j <
i;
j++) {
682#ifdef HAVE_CPP_THREADS
683 while (_lock.test_and_set()) {
685 bool empty = _owner < 0;
687 _owner =
vmem.current_process;
689 int p =
vmem.current_process;
690 vmem.metapage->process_info[
p].next = -1;
694 vmem.metapage->process_info[_tail].next =
p;
706#ifdef HAVE_CPP_THREADS
707 while (_lock.test_and_set()) {
711 _head =
vmem.metapage->process_info[_head].next;
721 vmem.metapage->allocator_lock.lock();
725 vmem.metapage->allocator_lock.unlock();
732 std::printf(
"%2d: %ld",
i, (
long)vaddr);
735 std::printf(
"(%ld)", (
long)prev);
744 std::printf(
" -> %ld", (
long)vaddr);
747 std::printf(
"(%ld)", (
long)prev);
758 #if defined(__GNUC__) && (__GNUC__>11)
763 vmem.ensure_is_mapped(vaddr);
767 int level =
seg.block_ptr(addr)->level();
810 #if defined(__GNUC__) && (__GNUC__>11)
844 #if defined(__GNUC__) && (__GNUC__>11)
897 vmem.metapage->segment_count = 0;
952 int fd =
vmem.channels[
vmem.current_process].fd_read;
954 if (lock && sigstate ==
Waiting) {
994 using namespace internals;
996 for (
int p = 0;
p < MAX_PROCESS;
p++) {
997 if (vmem.metapage->process_info[
p].pid == 0) {
1002 }
else if (pid == 0) {
1004 int parent = vmem.current_process;
1005 vmem.current_process =
p;
1007 vmem.metapage->process_info[
p].pid =
getpid();
1009 send_signal(parent);
1104 event->_next =
NULL;
1116 if (!
event->start_listen((
int) (n++))) {
1122 event->stop_listen();
CanonicalForm map(const CanonicalForm &primElem, const Variable &alpha, const CanonicalForm &F, const Variable &beta)
map from to such that is mapped onto
int _waiting[internals::MAX_PROCESS+1]
bool start_wait(internals::ipc_signal_t sig=0)
internals::ipc_signal_t _signals[internals::MAX_PROCESS+1]
void init_flock_struct(struct flock &lock_info, size_t offset, size_t len, bool lock)
static ProcessInfo & process_info(int processno)
void lock_file(int fd, size_t offset, size_t len)
void vmem_free(vaddr_t vaddr)
Block * block_ptr(vaddr_t vaddr)
vaddr_t vmem_alloc(size_t size)
static void unlock_process(int processno)
static const size_t MAX_SEGMENTS
vaddr_t freelist[LOG2_SEGMENT_SIZE+1]
static const size_t SEGMENT_SIZE
static const size_t METABLOCK_SIZE
static void lock_process(int processno)
static const int LOG2_SEGMENT_SIZE
ipc_signal_t wait_signal(bool lock)
static const int MAX_PROCESS
ProcessInfo process_info[MAX_PROCESS]
static void lock_allocator()
static segaddr_t find_buddy(segaddr_t addr, int level)
ipc_signal_t check_signal(bool resume, bool lock)
void init_metapage(bool create)
void unlock_file(int fd, size_t offset, size_t len)
bool send_signal(int processno, ipc_signal_t sig, bool lock)
static int find_level(size_t size)
static void unlock_allocator()
static void print_freelists()
internals::Mutex FastLock
int status int void size_t count write
int status int void * buf
int status int void size_t count int const void size_t count open
Block * block_ptr(vaddr_t vaddr)
void * mmap_segment(int seg)
VSeg segments[MAX_SEGMENTS]
ProcessChannel channels[MAX_PROCESS]
#define metapageaddr(field)