Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(120)

Side by Side Diff: libraries/nacl-mounts/base/KernelProxy.h

Issue 10392070: Socket subsystem implementation (Closed) Base URL: http://naclports.googlecode.com/svn/trunk/src/
Patch Set: Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The Native Client Authors. All rights reserved. 2 * Copyright (c) 2012 The Native Client Authors. All rights reserved.
3 * Use of this source code is governed by a BSD-style license that can be 3 * Use of this source code is governed by a BSD-style license that can be
4 * found in the LICENSE file. 4 * found in the LICENSE file.
5 */ 5 */
6 #ifndef PACKAGES_LIBRARIES_NACL_MOUNTS_BASE_KERNELPROXY_H_ 6 #ifndef PACKAGES_LIBRARIES_NACL_MOUNTS_BASE_KERNELPROXY_H_
7 #define PACKAGES_LIBRARIES_NACL_MOUNTS_BASE_KERNELPROXY_H_ 7 #define PACKAGES_LIBRARIES_NACL_MOUNTS_BASE_KERNELPROXY_H_
8 8
9 #include <errno.h> 9 #include <errno.h>
10 #ifdef __GLIBC__ 10 #ifdef __GLIBC__
11 #include <netdb.h>
Dmitry Polukhin 2012/05/29 15:00:51 General comment need to make sure that this code s
vissi 2012/05/30 08:10:51 Done.
11 #include <poll.h> 12 #include <poll.h>
12 #endif 13 #endif
13 #include <pthread.h> 14 #include <pthread.h>
14 #ifdef __GLIBC__ 15 #ifdef __GLIBC__
15 #include <sys/epoll.h> 16 #include <sys/epoll.h>
16 #endif 17 #endif
17 #include <sys/stat.h> 18 #include <sys/stat.h>
18 #include <string> 19 #include <string>
19 #include "../base/Mount.h" 20 #include "../base/Mount.h"
20 #include "../base/MountManager.h" 21 #include "../base/MountManager.h"
22 #include "../base/PthreadHelpers.h"
23 #include "../net/BaseSocketSubSystem.h"
21 #include "../util/Path.h" 24 #include "../util/Path.h"
22 #include "../util/SimpleAutoLock.h" 25 #include "../util/SimpleAutoLock.h"
23 #include "../util/SlotAllocator.h" 26 #include "../util/SlotAllocator.h"
24 27
25 // KernelProxy handles all of the system calls. System calls are either 28 // KernelProxy handles all of the system calls. System calls are either
26 // (1) handled entirely by the KernelProxy, (2) processed by the 29 // (1) handled entirely by the KernelProxy, (2) processed by the
27 // KernelProxy and then passed to a Mount, or (3) proccessed by the 30 // KernelProxy and then passed to a Mount, or (3) proccessed by the
28 // KernelProxy using other system calls implemented by the Mount. 31 // KernelProxy using other system calls implemented by the Mount.
29 class KernelProxy { 32 class KernelProxy {
30 public: 33 public:
31 virtual ~KernelProxy() {} 34 virtual ~KernelProxy() {}
32 35
33 // Obtain the singleton instance of the kernel proxy. If no instance 36 // Obtain the singleton instance of the kernel proxy. If no instance
34 // has been instantiated, one will be instantiated and returned. 37 // has been instantiated, one will be instantiated and returned.
35 static KernelProxy *KPInstance(); 38 static KernelProxy *KPInstance();
39 void SetSocketSubSystem(BaseSocketSubSystem* bss);
Dmitry Polukhin 2012/05/29 15:00:51 Please add comment about this function.
vissi 2012/05/30 08:10:51 Done.
36 40
37 // System calls handled by KernelProxy (not mount-specific) 41 // System calls handled by KernelProxy (not mount-specific)
38 int chdir(const std::string& path); 42 int chdir(const std::string& path);
39 bool getcwd(std::string *buf, size_t size); 43 bool getcwd(std::string *buf, size_t size);
40 bool getwd(std::string *buf); 44 bool getwd(std::string *buf);
41 int dup(int oldfd); 45 int dup(int oldfd);
46 int dup2(int oldfd, int newfd);
42 47
43 // System calls that take a path as an argument: 48 // System calls that take a path as an argument:
44 // The kernel proxy will look for the Node associated to the path. To 49 // The kernel proxy will look for the Node associated to the path. To
45 // find the node, the kernel proxy calls the corresponding mounts GetNode() 50 // find the node, the kernel proxy calls the corresponding mounts GetNode()
46 // method. The corresponding method will be called. If the node 51 // method. The corresponding method will be called. If the node
47 // cannot be found, errno is set and -1 is returned. 52 // cannot be found, errno is set and -1 is returned.
48 int chmod(const std::string& path, mode_t mode); 53 int chmod(const std::string& path, mode_t mode);
49 int stat(const std::string& path, struct stat *buf); 54 int stat(const std::string& path, struct stat *buf);
50 int mkdir(const std::string& path, mode_t mode); 55 int mkdir(const std::string& path, mode_t mode);
51 int rmdir(const std::string& path); 56 int rmdir(const std::string& path);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 int recv(int sockfd, void *buf, size_t len, int flags); 107 int recv(int sockfd, void *buf, size_t len, int flags);
103 int recvmsg(int sockfd, struct msghdr *msg, int flags); 108 int recvmsg(int sockfd, struct msghdr *msg, int flags);
104 int recvfrom(int sockfd, void *buf, size_t len, int flags, 109 int recvfrom(int sockfd, void *buf, size_t len, int flags,
105 struct sockaddr *dest_addr, socklen_t* addrlen); 110 struct sockaddr *dest_addr, socklen_t* addrlen);
106 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, 111 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
107 const struct timeval *timeout); 112 const struct timeval *timeout);
108 int pselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, 113 int pselect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
109 const struct timeval *timeout, void* sigmask); 114 const struct timeval *timeout, void* sigmask);
110 int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 115 int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
111 int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 116 int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
117 struct hostent* gethostbyname(const char* name);
112 int getsockopt(int sockfd, int level, int optname, void *optval, 118 int getsockopt(int sockfd, int level, int optname, void *optval,
113 socklen_t* optlen); 119 socklen_t* optlen);
114 int setsockopt(int sockfd, int level, int optname, const void *optval, 120 int setsockopt(int sockfd, int level, int optname, const void *optval,
115 socklen_t optlen); 121 socklen_t optlen);
116 int shutdown(int sockfd, int how); 122 int shutdown(int sockfd, int how);
117 int epoll_create(int size); 123 int epoll_create(int size);
118 int epoll_create1(int flags); 124 int epoll_create1(int flags);
119 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); 125 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
120 int epoll_wait(int epfd, struct epoll_event *events, int maxevents, 126 int epoll_wait(int epfd, struct epoll_event *events, int maxevents,
121 int timeout); 127 int timeout);
122 int epoll_pwait(int epfd, struct epoll_event *events, int maxevents, 128 int epoll_pwait(int epfd, struct epoll_event *events, int maxevents,
123 int timeout, const sigset_t *sigmask, size_t sigset_size); 129 int timeout, const sigset_t *sigmask, size_t sigset_size);
124 int socketpair(int domain, int type, int protocol, int sv[2]); 130 int socketpair(int domain, int type, int protocol, int sv[2]);
125 int poll(struct pollfd *fds, nfds_t nfds, int timeout); 131 int poll(struct pollfd *fds, nfds_t nfds, int timeout);
126 int ppoll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout, 132 int ppoll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout,
127 const sigset_t *sigmask, size_t sigset_size); 133 const sigset_t *sigmask, size_t sigset_size);
128 #endif 134 #endif
129 MountManager *mm() { return &mm_; } 135 MountManager *mm() { return &mm_; }
130 136
137 int AddFileStream(FileStream* stream);
138 void RemoveFileStream(int fd);
139
140 int IsReady(int nfds, fd_set* fds, bool (FileStream::*is_ready)(),
141 bool apply);
142 Cond& select_cond() { return select_cond_; }
143 Mutex& select_mutex() { return select_mutex_; }
131 private: 144 private:
132 struct FileDescriptor { 145 struct FileDescriptor {
133 // An index in open_files_ table 146 // An index in open_files_ table
134 int handle; 147 int handle;
135 }; 148 };
136 149
150 // used for select() signals
151 Cond select_cond_;
152 Mutex select_mutex_;
153
137 struct FileHandle { 154 struct FileHandle {
138 Mount *mount; 155 Mount *mount;
156 FileStream* stream;
139 ino_t node; 157 ino_t node;
140 off_t offset; 158 off_t offset;
141 int flags; 159 int flags;
142 int use_count; 160 int use_count;
143 pthread_mutex_t lock; 161 pthread_mutex_t lock;
144 }; 162 };
163 FileHandle* GetFileHandle(int fd);
145 164
165 BaseSocketSubSystem* ss;
Dmitry Polukhin 2012/05/29 15:00:51 Need better name and underscore at the end.
vissi 2012/05/30 08:10:51 Done.
146 Path cwd_; 166 Path cwd_;
147 int max_path_len_; 167 int max_path_len_;
148 MountManager mm_; 168 MountManager mm_;
149 pthread_mutex_t kp_lock_; 169 pthread_mutex_t kp_lock_;
150 static KernelProxy *kp_instance_; 170 static KernelProxy *kp_instance_;
151 171
152 SlotAllocator<FileDescriptor> fds_; 172 SlotAllocator<FileDescriptor> fds_;
153 SlotAllocator<FileHandle> open_files_; 173 SlotAllocator<FileHandle> open_files_;
154 174
155 FileHandle *GetFileHandle(int fd);
156 int OpenHandle(Mount *mount, const std::string& path, int oflag, mode_t mode); 175 int OpenHandle(Mount *mount, const std::string& path, int oflag, mode_t mode);
157 176
158 KernelProxy(); 177 KernelProxy();
159 static void Instantiate(); 178 static void Instantiate();
160 }; 179 };
161 180
162 #endif // PACKAGES_LIBRARIES_NACL_MOUNTS_BASE_KERNELPROXY_H_ 181 #endif // PACKAGES_LIBRARIES_NACL_MOUNTS_BASE_KERNELPROXY_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698