5 #ifdef HAVE_CPP_THREADS
9 #if defined(__GNUC__) && (__GNUC__<9) &&!defined(__clang__)
22 #define metapageaddr(field) \
23 ((char *) &vmem.metapage->field - (char *) vmem.metapage)
37 if (pipe(channel) < 0) {
38 for (
int j = 0;
j <
i;
j++) {
66 int fd =
open(path, O_RDWR | O_CREAT, 0600);
101 if (
map == MAP_FAILED) {
123 #ifdef HAVE_CPP_THREADS
124 while (_lock.test_and_set()) {
126 bool empty = _owner < 0;
147 #ifdef HAVE_CPP_THREADS
148 while (_lock.test_and_set()) {
173 printf(
"%2d: %ld",
i, vaddr);
176 printf(
"(%ld)", prev);
185 printf(
" -> %ld", vaddr);
187 if (prev != last_vaddr) {
188 printf(
"(%ld)", prev);
199 vaddr -= offsetof(Block, data);
204 int level = seg.block_ptr(addr)->level();
205 assert(!seg.is_free(addr));
208 Block *
block = seg.block_ptr(buddy);
218 prev->next =
block->next;
234 Block *
block = seg.block_ptr(addr);
247 size_t alloc_size =
size + offsetof(Block, data);
256 while (flevel >
level) {
259 assert((blockaddr & ((1 << flevel) - 1)) == 0);
264 vaddr_t blockaddr2 = blockaddr + (1 << (flevel - 1));
268 block2->prev = blockaddr;
269 block->next = blockaddr2;
288 struct flock &lock_info,
size_t offset,
size_t len,
bool lock) {
289 lock_info.l_start =
offset;
290 lock_info.l_len = len;
292 lock_info.l_type = lock ? F_WRLCK : F_UNLCK;
297 struct flock lock_info;
299 fcntl(
fd, F_SETLKW, &lock_info);
303 struct flock lock_info;
305 fcntl(
fd, F_SETLKW, &lock_info);
382 if (lock && sigstate ==
Waiting) {
422 using namespace internals;
430 }
else if (pid == 0) {
543 for (Event *event =
_head; event;
event =
event->
_next) {
544 if (!event->start_listen((
int) (n++))) {
549 for (Event *event =
_head; event;
event =
event->
_next) {
550 event->stop_listen();
560 #include <sys/mman.h>
561 #include <sys/stat.h>
565 namespace internals {
575 #define metapageaddr(field) \
576 ((char *) &vmem.metapage->field - (char *) vmem.metapage)
590 if (pipe(channel) < 0) {
591 for (
int j = 0;
j <
i;
j++) {
608 FILE *
fp = tmpfile();
619 int fd =
open(path, O_RDWR | O_CREAT, 0600);
655 if (
map == MAP_FAILED) {
677 #ifdef HAVE_CPP_THREADS
678 while (_lock.test_and_set()) {
680 bool empty = _owner < 0;
701 #ifdef HAVE_CPP_THREADS
702 while (_lock.test_and_set()) {
727 std::printf(
"%2d: %ld",
i, vaddr);
730 std::printf(
"(%ld)", prev);
739 std::printf(
" -> %ld", vaddr);
741 if (prev != last_vaddr) {
742 std::printf(
"(%ld)", prev);
753 vaddr -= offsetof(
Block, data);
801 size_t alloc_size =
size + offsetof(
Block, data);
810 while (flevel >
level) {
813 assert((blockaddr & ((1 << flevel) - 1)) == 0);
818 vaddr_t blockaddr2 = blockaddr + (1 << (flevel - 1));
822 block2->
prev = blockaddr;
823 block->next = blockaddr2;
842 struct flock &lock_info,
size_t offset,
size_t len,
bool lock) {
843 lock_info.l_start =
offset;
844 lock_info.l_len = len;
846 lock_info.l_type = lock ? F_WRLCK : F_UNLCK;
851 struct flock lock_info;
853 fcntl(
fd, F_SETLKW, &lock_info);
857 struct flock lock_info;
859 fcntl(
fd, F_SETLKW, &lock_info);
937 if (lock && sigstate ==
Waiting) {
977 using namespace internals;
985 }
else if (pid == 0) {
1087 event->_next =
NULL;
1099 if (!event->start_listen((
int) (n++))) {
1105 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]
Block * block_ptr(vaddr_t vaddr)
void init_flock_struct(struct flock &lock_info, size_t offset, size_t len, bool lock)
void lock_file(int fd, size_t offset, size_t len)
void vmem_free(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
static ProcessInfo & process_info(int processno)
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
void ensure_is_mapped(vaddr_t vaddr)
size_t segment_no(vaddr_t vaddr)
void * mmap_segment(int seg)
Block * block_ptr(vaddr_t vaddr)
VSeg segment(vaddr_t vaddr)
VSeg segments[MAX_SEGMENTS]
vaddr_t vaddr(size_t segno, segaddr_t addr)
segaddr_t segaddr(vaddr_t vaddr)
ProcessChannel channels[MAX_PROCESS]
Block * block_ptr(segaddr_t addr)
#define metapageaddr(field)