4 * Copyright (C) 1998 Alexandre Julliard
7 #ifndef __WINE_SERVER_OBJECT_H
8 #define __WINE_SERVER_OBJECT_H
10 #ifndef __WINE_SERVER__
11 #error This file can only be used in the Wine server
16 #include "server/request.h"
27 struct wait_queue_entry
;
29 /* operations valid on all objects */
32 /* dump the object (for debugging) */
33 void (*dump
)(struct object
*,int);
34 /* add a thread to the object wait queue */
35 int (*add_queue
)(struct object
*,struct wait_queue_entry
*);
36 /* remove a thread from the object wait queue */
37 void (*remove_queue
)(struct object
*,struct wait_queue_entry
*);
38 /* is object signaled? */
39 int (*signaled
)(struct object
*,struct thread
*);
40 /* wait satisfied; return 1 if abandoned */
41 int (*satisfied
)(struct object
*,struct thread
*);
42 /* return a Unix fd that can be used to read from the object */
43 int (*get_read_fd
)(struct object
*);
44 /* return a Unix fd that can be used to write to the object */
45 int (*get_write_fd
)(struct object
*);
46 /* flush the object buffers */
47 int (*flush
)(struct object
*);
48 /* get file information */
49 int (*get_file_info
)(struct object
*,struct get_file_info_reply
*);
50 /* destroy on refcount == 0 */
51 void (*destroy
)(struct object
*);
56 unsigned int refcount
;
57 const struct object_ops
*ops
;
58 struct wait_queue_entry
*head
;
59 struct wait_queue_entry
*tail
;
60 struct object_name
*name
;
67 extern void *mem_alloc( size_t size
); /* malloc wrapper */
68 extern void *alloc_object( size_t size
, const struct object_ops
*ops
, const char *name
);
69 extern struct object
*create_named_object( const char *name
, const struct object_ops
*ops
,
71 extern int init_object( struct object
*obj
, const struct object_ops
*ops
, const char *name
);
72 extern const char *get_object_name( struct object
*obj
);
73 /* grab/release_object can take any pointer, but you better make sure */
74 /* that the thing pointed to starts with a struct object... */
75 extern struct object
*grab_object( void *obj
);
76 extern void release_object( void *obj
);
77 extern struct object
*find_object( const char *name
);
78 extern int no_add_queue( struct object
*obj
, struct wait_queue_entry
*entry
);
79 extern int no_satisfied( struct object
*obj
, struct thread
*thread
);
80 extern int no_read_fd( struct object
*obj
);
81 extern int no_write_fd( struct object
*obj
);
82 extern int no_flush( struct object
*obj
);
83 extern int no_get_file_info( struct object
*obj
, struct get_file_info_reply
*info
);
84 extern void default_select_event( int event
, void *private );
86 extern void dump_objects(void);
89 /* request handlers */
94 extern void fatal_protocol_error( const char *err
, ... );
95 extern void call_req_handler( struct thread
*thread
, enum request req
,
96 void *data
, int len
, int fd
);
97 extern void call_timeout_handler( void *thread
);
98 extern void call_kill_handler( struct thread
*thread
, int exit_code
);
100 extern void trace_request( enum request req
, void *data
, int len
, int fd
);
101 extern void trace_timeout(void);
102 extern void trace_kill( int exit_code
);
103 extern void trace_reply( struct thread
*thread
, int type
, int pass_fd
,
104 struct iovec
*vec
, int veclen
);
105 /* check that the string is NULL-terminated and that the len is correct */
106 #define CHECK_STRING(func,str,len) \
107 do { if (((str)[(len)-1] || strlen(str) != (len)-1)) \
108 fatal_protocol_error( "%s: invalid string '%.*s'\n", (func), (len), (str) ); \
111 /* select functions */
114 #define WRITE_EVENT 2
118 int fd
; /* user fd */
119 void (*func
)(int event
, void *private); /* callback function */
120 void *private; /* callback private data */
123 extern void register_select_user( struct select_user
*user
);
124 extern void unregister_select_user( struct select_user
*user
);
125 extern void set_select_events( struct select_user
*user
, int events
);
126 extern int check_select_events( struct select_user
*user
, int events
);
127 extern void select_loop(void);
129 /* timeout functions */
133 typedef void (*timeout_callback
)( void *private );
135 extern struct timeout_user
*add_timeout_user( struct timeval
*when
,
136 timeout_callback func
, void *private );
137 extern void remove_timeout_user( struct timeout_user
*user
);
138 extern void make_timeout( struct timeval
*when
, int timeout
);
140 /* socket functions */
144 extern struct client
*add_client( int client_fd
, struct thread
*self
);
145 extern void remove_client( struct client
*client
, int exit_code
);
146 extern int send_reply_v( struct client
*client
, int type
, int pass_fd
,
147 struct iovec
*vec
, int veclen
);
149 /* mutex functions */
151 extern void abandon_mutexes( struct thread
*thread
);
155 extern struct file
*get_file_obj( struct process
*process
, int handle
,
156 unsigned int access
);
157 extern int file_get_mmap_fd( struct file
*file
);
158 extern int grow_file( struct file
*file
, int size_high
, int size_low
);
159 extern struct file
*create_temp_file( int access
);
160 extern void file_set_error(void);
162 /* console functions */
164 extern int alloc_console( struct process
*process
);
165 extern int free_console( struct process
*process
);
167 /* debugger functions */
169 extern int debugger_attach( struct process
*process
, struct thread
*debugger
);
170 extern void debug_exit_thread( struct thread
*thread
, int exit_code
);
172 extern int debug_level
;
174 #endif /* __WINE_SERVER_OBJECT_H */