/* * Wine server objects * * Copyright (C) 1998 Alexandre Julliard * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef __WINE_SERVER_OBJECT_H #define __WINE_SERVER_OBJECT_H #ifdef HAVE_SYS_POLL_H #include #endif #include #include "wine/server_protocol.h" #include "wine/list.h" #define DEBUG_OBJECTS /* kernel objects */ struct namespace; struct object; struct object_name; struct thread; struct process; struct token; struct file; struct wait_queue_entry; struct async; struct async_queue; /* operations valid on all objects */ struct object_ops { /* size of this object type */ size_t size; /* dump the object (for debugging) */ void (*dump)(struct object *,int); /* add a thread to the object wait queue */ int (*add_queue)(struct object *,struct wait_queue_entry *); /* remove a thread from the object wait queue */ void (*remove_queue)(struct object *,struct wait_queue_entry *); /* is object signaled? */ int (*signaled)(struct object *,struct thread *); /* wait satisfied; return 1 if abandoned */ int (*satisfied)(struct object *,struct thread *); /* return an fd object that can be used to read/write from the object */ struct fd *(*get_fd)(struct object *); /* destroy on refcount == 0 */ void (*destroy)(struct object *); }; struct object { unsigned int refcount; /* reference count */ const struct object_ops *ops; struct list wait_queue; struct object_name *name; #ifdef DEBUG_OBJECTS struct list obj_list; #endif }; struct wait_queue_entry { struct list entry; struct object *obj; struct thread *thread; }; extern void *mem_alloc( size_t size ); /* malloc wrapper */ extern void *memdup( const void *data, size_t len ); extern void *alloc_object( const struct object_ops *ops ); extern void dump_object_name( struct object *obj ); extern void *create_named_object( struct namespace *namespace, const struct object_ops *ops, const WCHAR *name, size_t len ); extern struct namespace *create_namespace( unsigned int hash_size, int case_sensitive ); /* grab/release_object can take any pointer, but you better make sure */ /* that the thing pointed to starts with a struct object... */ extern struct object *grab_object( void *obj ); extern void release_object( void *obj ); extern struct object *find_object( const struct namespace *namespace, const WCHAR *name, size_t len ); extern int no_add_queue( struct object *obj, struct wait_queue_entry *entry ); extern int no_satisfied( struct object *obj, struct thread *thread ); extern struct fd *no_get_fd( struct object *obj ); extern void no_destroy( struct object *obj ); #ifdef DEBUG_OBJECTS extern void dump_objects(void); #endif /* event functions */ struct event; extern struct event *create_event( const WCHAR *name, size_t len, int manual_reset, int initial_state ); extern struct event *get_event_obj( struct process *process, obj_handle_t handle, unsigned int access ); extern void pulse_event( struct event *event ); extern void set_event( struct event *event ); extern void reset_event( struct event *event ); /* mutex functions */ extern void abandon_mutexes( struct thread *thread ); /* serial functions */ int get_serial_async_timeout(struct object *obj, int type, int count); /* socket functions */ extern void sock_init(void); /* debugger functions */ extern int set_process_debugger( struct process *process, struct thread *debugger ); extern void generate_debug_event( struct thread *thread, int code, void *arg ); extern void generate_startup_debug_events( struct process *process, void *entry ); extern void debug_exit_thread( struct thread *thread ); /* mapping functions */ extern int get_page_size(void); /* registry functions */ extern void init_registry(void); extern void flush_registry(void); extern void close_registry(void); extern void registry_close_handle( struct object *obj, obj_handle_t hkey ); /* signal functions */ extern void init_signals(void); extern void close_signals(void); /* token functions */ extern struct token *create_admin_token(void); /* atom functions */ extern void close_atom_table(void); extern int grab_global_atom( atom_t atom ); extern void release_global_atom( atom_t atom ); /* global variables */ /* command-line options */ extern int debug_level; extern int master_socket_timeout; extern int foreground; extern const char *server_argv0; /* server start time used for GetTickCount() */ extern unsigned int server_start_ticks; /* name space for synchronization objects */ extern struct namespace *sync_namespace; #endif /* __WINE_SERVER_OBJECT_H */