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;