3 * These are the server equivalent of K32OBJ
5 * Copyright (C) 1998 Alexandre Julliard
15 #include "server/thread.h"
21 struct object_name *next;
27 #define NAME_HASH_SIZE 37
29 static struct object_name *names[NAME_HASH_SIZE];
31 /*****************************************************************/
33 void *mem_alloc( size_t size )
35 void *ptr = malloc( size );
36 if (ptr) memset( ptr, 0x55, size );
37 else if (current) SET_ERROR( ERROR_OUTOFMEMORY );
41 /*****************************************************************/
43 static int get_name_hash( const char *name )
46 while (*name) hash ^= *name++;
47 return hash % NAME_HASH_SIZE;
50 static struct object_name *add_name( struct object *obj, const char *name )
52 struct object_name *ptr;
53 int hash = get_name_hash( name );
54 int len = strlen( name );
56 if (!(ptr = (struct object_name *)mem_alloc( sizeof(*ptr) + len )))
58 ptr->next = names[hash];
61 strcpy( ptr->name, name );
66 static void free_name( struct object *obj )
68 int hash = get_name_hash( obj->name->name );
69 struct object_name **pptr = &names[hash];
70 while (*pptr && *pptr != obj->name) pptr = &(*pptr)->next;
72 *pptr = (*pptr)->next;
76 /* initialize an already allocated object */
77 /* return 1 if OK, 0 on error */
78 int init_object( struct object *obj, const struct object_ops *ops,
85 if (!name) obj->name = NULL;
86 else if (!(obj->name = add_name( obj, name ))) return 0;
90 struct object *create_named_object( const char *name, const struct object_ops *ops, size_t size )
93 if ((obj = find_object( name )))
97 SET_ERROR( ERROR_ALREADY_EXISTS );
100 SET_ERROR( ERROR_INVALID_HANDLE );
103 if (!(obj = mem_alloc( size ))) return NULL;
104 if (!init_object( obj, ops, name ))
113 /* return a pointer to the object name, or to an empty string */
114 const char *get_object_name( struct object *obj )
116 if (!obj->name) return "";
117 return obj->name->name;
120 /* grab an object (i.e. increment its refcount) and return the object */
121 struct object *grab_object( void *ptr )
123 struct object *obj = (struct object *)ptr;
124 assert( obj->refcount < INT_MAX );
129 /* release an object (i.e. decrement its refcount) */
130 void release_object( void *ptr )
132 struct object *obj = (struct object *)ptr;
133 assert( obj->refcount );
134 if (!--obj->refcount)
136 /* if the refcount is 0, nobody can be in the wait queue */
137 assert( !obj->head );
138 assert( !obj->tail );
139 if (obj->name) free_name( obj );
140 obj->ops->destroy( obj );
144 /* find an object by its name; the refcount is incremented */
145 struct object *find_object( const char *name )
147 struct object_name *ptr;
148 if (!name) return NULL;
149 ptr = names[ get_name_hash( name ) ];
150 while (ptr && strcmp( ptr->name, name )) ptr = ptr->next;
151 if (!ptr) return NULL;
152 return grab_object( ptr->obj );
155 /* functions for unimplemented object operations */
157 int no_add_queue( struct object *obj, struct wait_queue_entry *entry )
159 SET_ERROR( ERROR_INVALID_HANDLE );
163 int no_satisfied( struct object *obj, struct thread *thread )
165 return 0; /* not abandoned */
168 int no_read_fd( struct object *obj )
170 SET_ERROR( ERROR_INVALID_HANDLE );
174 int no_write_fd( struct object *obj )
176 SET_ERROR( ERROR_INVALID_HANDLE );
180 int no_flush( struct object *obj )
182 SET_ERROR( ERROR_INVALID_HANDLE );
186 int no_get_file_info( struct object *obj, struct get_file_info_reply *info )
188 SET_ERROR( ERROR_INVALID_HANDLE );
192 void default_select_event( int fd, int event, void *private )
194 struct object *obj = (struct object *)private;