Allow user APCs with NULL 'func' (just wake up the thread).
[wine] / server / device.c
1 /*
2  * Server-side device management
3  *
4  * Copyright (C) 1999 Alexandre Julliard
5  */
6
7 /*
8  * FIXME:
9  * all this stuff is a simple hack to avoid breaking
10  * client-side device support.
11  */
12
13 #include <assert.h>
14 #include <fcntl.h>
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include <string.h>
18
19 #include "winerror.h"
20 #include "winbase.h"
21 #include "server/thread.h"
22
23 struct device
24 {
25     struct object  obj;             /* object header */
26     int            id;              /* client identifier */
27 };
28
29 static void device_dump( struct object *obj, int verbose );
30 static int device_get_info( struct object *obj, struct get_file_info_reply *reply );
31 static void device_destroy( struct object *obj );
32
33 static const struct object_ops device_ops =
34 {
35     device_dump,
36     no_add_queue,
37     NULL,  /* should never get called */
38     NULL,  /* should never get called */
39     NULL,  /* should never get called */
40     no_read_fd,
41     no_write_fd,
42     no_flush,
43     device_get_info,
44     device_destroy
45 };
46
47 struct object *create_device( int id )
48 {
49     struct device *dev;
50
51     if (!(dev = mem_alloc(sizeof(*dev)))) return NULL;
52     init_object( &dev->obj, &device_ops, NULL );
53     dev->id = id;
54     return &dev->obj;
55 }
56
57 static void device_dump( struct object *obj, int verbose )
58 {
59     struct device *dev = (struct device *)obj;
60     assert( obj->ops == &device_ops );
61     fprintf( stderr, "Device id=%08x\n", dev->id );
62 }
63
64 static int device_get_info( struct object *obj, struct get_file_info_reply *reply )
65 {
66     struct device *dev = (struct device *)obj;
67     assert( obj->ops == &device_ops );
68     memset( reply, 0, sizeof(*reply) );
69     reply->type = FILE_TYPE_UNKNOWN;
70     reply->attr = dev->id;  /* hack! */
71     return 1;
72 }
73
74 static void device_destroy( struct object *obj )
75 {
76     struct device *dev = (struct device *)obj;
77     assert( obj->ops == &device_ops );
78     free( dev );
79 }