1
+ /*
2
+ This is intended to be a low-level binding to libuv that very closely mimics
3
+ the C libuv API. Does very little right now pending scheduler improvements.
4
+ */
5
+
6
+ #[ cfg( target_os = "linux" ) ] ;
7
+ #[ cfg( target_os = "macos" ) ] ;
8
+
9
+ export sanity_check;
10
+ export loop_t, idle_t;
11
+ export loop_new, loop_delete, default_loop, run, unref;
12
+ export idle_init, idle_start;
13
+ export idle_new;
14
+
15
+ #[ link_name = "rustrt" ]
16
+ native mod uv {
17
+ fn rust_uv_loop_new ( ) -> * loop_t ;
18
+ fn rust_uv_loop_delete ( loop : * loop_t ) ;
19
+ fn rust_uv_default_loop ( ) -> * loop_t ;
20
+ fn rust_uv_run ( loop : * loop_t ) -> ctypes:: c_int ;
21
+ fn rust_uv_unref ( loop : * loop_t ) ;
22
+ fn rust_uv_idle_init ( loop : * loop_t , idle : * idle_t ) -> ctypes:: c_int ;
23
+ fn rust_uv_idle_start ( idle : * idle_t , cb : idle_cb ) -> ctypes:: c_int ;
24
+ }
25
+
26
+ #[ link_name = "rustrt" ]
27
+ native mod helpers {
28
+ fn rust_uv_size_of_idle_t ( ) -> ctypes:: size_t ;
29
+ }
30
+
31
+ type opaque_cb = * ctypes:: void ;
32
+
33
+ type handle_type = ctypes:: enum ;
34
+
35
+ type close_cb = opaque_cb ;
36
+ type idle_cb = opaque_cb ;
37
+
38
+ #[ cfg( target_os = "linux" ) ]
39
+ #[ cfg( target_os = "macos" ) ]
40
+ type handle_private_fields = {
41
+ a00 : ctypes:: c_int ,
42
+ a01 : ctypes:: c_int ,
43
+ a02 : ctypes:: c_int ,
44
+ a03 : ctypes:: c_int ,
45
+ a04 : ctypes:: c_int ,
46
+ a05 : ctypes:: c_int ,
47
+ a06 : int ,
48
+ a07 : int ,
49
+ a08 : int ,
50
+ a09 : int ,
51
+ a10 : int ,
52
+ a11 : int ,
53
+ a12 : int
54
+ } ;
55
+
56
+ type handle_fields = {
57
+ loop : * loop_t ,
58
+ type_ : handle_type ,
59
+ close_cb : close_cb ,
60
+ data : * ctypes:: void ,
61
+ private : handle_private_fields
62
+ } ;
63
+
64
+ type handle_t = {
65
+ fields : handle_fields
66
+ } ;
67
+
68
+ type loop_t = int ;
69
+
70
+
71
+
72
+
73
+ type idle_t = {
74
+ fields : handle_fields
75
+ /* private: idle_private_fields */
76
+ } ;
77
+
78
+ fn idle_init ( loop : * loop_t , idle : * idle_t ) -> ctypes:: c_int {
79
+ uv:: rust_uv_idle_init ( loop , idle)
80
+ }
81
+
82
+ fn idle_start ( idle : * idle_t , cb : idle_cb ) -> ctypes:: c_int {
83
+ uv:: rust_uv_idle_start ( idle, cb)
84
+ }
85
+
86
+
87
+
88
+
89
+ fn default_loop ( ) -> * loop_t {
90
+ uv:: rust_uv_default_loop ( )
91
+ }
92
+
93
+ fn loop_new ( ) -> * loop_t {
94
+ uv:: rust_uv_loop_new ( )
95
+ }
96
+
97
+ fn loop_delete ( loop : * loop_t ) {
98
+ uv:: rust_uv_loop_delete ( loop )
99
+ }
100
+
101
+ fn run ( loop : * loop_t ) -> ctypes:: c_int {
102
+ uv:: rust_uv_run ( loop )
103
+ }
104
+
105
+ fn unref ( loop : * loop_t ) {
106
+ uv:: rust_uv_unref ( loop )
107
+ }
108
+
109
+
110
+ fn sanity_check ( ) {
111
+ fn check_size ( t : str , uv : ctypes:: size_t , rust : ctypes:: size_t ) {
112
+ log #fmt( "size of %s: uv: %u, rust: %u" , t, uv, rust) ;
113
+ assert uv == rust;
114
+ }
115
+ check_size ( "idle_t" ,
116
+ helpers:: rust_uv_size_of_idle_t ( ) ,
117
+ sys:: size_of :: < idle_t > ( ) ) ;
118
+ }
119
+
120
+ #[ cfg( target_os = "linux" ) ]
121
+ #[ cfg( target_os = "macos" ) ]
122
+ fn handle_fields_new ( ) -> handle_fields {
123
+ {
124
+ loop : ptr:: null ( ) ,
125
+ type_: 0u32 ,
126
+ close_cb: ptr:: null ( ) ,
127
+ data: ptr:: null ( ) ,
128
+ private : {
129
+ a00 : 0i32 ,
130
+ a01 : 0i32 ,
131
+ a02 : 0i32 ,
132
+ a03 : 0i32 ,
133
+ a04 : 0i32 ,
134
+ a05 : 0i32 ,
135
+ a06 : 0 ,
136
+ a07 : 0 ,
137
+ a08 : 0 ,
138
+ a09 : 0 ,
139
+ a10 : 0 ,
140
+ a11 : 0 ,
141
+ a12 : 0
142
+ }
143
+ }
144
+ }
145
+
146
+ fn idle_new ( ) -> idle_t {
147
+ {
148
+ fields: handle_fields_new ( )
149
+ }
150
+ }
0 commit comments