SimpleOS

LXR

Navigation



Site hébergé par : enix

The LXR Cross Referencer for SOS

source navigation ]
diff markup ]
identifier search ]
general search ]
 
 
Article:1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 6.5 ] [ 7 ] [ 7.5 ] [ 8 ] [ 9 ] [ 9.5 ]

001 /* Copyright (C) 2005 David Decotigny
002 
003    This program is free software; you can redistribute it and/or
004    modify it under the terms of the GNU General Public License
005    as published by the Free Software Foundation; either version 2
006    of the License, or (at your option) any later version.
007    
008    This program is distributed in the hope that it will be useful,
009    but WITHOUT ANY WARRANTY; without even the implied warranty of
010    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
011    GNU General Public License for more details.
012    
013    You should have received a copy of the GNU General Public License
014    along with this program; if not, write to the Free Software
015    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
016    USA. 
017 */
018 #ifndef _SOS_PROCESS_H_
019 #define _SOS_PROCESS_H_
020 
021 /**
022  * @file process.h
023  *
024  * SOS Definition of a process and associated management API. A
025  * process is basically the collection of all the resources requested
026  * by a user program. The threads are one of these resources, the
027  * mm_context is one other example of such resources.  In SOS, a
028  * "process" is mainly a resource manager, a container. It does not
029  * provide much advanced functionality apart from a reference counter.
030  *
031  * Only the user threads belong to a process. The kernel
032  * threads don't because the resources they hold are held by the whole
033  * kernel, thus by ALL the threads (kernel AND user): the notion of
034  * "process" doesn't have any meaning for them because they don't own
035  * any proper resource (apart from their stack).
036  */
037 
038 #include <sos/errno.h>
039 
040 /**
041  * The definition of an SOS process is opaque. @see process.c
042  */
043 struct sos_process;
044 
045 #include <sos/thread.h>
046 #include <sos/fs.h>
047 
048 
049 /**
050  * Default size of a user stack (8 MB)
051  */
052 #define SOS_DEFAULT_USER_STACK_SIZE (8 << 20)
053 
054 
055 /**
056  * Initialization of the process subsystem
057  */
058 sos_ret_t sos_process_subsystem_setup();
059 
060 
061 /**
062  * Initialize a new process and return a reference to it. This
063  * means that:
064  *  - A new mm_context has been initialized
065  *  - No threads belong to this process yet
066  *  - If do_copy_current_process is FALSE:
067  *     - Nothing is mapped in user space
068  *     - No other resource is used
069  *  - If do_copy_current_process is TRUE:
070  *     - Same user mapping as in current thread's process
071  *     - Same other resources used as for current thread's processs
072  *
073  * @return NULL on error (not enough memory)
074  */
075 struct sos_process *sos_process_create(const char *name,
076                                        sos_bool_t do_copy_current_process);
077 
078 
079 /**
080  * Signal we're using another reference to a process.
081  */
082 sos_ret_t sos_process_ref(struct sos_process *proc);
083 
084 
085 /**
086  * Release the reference to a process. If nobody holds a reference to
087  * it and if the process does not have any thread anymore, the process
088  * is destroyed.
089  *
090  * @return -SOS_EBUSY when the process is still referenced afterwards
091  */
092 sos_ret_t sos_process_unref(struct sos_process *proc);
093 
094 
095 /**
096  * Return the number of threads currently registered in the process
097  */
098 sos_count_t sos_process_get_nb_threads(const struct sos_process *proc);
099 
100 
101 /**
102  * Retrieve the address of the MMU configuration description
103  *
104  * @return NULL on error
105  */
106 struct sos_mm_context *
107 sos_process_get_mm_context(const struct sos_process *proc);
108 
109 
110 /**
111  * Retrieve the address space for the process
112  *
113  * @return NULL on error
114  */
115 struct sos_umem_vmm_as *
116 sos_process_get_address_space(const struct sos_process *proc);
117 
118 
119 /**
120  * Retrieve the root FS node of the process
121  *
122  * @return NULL on error
123  */
124 struct sos_fs_opened_file *
125 sos_process_get_root(const struct sos_process *proc);
126 
127 
128 /**
129  * Retrieve the current working dir of the process
130  *
131  * @return NULL on error
132  */
133 struct sos_fs_opened_file *
134 sos_process_get_cwd(const struct sos_process *proc);
135 
136 
137 /**
138  * Retrieve the opened file structure corresponding to the given FD
139  *
140  * @return NULL on error
141  */
142 struct sos_fs_opened_file *
143 sos_process_get_opened_file(const struct sos_process *proc,
144                             int fd);
145 
146 
147 /**
148  * Change the root directory for the process
149  */
150 sos_ret_t
151 sos_process_chroot(struct sos_process *proc,
152                    struct sos_fs_opened_file * new_root,
153                    struct sos_fs_opened_file ** old_root);
154 
155 
156 /**
157  * Change the working directory of the process
158  */
159 sos_ret_t
160 sos_process_chdir(struct sos_process *proc,
161                   struct sos_fs_opened_file * new_cwd,
162                   struct sos_fs_opened_file ** old_cwd);
163 
164 
165 /**
166  * Allocate a new file descriptor for file
167  *
168  * @return >=0 on success, <0 on error (errno)
169  */
170 sos_ret_t
171 sos_process_register_opened_file(struct sos_process *proc,
172                                  struct sos_fs_opened_file * of);
173 
174 
175 /**
176  * Free the given file descriptor
177  *
178  * @return >=0 on success, <0 on error (errno)
179  */
180 sos_ret_t
181 sos_process_unregister_opened_file(struct sos_process *proc,
182                                    int fd);
183 
184 
185 /* ***************************************************
186  * Restricted functions
187  */
188 
189 
190 /**
191  * Change the name of the process
192  */
193 sos_ret_t sos_process_set_name(struct sos_process * proc,
194                                const char * new_name);
195 
196 
197 /**
198  * Attach the given thread to the process
199  *
200  * @note This function is called internally by thread.c . The thread
201  * is assumed to be in the "CREATED" state, ie one cannot attach a
202  * thread to some other process once it has been created.
203  */
204 sos_ret_t sos_process_register_thread(struct sos_process *in_proc,
205                                       struct sos_thread *thr);
206 
207 
208 /**
209  * Remove the given thread from the given process threads' list. When
210  * the process becomes empty (ie does not contain any thread anymore
211  * and is not referenced by anybody), all its resources are released.
212  *
213  * @note This function is called internally by thread.c . The thread
214  * is assumed to be in the "ZOMBIE" state.
215  */
216 sos_ret_t sos_process_unregister_thread(struct sos_thread *thr);
217 
218 
219 /**
220  * Replace the address space of the process by another one
221  *
222  * @note The previous address space (if any) is deleted !
223  */
224 sos_ret_t sos_process_set_address_space(struct sos_process *proc,
225                                         struct sos_umem_vmm_as *new_as);
226 
227 #endif /* _SOS_PROCESS_H_ */

source navigation ] diff markup ] identifier search ] general search ]