Skip to content

Commit 5598397

Browse files
committed
Small refactor to um_sync code
1 parent a55d22f commit 5598397

File tree

2 files changed

+22
-26
lines changed

2 files changed

+22
-26
lines changed

TODO.md

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
- splice / - tee
22
- sendto
33
- recvfrom
4-
- poll
4+
- poll_add / poll_remove / poll_multishot / poll_update
55
- open / openat
66
- fsync
77
- mkdir / mkdirat
@@ -13,5 +13,4 @@
1313
- madvise
1414
- getxattr / setxattr
1515
- shutdown
16-
1716
- send_bundle / recv_bundle (kernel >= 6.10)

ext/um/um_sync.c

+21-24
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,14 @@ void um_mutex_init(struct um_mutex *mutex) {
5858
mutex->state = MUTEX_UNLOCKED;
5959
}
6060

61-
void um_mutex_lock(struct um *machine, uint32_t *state) {
61+
inline void um_mutex_lock(struct um *machine, uint32_t *state) {
6262
while (*state == MUTEX_LOCKED) {
6363
um_futex_wait(machine, state, MUTEX_LOCKED);
6464
}
6565
*state = MUTEX_LOCKED;
6666
}
6767

68-
void um_mutex_unlock(struct um *machine, uint32_t *state) {
68+
inline void um_mutex_unlock(struct um *machine, uint32_t *state) {
6969
*state = MUTEX_UNLOCKED;
7070
// Wake up 1 waiting fiber
7171
um_futex_wake(machine, state, 1);
@@ -88,21 +88,21 @@ VALUE synchronize_ensure(VALUE arg) {
8888
return Qnil;
8989
}
9090

91-
VALUE um_mutex_synchronize(struct um *machine, uint32_t *state) {
91+
inline VALUE um_mutex_synchronize(struct um *machine, uint32_t *state) {
9292
struct sync_ctx ctx = { .machine = machine, .state = state };
9393
return rb_ensure(synchronize_begin, (VALUE)&ctx, synchronize_ensure, (VALUE)&ctx);
9494
}
9595

9696
#define QUEUE_EMPTY 0
9797
#define QUEUE_READY 1
9898

99-
void um_queue_init(struct um_queue *queue) {
99+
inline void um_queue_init(struct um_queue *queue) {
100100
queue->head = queue->tail = queue->free_head = NULL;
101101
queue->state = QUEUE_EMPTY;
102102
queue->count = 0;
103103
}
104104

105-
void um_queue_free(struct um_queue *queue) {
105+
inline void um_queue_free(struct um_queue *queue) {
106106
struct um_queue_entry *entry = queue->head;
107107
while (entry) {
108108
struct um_queue_entry *next = entry->next;
@@ -120,7 +120,7 @@ void um_queue_free(struct um_queue *queue) {
120120
free(queue);
121121
}
122122

123-
void um_queue_mark(struct um_queue *queue) {
123+
inline void um_queue_mark(struct um_queue *queue) {
124124
rb_gc_mark_movable(queue->self);
125125
struct um_queue_entry *entry = queue->head;
126126
while (entry) {
@@ -129,7 +129,7 @@ void um_queue_mark(struct um_queue *queue) {
129129
}
130130
}
131131

132-
void um_queue_compact(struct um_queue *queue) {
132+
inline void um_queue_compact(struct um_queue *queue) {
133133
queue->self = rb_gc_location(queue->self);
134134
struct um_queue_entry *entry = queue->head;
135135
while (entry) {
@@ -138,7 +138,7 @@ void um_queue_compact(struct um_queue *queue) {
138138
}
139139
}
140140

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) {
142142
struct um_queue_entry *entry = queue->free_head;
143143
if (entry) {
144144
queue->free_head = entry->next;
@@ -148,12 +148,12 @@ struct um_queue_entry *um_queue_entry_checkout(struct um_queue *queue) {
148148
return entry;
149149
}
150150

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) {
152152
entry->next = queue->free_head;
153153
queue->free_head = entry;
154154
}
155155

156-
void queue_add_head(struct um_queue *queue, VALUE value) {
156+
static inline void queue_add_head(struct um_queue *queue, VALUE value) {
157157
struct um_queue_entry *entry = um_queue_entry_checkout(queue);
158158

159159
entry->next = queue->head;
@@ -167,7 +167,7 @@ void queue_add_head(struct um_queue *queue, VALUE value) {
167167
RB_OBJ_WRITE(queue->self, &entry->value, value);
168168
}
169169

170-
void queue_add_tail(struct um_queue *queue, VALUE value) {
170+
static inline void queue_add_tail(struct um_queue *queue, VALUE value) {
171171
struct um_queue_entry *entry = um_queue_entry_checkout(queue);
172172

173173
entry->prev = queue->tail;
@@ -202,8 +202,10 @@ VALUE queue_remove_tail(struct um_queue *queue) {
202202
return v;
203203
}
204204

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+
207209
queue->count++;
208210

209211
queue->state = QUEUE_READY;
@@ -212,20 +214,15 @@ VALUE um_queue_push(struct um *machine, struct um_queue *queue, VALUE value) {
212214
return queue->self;
213215
}
214216

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+
}
218220

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);
223223
}
224224

225-
enum queue_op {
226-
QUEUE_POP,
227-
QUEUE_SHIFT
228-
};
225+
enum queue_op { QUEUE_POP, QUEUE_SHIFT };
229226

230227
struct queue_wait_ctx {
231228
struct um *machine;

0 commit comments

Comments
 (0)