@@ -58,14 +58,14 @@ void um_mutex_init(struct um_mutex *mutex) {
58
58
mutex -> state = MUTEX_UNLOCKED ;
59
59
}
60
60
61
- void um_mutex_lock (struct um * machine , uint32_t * state ) {
61
+ inline void um_mutex_lock (struct um * machine , uint32_t * state ) {
62
62
while (* state == MUTEX_LOCKED ) {
63
63
um_futex_wait (machine , state , MUTEX_LOCKED );
64
64
}
65
65
* state = MUTEX_LOCKED ;
66
66
}
67
67
68
- void um_mutex_unlock (struct um * machine , uint32_t * state ) {
68
+ inline void um_mutex_unlock (struct um * machine , uint32_t * state ) {
69
69
* state = MUTEX_UNLOCKED ;
70
70
// Wake up 1 waiting fiber
71
71
um_futex_wake (machine , state , 1 );
@@ -88,21 +88,21 @@ VALUE synchronize_ensure(VALUE arg) {
88
88
return Qnil ;
89
89
}
90
90
91
- VALUE um_mutex_synchronize (struct um * machine , uint32_t * state ) {
91
+ inline VALUE um_mutex_synchronize (struct um * machine , uint32_t * state ) {
92
92
struct sync_ctx ctx = { .machine = machine , .state = state };
93
93
return rb_ensure (synchronize_begin , (VALUE )& ctx , synchronize_ensure , (VALUE )& ctx );
94
94
}
95
95
96
96
#define QUEUE_EMPTY 0
97
97
#define QUEUE_READY 1
98
98
99
- void um_queue_init (struct um_queue * queue ) {
99
+ inline void um_queue_init (struct um_queue * queue ) {
100
100
queue -> head = queue -> tail = queue -> free_head = NULL ;
101
101
queue -> state = QUEUE_EMPTY ;
102
102
queue -> count = 0 ;
103
103
}
104
104
105
- void um_queue_free (struct um_queue * queue ) {
105
+ inline void um_queue_free (struct um_queue * queue ) {
106
106
struct um_queue_entry * entry = queue -> head ;
107
107
while (entry ) {
108
108
struct um_queue_entry * next = entry -> next ;
@@ -120,7 +120,7 @@ void um_queue_free(struct um_queue *queue) {
120
120
free (queue );
121
121
}
122
122
123
- void um_queue_mark (struct um_queue * queue ) {
123
+ inline void um_queue_mark (struct um_queue * queue ) {
124
124
rb_gc_mark_movable (queue -> self );
125
125
struct um_queue_entry * entry = queue -> head ;
126
126
while (entry ) {
@@ -129,7 +129,7 @@ void um_queue_mark(struct um_queue *queue) {
129
129
}
130
130
}
131
131
132
- void um_queue_compact (struct um_queue * queue ) {
132
+ inline void um_queue_compact (struct um_queue * queue ) {
133
133
queue -> self = rb_gc_location (queue -> self );
134
134
struct um_queue_entry * entry = queue -> head ;
135
135
while (entry ) {
@@ -138,7 +138,7 @@ void um_queue_compact(struct um_queue *queue) {
138
138
}
139
139
}
140
140
141
- struct um_queue_entry * um_queue_entry_checkout (struct um_queue * queue ) {
141
+ inline struct um_queue_entry * um_queue_entry_checkout (struct um_queue * queue ) {
142
142
struct um_queue_entry * entry = queue -> free_head ;
143
143
if (entry ) {
144
144
queue -> free_head = entry -> next ;
@@ -148,12 +148,12 @@ struct um_queue_entry *um_queue_entry_checkout(struct um_queue *queue) {
148
148
return entry ;
149
149
}
150
150
151
- void um_queue_entry_checkin (struct um_queue * queue , struct um_queue_entry * entry ) {
151
+ inline void um_queue_entry_checkin (struct um_queue * queue , struct um_queue_entry * entry ) {
152
152
entry -> next = queue -> free_head ;
153
153
queue -> free_head = entry ;
154
154
}
155
155
156
- void queue_add_head (struct um_queue * queue , VALUE value ) {
156
+ static inline void queue_add_head (struct um_queue * queue , VALUE value ) {
157
157
struct um_queue_entry * entry = um_queue_entry_checkout (queue );
158
158
159
159
entry -> next = queue -> head ;
@@ -167,7 +167,7 @@ void queue_add_head(struct um_queue *queue, VALUE value) {
167
167
RB_OBJ_WRITE (queue -> self , & entry -> value , value );
168
168
}
169
169
170
- void queue_add_tail (struct um_queue * queue , VALUE value ) {
170
+ static inline void queue_add_tail (struct um_queue * queue , VALUE value ) {
171
171
struct um_queue_entry * entry = um_queue_entry_checkout (queue );
172
172
173
173
entry -> prev = queue -> tail ;
@@ -202,8 +202,10 @@ VALUE queue_remove_tail(struct um_queue *queue) {
202
202
return v ;
203
203
}
204
204
205
- VALUE um_queue_push (struct um * machine , struct um_queue * queue , VALUE value ) {
206
- queue_add_tail (queue , value );
205
+ static inline VALUE um_queue_add (struct um * machine , struct um_queue * queue , VALUE value , int add_head ) {
206
+ if (add_head ) queue_add_head (queue , value );
207
+ else queue_add_tail (queue , value );
208
+
207
209
queue -> count ++ ;
208
210
209
211
queue -> state = QUEUE_READY ;
@@ -212,20 +214,15 @@ VALUE um_queue_push(struct um *machine, struct um_queue *queue, VALUE value) {
212
214
return queue -> self ;
213
215
}
214
216
215
- VALUE um_queue_unshift (struct um * machine , struct um_queue * queue , VALUE value ) {
216
- queue_add_head ( queue , value );
217
- queue -> count ++ ;
217
+ VALUE um_queue_push (struct um * machine , struct um_queue * queue , VALUE value ) {
218
+ return um_queue_add ( machine , queue , value , false );
219
+ }
218
220
219
- queue -> state = QUEUE_READY ;
220
- if (queue -> num_waiters )
221
- um_futex_wake_transient (machine , & queue -> state , 1 );
222
- return queue -> self ;
221
+ VALUE um_queue_unshift (struct um * machine , struct um_queue * queue , VALUE value ) {
222
+ return um_queue_add (machine , queue , value , true);
223
223
}
224
224
225
- enum queue_op {
226
- QUEUE_POP ,
227
- QUEUE_SHIFT
228
- };
225
+ enum queue_op { QUEUE_POP , QUEUE_SHIFT };
229
226
230
227
struct queue_wait_ctx {
231
228
struct um * machine ;
0 commit comments