|
[ source navigation ] [ diff markup ] [ identifier search ] [ general search ] |
|||
|
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 ] |