29
29
#include "py/pairheap.h"
30
30
#include "py/mphal.h"
31
31
32
- #if !(defined(__unix__ ) || defined(__APPLE__ ))
32
+ #if CIRCUITPY && !(defined(__unix__ ) || defined(__APPLE__ ))
33
33
#include "shared-bindings/supervisor/__init__.h"
34
34
#endif
35
35
@@ -63,11 +63,12 @@ STATIC const mp_obj_type_t task_queue_type;
63
63
STATIC const mp_obj_type_t task_type ;
64
64
65
65
STATIC mp_obj_t task_queue_make_new (const mp_obj_type_t * type , size_t n_args , size_t n_kw , const mp_obj_t * args );
66
+ STATIC mp_obj_t task_getiter (mp_obj_t self_in , mp_obj_iter_buf_t * iter_buf );
66
67
67
68
/******************************************************************************/
68
69
// Ticks for task ordering in pairing heap
69
70
70
- #if (defined(__unix__ ) || defined(__APPLE__ ))
71
+ #if ! CIRCUITPY || (defined(__unix__ ) || defined(__APPLE__ ))
71
72
STATIC mp_obj_t ticks (void ) {
72
73
return MP_OBJ_NEW_SMALL_INT (mp_hal_ticks_ms () & (MICROPY_PY_UTIME_TICKS_PERIOD - 1 ));
73
74
}
@@ -244,35 +245,6 @@ STATIC mp_obj_t task_cancel(mp_obj_t self_in) {
244
245
}
245
246
STATIC MP_DEFINE_CONST_FUN_OBJ_1 (task_cancel_obj , task_cancel );
246
247
247
- STATIC mp_obj_t task_getiter (mp_obj_t self_in , mp_obj_iter_buf_t * iter_buf ) {
248
- (void )iter_buf ;
249
- mp_obj_task_t * self = MP_OBJ_TO_PTR (self_in );
250
- if (TASK_IS_DONE (self )) {
251
- // Signal that the completed-task has been await'ed on.
252
- self -> state = TASK_STATE_DONE_WAS_WAITED_ON ;
253
- } else if (self -> state == TASK_STATE_RUNNING_NOT_WAITED_ON ) {
254
- // Allocate the waiting queue.
255
- self -> state = task_queue_make_new (& task_queue_type , 0 , 0 , NULL );
256
- }
257
- return self_in ;
258
- }
259
-
260
- STATIC mp_obj_t task_iternext (mp_obj_t self_in ) {
261
- mp_obj_task_t * self = MP_OBJ_TO_PTR (self_in );
262
- if (TASK_IS_DONE (self )) {
263
- // Task finished, raise return value to caller so it can continue.
264
- nlr_raise (self -> data );
265
- } else {
266
- // Put calling task on waiting queue.
267
- mp_obj_t cur_task = mp_obj_dict_get (uasyncio_context , MP_OBJ_NEW_QSTR (MP_QSTR_cur_task ));
268
- mp_obj_t args [2 ] = { self -> state , cur_task };
269
- task_queue_push_sorted (2 , args );
270
- // Set calling task's data to this task that it waits on, to double-link it.
271
- ((mp_obj_task_t * )MP_OBJ_TO_PTR (cur_task ))-> data = self_in ;
272
- }
273
- return mp_const_none ;
274
- }
275
-
276
248
STATIC mp_obj_t task_await (mp_obj_t self_in ) {
277
249
return task_getiter (self_in , NULL );
278
250
}
@@ -300,7 +272,6 @@ STATIC void task_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
300
272
dest [0 ] = MP_OBJ_FROM_PTR (& task_await_obj );
301
273
dest [1 ] = self_in ;
302
274
}
303
-
304
275
} else if (dest [1 ] != MP_OBJ_NULL ) {
305
276
// Store
306
277
if (attr == MP_QSTR_data ) {
@@ -313,6 +284,35 @@ STATIC void task_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
313
284
}
314
285
}
315
286
287
+ STATIC mp_obj_t task_getiter (mp_obj_t self_in , mp_obj_iter_buf_t * iter_buf ) {
288
+ (void )iter_buf ;
289
+ mp_obj_task_t * self = MP_OBJ_TO_PTR (self_in );
290
+ if (TASK_IS_DONE (self )) {
291
+ // Signal that the completed-task has been await'ed on.
292
+ self -> state = TASK_STATE_DONE_WAS_WAITED_ON ;
293
+ } else if (self -> state == TASK_STATE_RUNNING_NOT_WAITED_ON ) {
294
+ // Allocate the waiting queue.
295
+ self -> state = task_queue_make_new (& task_queue_type , 0 , 0 , NULL );
296
+ }
297
+ return self_in ;
298
+ }
299
+
300
+ STATIC mp_obj_t task_iternext (mp_obj_t self_in ) {
301
+ mp_obj_task_t * self = MP_OBJ_TO_PTR (self_in );
302
+ if (TASK_IS_DONE (self )) {
303
+ // Task finished, raise return value to caller so it can continue.
304
+ nlr_raise (self -> data );
305
+ } else {
306
+ // Put calling task on waiting queue.
307
+ mp_obj_t cur_task = mp_obj_dict_get (uasyncio_context , MP_OBJ_NEW_QSTR (MP_QSTR_cur_task ));
308
+ mp_obj_t args [2 ] = { self -> state , cur_task };
309
+ task_queue_push_sorted (2 , args );
310
+ // Set calling task's data to this task that it waits on, to double-link it.
311
+ ((mp_obj_task_t * )MP_OBJ_TO_PTR (cur_task ))-> data = self_in ;
312
+ }
313
+ return mp_const_none ;
314
+ }
315
+
316
316
STATIC const mp_obj_type_t task_type = {
317
317
{ & mp_type_type },
318
318
.flags = MP_TYPE_FLAG_EXTENDED ,
@@ -329,7 +329,11 @@ STATIC const mp_obj_type_t task_type = {
329
329
// C-level uasyncio module
330
330
331
331
STATIC const mp_rom_map_elem_t mp_module_uasyncio_globals_table [] = {
332
+ #if CIRCUITPY
333
+ { MP_ROM_QSTR (MP_QSTR___name__ ), MP_ROM_QSTR (MP_QSTR__asyncio ) },
334
+ #else
332
335
{ MP_ROM_QSTR (MP_QSTR___name__ ), MP_ROM_QSTR (MP_QSTR__uasyncio ) },
336
+ #endif
333
337
{ MP_ROM_QSTR (MP_QSTR_TaskQueue ), MP_ROM_PTR (& task_queue_type ) },
334
338
{ MP_ROM_QSTR (MP_QSTR_Task ), MP_ROM_PTR (& task_type ) },
335
339
};
@@ -340,4 +344,6 @@ const mp_obj_module_t mp_module_uasyncio = {
340
344
.globals = (mp_obj_dict_t * )& mp_module_uasyncio_globals ,
341
345
};
342
346
347
+ MP_REGISTER_MODULE (MP_QSTR__asyncio , mp_module_uasyncio , MICROPY_PY_UASYNCIO );
348
+
343
349
#endif // MICROPY_PY_UASYNCIO
0 commit comments