History

Basic implementation of Sys module functions - Sys.create, Sys.open, Sys.read, Sys.write - Sys.tokenize

Code analysis violations Bug in scheduler - race during with worker thread shutdown.

arr committed 10 years ago

Commit 992a33f1 parent 6d77c2d18 files · +695 −243Browse files

Showing the changes to src/vm/sys/fd_manager.cpp (1 of 18 files). Show all

Unified · Split

src/vm/sys/fd_manager.cpp+84−0
@@ -0,0 +1,84 @@
1//
2// Dis VM
3// File: fd_manager.cpp
4// Author: arr
5//
6
7#include <array>
8#include <mutex>
9#include <unordered_map>
10#include <exceptions.h>
11#include <vm_memory.h>
12#include "sys_utils.h"
13
14using namespace disvm::runtime;
15
16namespace
17{
18 using fd_map_t = std::unordered_map<word_t, vm_alloc_t *>;
19
20 auto std_fd = std::array<vm_alloc_t * , 3>
21 {
22 nullptr, // stdin
23 nullptr, // stdout
24 nullptr, // stderr
25 };
26
27 auto next_fd = word_t{ 0 };
28
29 std::mutex fd_map_lock;
30 auto fd_map = fd_map_t{};
31}
32
33word_t disvm::runtime::sys::create_fd_record(vm_alloc_t * fd_alloc)
34{
35 assert(fd_alloc != nullptr);
36
37 {
38 std::lock_guard<std::mutex> lock{ fd_map_lock };
39
40 auto new_fd = next_fd;
41 next_fd++;
42 if (new_fd < static_cast<word_t>(std_fd.size()))
43 {
44 std_fd[new_fd] = fd_alloc;
45 }
46 else
47 {
48 assert(fd_map.cend() == fd_map.find(new_fd));
49 fd_map[new_fd] = fd_alloc;
50 }
51
52 return new_fd;
53 }
54}
55
56vm_alloc_t * disvm::runtime::sys::fetch_fd_record(word_t fd)
57{
58 assert(fd != sys::vm_invalid_fd && "Invalid FD value");
59
60 if (0 <= fd && fd < static_cast<word_t>(std_fd.size()))
61 return std_fd[fd];
62
63 {
64 std::lock_guard<std::mutex> lock{ fd_map_lock };
65 auto iter = fd_map.find(fd);
66 if (iter == fd_map.cend())
67 throw vm_user_exception{ "Unknown file descriptor" };
68
69 return iter->second;
70 }
71}
72
73void disvm::runtime::sys::drop_fd_record(word_t fd)
74{
75 assert(fd != sys::vm_invalid_fd && "Invalid FD value");
76 assert(fd >= static_cast<word_t>(std_fd.size()) && "Request to drop std file?");
77
78 {
79 std::lock_guard<std::mutex> lock{ fd_map_lock };
80 auto iter = fd_map.find(fd);
81 if (iter != fd_map.cend())
82 fd_map.erase(iter);
83 }
84}