Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Wine server objects |
| 3 | * |
| 4 | * Copyright (C) 1998 Alexandre Julliard |
Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 5 | * |
| 6 | * This library is free software; you can redistribute it and/or |
| 7 | * modify it under the terms of the GNU Lesser General Public |
| 8 | * License as published by the Free Software Foundation; either |
| 9 | * version 2.1 of the License, or (at your option) any later version. |
| 10 | * |
| 11 | * This library is distributed in the hope that it will be useful, |
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 14 | * Lesser General Public License for more details. |
| 15 | * |
| 16 | * You should have received a copy of the GNU Lesser General Public |
| 17 | * License along with this library; if not, write to the Free Software |
| 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 19 | */ |
| 20 | |
| 21 | #ifndef __WINE_SERVER_OBJECT_H |
| 22 | #define __WINE_SERVER_OBJECT_H |
| 23 | |
Alexandre Julliard | 247b8ae | 1999-12-13 00:16:44 +0000 | [diff] [blame] | 24 | #include <sys/poll.h> |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 25 | #include <sys/time.h> |
Alexandre Julliard | 37ec927 | 2001-07-19 00:35:37 +0000 | [diff] [blame] | 26 | #include "wine/server_protocol.h" |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 27 | |
Alexandre Julliard | 1bdd154 | 1999-06-04 19:47:04 +0000 | [diff] [blame] | 28 | #define DEBUG_OBJECTS |
| 29 | |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 30 | /* kernel objects */ |
| 31 | |
| 32 | struct object; |
| 33 | struct object_name; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 34 | struct thread; |
Alexandre Julliard | fdc92ba | 1999-02-14 18:03:15 +0000 | [diff] [blame] | 35 | struct process; |
Alexandre Julliard | a8b8d9c | 1999-01-01 16:59:27 +0000 | [diff] [blame] | 36 | struct file; |
Alexandre Julliard | c6e45ed | 1998-12-27 08:35:39 +0000 | [diff] [blame] | 37 | struct wait_queue_entry; |
Mike McCormack | 1eac191 | 2000-11-13 19:27:21 +0000 | [diff] [blame] | 38 | struct async; |
Mike McCormack | 6f011c0 | 2001-12-20 00:07:05 +0000 | [diff] [blame] | 39 | struct async_queue; |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 40 | |
Alexandre Julliard | 0562539 | 1999-01-03 11:55:56 +0000 | [diff] [blame] | 41 | /* operations valid on all objects */ |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 42 | struct object_ops |
| 43 | { |
Alexandre Julliard | 5bc7808 | 1999-06-22 17:26:53 +0000 | [diff] [blame] | 44 | /* size of this object type */ |
| 45 | size_t size; |
Alexandre Julliard | c6e45ed | 1998-12-27 08:35:39 +0000 | [diff] [blame] | 46 | /* dump the object (for debugging) */ |
| 47 | void (*dump)(struct object *,int); |
| 48 | /* add a thread to the object wait queue */ |
Alexandre Julliard | a8b8d9c | 1999-01-01 16:59:27 +0000 | [diff] [blame] | 49 | int (*add_queue)(struct object *,struct wait_queue_entry *); |
Alexandre Julliard | c6e45ed | 1998-12-27 08:35:39 +0000 | [diff] [blame] | 50 | /* remove a thread from the object wait queue */ |
| 51 | void (*remove_queue)(struct object *,struct wait_queue_entry *); |
| 52 | /* is object signaled? */ |
| 53 | int (*signaled)(struct object *,struct thread *); |
| 54 | /* wait satisfied; return 1 if abandoned */ |
| 55 | int (*satisfied)(struct object *,struct thread *); |
Alexandre Julliard | 1dca5e2 | 2000-01-01 00:56:27 +0000 | [diff] [blame] | 56 | /* get the events we want to poll() for on this object */ |
| 57 | int (*get_poll_events)(struct object *); |
| 58 | /* a poll() event occured */ |
| 59 | void (*poll_event)(struct object *,int event); |
Alexandre Julliard | 1ab243b | 2000-12-19 02:12:45 +0000 | [diff] [blame] | 60 | /* return a Unix fd that can be used to read/write from the object */ |
| 61 | int (*get_fd)(struct object *); |
Alexandre Julliard | aa0ebd0 | 1998-12-30 12:06:45 +0000 | [diff] [blame] | 62 | /* flush the object buffers */ |
Alexandre Julliard | 0562539 | 1999-01-03 11:55:56 +0000 | [diff] [blame] | 63 | int (*flush)(struct object *); |
| 64 | /* get file information */ |
Martin Wilck | 88cd32b | 2002-01-09 20:30:51 +0000 | [diff] [blame] | 65 | int (*get_file_info)(struct object *,struct get_file_info_reply *, int *flags); |
Martin Wilck | 54ba272 | 2002-04-24 21:29:54 +0000 | [diff] [blame] | 66 | /* queue an async operation - see register_async handler in async.c*/ |
| 67 | void (*queue_async)(struct object *, void* ptr, unsigned int status, int type, int count); |
Alexandre Julliard | c6e45ed | 1998-12-27 08:35:39 +0000 | [diff] [blame] | 68 | /* destroy on refcount == 0 */ |
| 69 | void (*destroy)(struct object *); |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 70 | }; |
| 71 | |
| 72 | struct object |
| 73 | { |
Alexandre Julliard | 1dca5e2 | 2000-01-01 00:56:27 +0000 | [diff] [blame] | 74 | unsigned int refcount; /* reference count */ |
| 75 | int fd; /* file descriptor */ |
| 76 | int select; /* select() user id */ |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 77 | const struct object_ops *ops; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 78 | struct wait_queue_entry *head; |
| 79 | struct wait_queue_entry *tail; |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 80 | struct object_name *name; |
Alexandre Julliard | 1bdd154 | 1999-06-04 19:47:04 +0000 | [diff] [blame] | 81 | #ifdef DEBUG_OBJECTS |
| 82 | struct object *prev; |
| 83 | struct object *next; |
| 84 | #endif |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 85 | }; |
| 86 | |
Alexandre Julliard | c5e433a | 2000-05-30 19:48:18 +0000 | [diff] [blame] | 87 | struct wait_queue_entry |
| 88 | { |
| 89 | struct wait_queue_entry *next; |
| 90 | struct wait_queue_entry *prev; |
| 91 | struct object *obj; |
| 92 | struct thread *thread; |
| 93 | }; |
| 94 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 95 | extern void *mem_alloc( size_t size ); /* malloc wrapper */ |
Alexandre Julliard | d7e85d6 | 1999-11-23 19:39:11 +0000 | [diff] [blame] | 96 | extern void *memdup( const void *data, size_t len ); |
Alexandre Julliard | 1dca5e2 | 2000-01-01 00:56:27 +0000 | [diff] [blame] | 97 | extern void *alloc_object( const struct object_ops *ops, int fd ); |
Alexandre Julliard | d16319c | 1999-11-25 21:30:24 +0000 | [diff] [blame] | 98 | extern void dump_object_name( struct object *obj ); |
| 99 | extern void *create_named_object( const struct object_ops *ops, const WCHAR *name, size_t len ); |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 100 | /* grab/release_object can take any pointer, but you better make sure */ |
| 101 | /* that the thing pointed to starts with a struct object... */ |
| 102 | extern struct object *grab_object( void *obj ); |
| 103 | extern void release_object( void *obj ); |
Alexandre Julliard | d16319c | 1999-11-25 21:30:24 +0000 | [diff] [blame] | 104 | extern struct object *find_object( const WCHAR *name, size_t len ); |
Alexandre Julliard | a8b8d9c | 1999-01-01 16:59:27 +0000 | [diff] [blame] | 105 | extern int no_add_queue( struct object *obj, struct wait_queue_entry *entry ); |
Alexandre Julliard | aa0ebd0 | 1998-12-30 12:06:45 +0000 | [diff] [blame] | 106 | extern int no_satisfied( struct object *obj, struct thread *thread ); |
Alexandre Julliard | 1ab243b | 2000-12-19 02:12:45 +0000 | [diff] [blame] | 107 | extern int no_get_fd( struct object *obj ); |
Alexandre Julliard | aa0ebd0 | 1998-12-30 12:06:45 +0000 | [diff] [blame] | 108 | extern int no_flush( struct object *obj ); |
Martin Wilck | 88cd32b | 2002-01-09 20:30:51 +0000 | [diff] [blame] | 109 | extern int no_get_file_info( struct object *obj, struct get_file_info_reply *info, int *flags ); |
Alexandre Julliard | 5bc7808 | 1999-06-22 17:26:53 +0000 | [diff] [blame] | 110 | extern void no_destroy( struct object *obj ); |
Alexandre Julliard | 1dca5e2 | 2000-01-01 00:56:27 +0000 | [diff] [blame] | 111 | extern int default_poll_add_queue( struct object *obj, struct wait_queue_entry *entry ); |
| 112 | extern void default_poll_remove_queue( struct object *obj, struct wait_queue_entry *entry ); |
| 113 | extern int default_poll_signaled( struct object *obj, struct thread *thread ); |
| 114 | extern void default_poll_event( struct object *obj, int event ); |
Alexandre Julliard | 1bdd154 | 1999-06-04 19:47:04 +0000 | [diff] [blame] | 115 | #ifdef DEBUG_OBJECTS |
| 116 | extern void dump_objects(void); |
| 117 | #endif |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 118 | |
Alexandre Julliard | c6e45ed | 1998-12-27 08:35:39 +0000 | [diff] [blame] | 119 | /* select functions */ |
| 120 | |
Alexandre Julliard | 1dca5e2 | 2000-01-01 00:56:27 +0000 | [diff] [blame] | 121 | extern int add_select_user( struct object *obj ); |
| 122 | extern void remove_select_user( struct object *obj ); |
Alexandre Julliard | 9caa71e | 2001-11-30 18:46:42 +0000 | [diff] [blame] | 123 | extern void change_select_fd( struct object *obj, int fd, int events ); |
Alexandre Julliard | 1dca5e2 | 2000-01-01 00:56:27 +0000 | [diff] [blame] | 124 | extern void set_select_events( struct object *obj, int events ); |
Alexandre Julliard | 247b8ae | 1999-12-13 00:16:44 +0000 | [diff] [blame] | 125 | extern int check_select_events( int fd, int events ); |
Alexandre Julliard | c6e45ed | 1998-12-27 08:35:39 +0000 | [diff] [blame] | 126 | extern void select_loop(void); |
| 127 | |
Alexandre Julliard | 88de35c | 1999-05-16 16:57:49 +0000 | [diff] [blame] | 128 | /* timeout functions */ |
| 129 | |
| 130 | struct timeout_user; |
| 131 | |
| 132 | typedef void (*timeout_callback)( void *private ); |
| 133 | |
| 134 | extern struct timeout_user *add_timeout_user( struct timeval *when, |
| 135 | timeout_callback func, void *private ); |
| 136 | extern void remove_timeout_user( struct timeout_user *user ); |
Alexandre Julliard | 247b8ae | 1999-12-13 00:16:44 +0000 | [diff] [blame] | 137 | extern void add_timeout( struct timeval *when, int timeout ); |
| 138 | /* return 1 if t1 is before t2 */ |
| 139 | static inline int time_before( struct timeval *t1, struct timeval *t2 ) |
| 140 | { |
| 141 | return ((t1->tv_sec < t2->tv_sec) || |
| 142 | ((t1->tv_sec == t2->tv_sec) && (t1->tv_usec < t2->tv_usec))); |
| 143 | } |
Alexandre Julliard | 88de35c | 1999-05-16 16:57:49 +0000 | [diff] [blame] | 144 | |
Alexandre Julliard | d6d994f | 1999-09-28 16:40:07 +0000 | [diff] [blame] | 145 | /* event functions */ |
| 146 | |
| 147 | struct event; |
| 148 | |
Alexandre Julliard | 6a72dc5 | 2000-04-14 13:42:00 +0000 | [diff] [blame] | 149 | extern struct event *create_event( const WCHAR *name, size_t len, |
| 150 | int manual_reset, int initial_state ); |
Alexandre Julliard | 8081e5a | 2001-01-05 04:08:07 +0000 | [diff] [blame] | 151 | extern struct event *get_event_obj( struct process *process, handle_t handle, unsigned int access ); |
Alexandre Julliard | d6d994f | 1999-09-28 16:40:07 +0000 | [diff] [blame] | 152 | extern void pulse_event( struct event *event ); |
| 153 | extern void set_event( struct event *event ); |
| 154 | extern void reset_event( struct event *event ); |
| 155 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 156 | /* mutex functions */ |
| 157 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 158 | extern void abandon_mutexes( struct thread *thread ); |
| 159 | |
Alexandre Julliard | 338e757 | 1998-12-27 15:28:54 +0000 | [diff] [blame] | 160 | /* file functions */ |
| 161 | |
Alexandre Julliard | 8081e5a | 2001-01-05 04:08:07 +0000 | [diff] [blame] | 162 | extern struct file *get_file_obj( struct process *process, handle_t handle, |
Alexandre Julliard | a8b8d9c | 1999-01-01 16:59:27 +0000 | [diff] [blame] | 163 | unsigned int access ); |
Alexandre Julliard | 84fdfd0 | 2001-04-13 22:38:39 +0000 | [diff] [blame] | 164 | extern int is_same_file( struct file *file1, struct file *file2 ); |
Ove Kaaven | 708a846 | 2001-10-24 00:23:25 +0000 | [diff] [blame] | 165 | extern int get_file_drive_type( struct file *file ); |
Alexandre Julliard | cb28bdc | 1999-02-28 10:13:59 +0000 | [diff] [blame] | 166 | extern int grow_file( struct file *file, int size_high, int size_low ); |
Alexandre Julliard | 5bc7808 | 1999-06-22 17:26:53 +0000 | [diff] [blame] | 167 | extern int create_anonymous_file(void); |
Alexandre Julliard | cb28bdc | 1999-02-28 10:13:59 +0000 | [diff] [blame] | 168 | extern struct file *create_temp_file( int access ); |
Alexandre Julliard | aa0ebd0 | 1998-12-30 12:06:45 +0000 | [diff] [blame] | 169 | extern void file_set_error(void); |
| 170 | |
Mike McCormack | 1eac191 | 2000-11-13 19:27:21 +0000 | [diff] [blame] | 171 | /* serial functions */ |
| 172 | |
Michael McCormack | 1c32a46 | 2001-03-22 20:09:34 +0000 | [diff] [blame] | 173 | int get_serial_async_timeout(struct object *obj, int type, int count); |
Mike McCormack | 1eac191 | 2000-11-13 19:27:21 +0000 | [diff] [blame] | 174 | |
Alexandre Julliard | e712e07 | 1999-05-23 19:53:30 +0000 | [diff] [blame] | 175 | /* debugger functions */ |
| 176 | |
Alexandre Julliard | ea0d028 | 2000-03-10 22:16:10 +0000 | [diff] [blame] | 177 | extern int set_process_debugger( struct process *process, struct thread *debugger ); |
Alexandre Julliard | 05f0b71 | 2000-03-09 18:18:41 +0000 | [diff] [blame] | 178 | extern void generate_debug_event( struct thread *thread, int code, void *arg ); |
Alexandre Julliard | b73421d | 2000-03-30 19:30:24 +0000 | [diff] [blame] | 179 | extern void generate_startup_debug_events( struct process *process, void *entry ); |
Alexandre Julliard | ff81d78 | 2000-03-08 12:01:30 +0000 | [diff] [blame] | 180 | extern void debug_exit_thread( struct thread *thread ); |
Alexandre Julliard | e712e07 | 1999-05-23 19:53:30 +0000 | [diff] [blame] | 181 | |
Alexandre Julliard | c76ad35 | 1999-11-13 19:49:05 +0000 | [diff] [blame] | 182 | /* mapping functions */ |
| 183 | |
| 184 | extern int get_page_size(void); |
| 185 | |
Alexandre Julliard | d7e85d6 | 1999-11-23 19:39:11 +0000 | [diff] [blame] | 186 | /* registry functions */ |
| 187 | |
Alexandre Julliard | 6c8d917 | 2000-08-26 04:40:07 +0000 | [diff] [blame] | 188 | extern void init_registry(void); |
Alexandre Julliard | d7e85d6 | 1999-11-23 19:39:11 +0000 | [diff] [blame] | 189 | extern void close_registry(void); |
| 190 | |
Alexandre Julliard | b849d79 | 2000-02-13 13:56:13 +0000 | [diff] [blame] | 191 | /* atom functions */ |
| 192 | |
| 193 | extern void close_atom_table(void); |
Alexandre Julliard | d8a8c11 | 2001-10-12 18:45:29 +0000 | [diff] [blame] | 194 | extern int grab_global_atom( atom_t atom ); |
| 195 | extern void release_global_atom( atom_t atom ); |
Alexandre Julliard | b849d79 | 2000-02-13 13:56:13 +0000 | [diff] [blame] | 196 | |
Andreas Mohr | c941eff | 2000-09-22 22:37:56 +0000 | [diff] [blame] | 197 | /* global variables */ |
Alexandre Julliard | 2fe5777 | 2000-01-25 01:40:27 +0000 | [diff] [blame] | 198 | |
Andreas Mohr | c941eff | 2000-09-22 22:37:56 +0000 | [diff] [blame] | 199 | /* command-line options */ |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 200 | extern int debug_level; |
Alexandre Julliard | f5e0f0c | 2002-04-03 22:51:18 +0000 | [diff] [blame] | 201 | extern int master_socket_timeout; |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 202 | |
Andreas Mohr | c941eff | 2000-09-22 22:37:56 +0000 | [diff] [blame] | 203 | /* server start time used for GetTickCount() */ |
| 204 | extern unsigned int server_start_ticks; |
| 205 | |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 206 | #endif /* __WINE_SERVER_OBJECT_H */ |