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 | |
Steven Edwards | 037c8a1 | 2003-02-11 22:27:13 +0000 | [diff] [blame] | 24 | #ifdef HAVE_SYS_POLL_H |
Alexandre Julliard | 247b8ae | 1999-12-13 00:16:44 +0000 | [diff] [blame] | 25 | #include <sys/poll.h> |
Steven Edwards | 037c8a1 | 2003-02-11 22:27:13 +0000 | [diff] [blame] | 26 | #endif |
| 27 | |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 28 | #include <sys/time.h> |
Alexandre Julliard | 37ec927 | 2001-07-19 00:35:37 +0000 | [diff] [blame] | 29 | #include "wine/server_protocol.h" |
Alexandre Julliard | ef5f6c7 | 2003-09-11 20:45:17 +0000 | [diff] [blame] | 30 | #include "wine/list.h" |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 31 | |
Alexandre Julliard | 1bdd154 | 1999-06-04 19:47:04 +0000 | [diff] [blame] | 32 | #define DEBUG_OBJECTS |
| 33 | |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 34 | /* kernel objects */ |
| 35 | |
Alexandre Julliard | 526a28d | 2002-10-02 23:49:30 +0000 | [diff] [blame] | 36 | struct namespace; |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 37 | struct object; |
| 38 | struct object_name; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 39 | struct thread; |
Alexandre Julliard | fdc92ba | 1999-02-14 18:03:15 +0000 | [diff] [blame] | 40 | struct process; |
Mike McCormack | 36cd6f5 | 2003-07-24 00:07:00 +0000 | [diff] [blame] | 41 | struct token; |
Alexandre Julliard | a8b8d9c | 1999-01-01 16:59:27 +0000 | [diff] [blame] | 42 | struct file; |
Alexandre Julliard | c6e45ed | 1998-12-27 08:35:39 +0000 | [diff] [blame] | 43 | struct wait_queue_entry; |
Mike McCormack | 1eac191 | 2000-11-13 19:27:21 +0000 | [diff] [blame] | 44 | struct async; |
Mike McCormack | 6f011c0 | 2001-12-20 00:07:05 +0000 | [diff] [blame] | 45 | struct async_queue; |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 46 | |
Alexandre Julliard | 0562539 | 1999-01-03 11:55:56 +0000 | [diff] [blame] | 47 | /* operations valid on all objects */ |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 48 | struct object_ops |
| 49 | { |
Alexandre Julliard | 5bc7808 | 1999-06-22 17:26:53 +0000 | [diff] [blame] | 50 | /* size of this object type */ |
| 51 | size_t size; |
Alexandre Julliard | c6e45ed | 1998-12-27 08:35:39 +0000 | [diff] [blame] | 52 | /* dump the object (for debugging) */ |
| 53 | void (*dump)(struct object *,int); |
| 54 | /* add a thread to the object wait queue */ |
Alexandre Julliard | a8b8d9c | 1999-01-01 16:59:27 +0000 | [diff] [blame] | 55 | int (*add_queue)(struct object *,struct wait_queue_entry *); |
Alexandre Julliard | c6e45ed | 1998-12-27 08:35:39 +0000 | [diff] [blame] | 56 | /* remove a thread from the object wait queue */ |
| 57 | void (*remove_queue)(struct object *,struct wait_queue_entry *); |
| 58 | /* is object signaled? */ |
| 59 | int (*signaled)(struct object *,struct thread *); |
| 60 | /* wait satisfied; return 1 if abandoned */ |
| 61 | int (*satisfied)(struct object *,struct thread *); |
Alexandre Julliard | 863637b | 2003-01-30 00:26:44 +0000 | [diff] [blame] | 62 | /* return an fd object that can be used to read/write from the object */ |
| 63 | struct fd *(*get_fd)(struct object *); |
Alexandre Julliard | c6e45ed | 1998-12-27 08:35:39 +0000 | [diff] [blame] | 64 | /* destroy on refcount == 0 */ |
| 65 | void (*destroy)(struct object *); |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 66 | }; |
| 67 | |
| 68 | struct object |
| 69 | { |
Alexandre Julliard | 1dca5e2 | 2000-01-01 00:56:27 +0000 | [diff] [blame] | 70 | unsigned int refcount; /* reference count */ |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 71 | const struct object_ops *ops; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 72 | struct wait_queue_entry *head; |
| 73 | struct wait_queue_entry *tail; |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 74 | struct object_name *name; |
Alexandre Julliard | 1bdd154 | 1999-06-04 19:47:04 +0000 | [diff] [blame] | 75 | #ifdef DEBUG_OBJECTS |
Alexandre Julliard | 526a28d | 2002-10-02 23:49:30 +0000 | [diff] [blame] | 76 | struct list obj_list; |
Alexandre Julliard | 1bdd154 | 1999-06-04 19:47:04 +0000 | [diff] [blame] | 77 | #endif |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 78 | }; |
| 79 | |
Alexandre Julliard | c5e433a | 2000-05-30 19:48:18 +0000 | [diff] [blame] | 80 | struct wait_queue_entry |
| 81 | { |
| 82 | struct wait_queue_entry *next; |
| 83 | struct wait_queue_entry *prev; |
| 84 | struct object *obj; |
| 85 | struct thread *thread; |
| 86 | }; |
| 87 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 88 | extern void *mem_alloc( size_t size ); /* malloc wrapper */ |
Alexandre Julliard | d7e85d6 | 1999-11-23 19:39:11 +0000 | [diff] [blame] | 89 | extern void *memdup( const void *data, size_t len ); |
Alexandre Julliard | e66207e | 2003-02-19 00:33:32 +0000 | [diff] [blame] | 90 | extern void *alloc_object( const struct object_ops *ops ); |
Alexandre Julliard | d16319c | 1999-11-25 21:30:24 +0000 | [diff] [blame] | 91 | extern void dump_object_name( struct object *obj ); |
Alexandre Julliard | 526a28d | 2002-10-02 23:49:30 +0000 | [diff] [blame] | 92 | extern void *create_named_object( struct namespace *namespace, const struct object_ops *ops, |
| 93 | const WCHAR *name, size_t len ); |
| 94 | extern struct namespace *create_namespace( unsigned int hash_size, int case_sensitive ); |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 95 | /* grab/release_object can take any pointer, but you better make sure */ |
| 96 | /* that the thing pointed to starts with a struct object... */ |
| 97 | extern struct object *grab_object( void *obj ); |
| 98 | extern void release_object( void *obj ); |
Alexandre Julliard | 526a28d | 2002-10-02 23:49:30 +0000 | [diff] [blame] | 99 | extern struct object *find_object( const struct namespace *namespace, const WCHAR *name, size_t len ); |
Alexandre Julliard | a8b8d9c | 1999-01-01 16:59:27 +0000 | [diff] [blame] | 100 | 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] | 101 | extern int no_satisfied( struct object *obj, struct thread *thread ); |
Alexandre Julliard | 863637b | 2003-01-30 00:26:44 +0000 | [diff] [blame] | 102 | extern struct fd *no_get_fd( struct object *obj ); |
Alexandre Julliard | 5bc7808 | 1999-06-22 17:26:53 +0000 | [diff] [blame] | 103 | extern void no_destroy( struct object *obj ); |
Alexandre Julliard | 1bdd154 | 1999-06-04 19:47:04 +0000 | [diff] [blame] | 104 | #ifdef DEBUG_OBJECTS |
| 105 | extern void dump_objects(void); |
| 106 | #endif |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 107 | |
Alexandre Julliard | d6d994f | 1999-09-28 16:40:07 +0000 | [diff] [blame] | 108 | /* event functions */ |
| 109 | |
| 110 | struct event; |
| 111 | |
Alexandre Julliard | 6a72dc5 | 2000-04-14 13:42:00 +0000 | [diff] [blame] | 112 | extern struct event *create_event( const WCHAR *name, size_t len, |
| 113 | int manual_reset, int initial_state ); |
Alexandre Julliard | 5188574 | 2002-05-30 20:12:58 +0000 | [diff] [blame] | 114 | extern struct event *get_event_obj( struct process *process, obj_handle_t handle, unsigned int access ); |
Alexandre Julliard | d6d994f | 1999-09-28 16:40:07 +0000 | [diff] [blame] | 115 | extern void pulse_event( struct event *event ); |
| 116 | extern void set_event( struct event *event ); |
| 117 | extern void reset_event( struct event *event ); |
| 118 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 119 | /* mutex functions */ |
| 120 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 121 | extern void abandon_mutexes( struct thread *thread ); |
| 122 | |
Mike McCormack | 1eac191 | 2000-11-13 19:27:21 +0000 | [diff] [blame] | 123 | /* serial functions */ |
| 124 | |
Michael McCormack | 1c32a46 | 2001-03-22 20:09:34 +0000 | [diff] [blame] | 125 | int get_serial_async_timeout(struct object *obj, int type, int count); |
Mike McCormack | 1eac191 | 2000-11-13 19:27:21 +0000 | [diff] [blame] | 126 | |
Martin Wilck | 15a0f0e | 2002-07-03 21:04:09 +0000 | [diff] [blame] | 127 | /* socket functions */ |
| 128 | |
| 129 | extern void sock_init(void); |
| 130 | |
Alexandre Julliard | e712e07 | 1999-05-23 19:53:30 +0000 | [diff] [blame] | 131 | /* debugger functions */ |
| 132 | |
Alexandre Julliard | ea0d028 | 2000-03-10 22:16:10 +0000 | [diff] [blame] | 133 | extern int set_process_debugger( struct process *process, struct thread *debugger ); |
Alexandre Julliard | 05f0b71 | 2000-03-09 18:18:41 +0000 | [diff] [blame] | 134 | extern void generate_debug_event( struct thread *thread, int code, void *arg ); |
Alexandre Julliard | b73421d | 2000-03-30 19:30:24 +0000 | [diff] [blame] | 135 | extern void generate_startup_debug_events( struct process *process, void *entry ); |
Alexandre Julliard | ff81d78 | 2000-03-08 12:01:30 +0000 | [diff] [blame] | 136 | extern void debug_exit_thread( struct thread *thread ); |
Alexandre Julliard | e712e07 | 1999-05-23 19:53:30 +0000 | [diff] [blame] | 137 | |
Alexandre Julliard | c76ad35 | 1999-11-13 19:49:05 +0000 | [diff] [blame] | 138 | /* mapping functions */ |
| 139 | |
| 140 | extern int get_page_size(void); |
| 141 | |
Alexandre Julliard | d7e85d6 | 1999-11-23 19:39:11 +0000 | [diff] [blame] | 142 | /* registry functions */ |
| 143 | |
Alexandre Julliard | 6c8d917 | 2000-08-26 04:40:07 +0000 | [diff] [blame] | 144 | extern void init_registry(void); |
Alexandre Julliard | 88e4261 | 2002-06-20 23:18:56 +0000 | [diff] [blame] | 145 | extern void flush_registry(void); |
Alexandre Julliard | d7e85d6 | 1999-11-23 19:39:11 +0000 | [diff] [blame] | 146 | extern void close_registry(void); |
Mike McCormack | 11f4b44 | 2002-11-25 02:47:32 +0000 | [diff] [blame] | 147 | extern void registry_close_handle( struct object *obj, obj_handle_t hkey ); |
Alexandre Julliard | d7e85d6 | 1999-11-23 19:39:11 +0000 | [diff] [blame] | 148 | |
Alexandre Julliard | 9037f4b | 2003-03-26 01:32:18 +0000 | [diff] [blame] | 149 | /* signal functions */ |
| 150 | |
| 151 | extern void init_signals(void); |
| 152 | extern void close_signals(void); |
| 153 | |
Mike McCormack | 36cd6f5 | 2003-07-24 00:07:00 +0000 | [diff] [blame] | 154 | /* token functions */ |
| 155 | |
| 156 | extern struct token *create_token(void); |
| 157 | |
Alexandre Julliard | b849d79 | 2000-02-13 13:56:13 +0000 | [diff] [blame] | 158 | /* atom functions */ |
| 159 | |
| 160 | extern void close_atom_table(void); |
Alexandre Julliard | d8a8c11 | 2001-10-12 18:45:29 +0000 | [diff] [blame] | 161 | extern int grab_global_atom( atom_t atom ); |
| 162 | extern void release_global_atom( atom_t atom ); |
Alexandre Julliard | b849d79 | 2000-02-13 13:56:13 +0000 | [diff] [blame] | 163 | |
Andreas Mohr | c941eff | 2000-09-22 22:37:56 +0000 | [diff] [blame] | 164 | /* global variables */ |
Alexandre Julliard | 2fe5777 | 2000-01-25 01:40:27 +0000 | [diff] [blame] | 165 | |
Andreas Mohr | c941eff | 2000-09-22 22:37:56 +0000 | [diff] [blame] | 166 | /* command-line options */ |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 167 | extern int debug_level; |
Alexandre Julliard | f5e0f0c | 2002-04-03 22:51:18 +0000 | [diff] [blame] | 168 | extern int master_socket_timeout; |
Alexandre Julliard | 7ad5be9 | 2003-03-14 04:08:42 +0000 | [diff] [blame] | 169 | extern int foreground; |
Alexandre Julliard | 88e4261 | 2002-06-20 23:18:56 +0000 | [diff] [blame] | 170 | extern const char *server_argv0; |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 171 | |
Andreas Mohr | c941eff | 2000-09-22 22:37:56 +0000 | [diff] [blame] | 172 | /* server start time used for GetTickCount() */ |
| 173 | extern unsigned int server_start_ticks; |
| 174 | |
Alexandre Julliard | 526a28d | 2002-10-02 23:49:30 +0000 | [diff] [blame] | 175 | /* name space for synchronization objects */ |
| 176 | extern struct namespace *sync_namespace; |
| 177 | |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 178 | #endif /* __WINE_SERVER_OBJECT_H */ |