4040/// \moduleref select
4141
4242typedef struct _poll_obj_t {
43+ mp_obj_t obj ;
4344 mp_uint_t (* ioctl )(mp_obj_t obj , mp_uint_t request , int * errcode , ...);
4445 mp_uint_t flags ;
4546 mp_uint_t flags_ret ;
4647} poll_obj_t ;
4748
4849STATIC void poll_map_add (mp_map_t * poll_map , const mp_obj_t * obj , mp_uint_t obj_len , mp_uint_t flags , bool or_flags ) {
4950 for (mp_uint_t i = 0 ; i < obj_len ; i ++ ) {
50- mp_map_elem_t * elem = mp_map_lookup (poll_map , obj [i ], MP_MAP_LOOKUP_ADD_IF_NOT_FOUND );
51+ mp_map_elem_t * elem = mp_map_lookup (poll_map , mp_obj_id ( obj [i ]) , MP_MAP_LOOKUP_ADD_IF_NOT_FOUND );
5152 if (elem -> value == NULL ) {
5253 // object not found; get its ioctl and add it to the poll list
5354 mp_obj_type_t * type = mp_obj_get_type (obj [i ]);
5455 if (type -> stream_p == NULL || type -> stream_p -> ioctl == NULL ) {
5556 nlr_raise (mp_obj_new_exception_msg (& mp_type_TypeError , "object with stream.ioctl required" ));
5657 }
5758 poll_obj_t * poll_obj = m_new_obj (poll_obj_t );
59+ poll_obj -> obj = obj [i ];
5860 poll_obj -> ioctl = type -> stream_p -> ioctl ;
5961 poll_obj -> flags = flags ;
6062 poll_obj -> flags_ret = 0 ;
@@ -80,7 +82,7 @@ STATIC mp_uint_t poll_map_poll(mp_map_t *poll_map, mp_uint_t *rwx_num) {
8082
8183 poll_obj_t * poll_obj = (poll_obj_t * )poll_map -> table [i ].value ;
8284 int errcode ;
83- mp_int_t ret = poll_obj -> ioctl (poll_map -> table [ i ]. key , MP_IOCTL_POLL , & errcode , poll_obj -> flags );
85+ mp_int_t ret = poll_obj -> ioctl (poll_obj -> obj , MP_IOCTL_POLL , & errcode , poll_obj -> flags );
8486 poll_obj -> flags_ret = ret ;
8587
8688 if (ret == -1 ) {
@@ -153,13 +155,13 @@ STATIC mp_obj_t select_select(uint n_args, const mp_obj_t *args) {
153155 }
154156 poll_obj_t * poll_obj = (poll_obj_t * )poll_map .table [i ].value ;
155157 if (poll_obj -> flags_ret & MP_IOCTL_POLL_RD ) {
156- ((mp_obj_list_t * )list_array [0 ])-> items [rwx_len [0 ]++ ] = poll_map . table [ i ]. key ;
158+ ((mp_obj_list_t * )list_array [0 ])-> items [rwx_len [0 ]++ ] = poll_obj -> obj ;
157159 }
158160 if (poll_obj -> flags_ret & MP_IOCTL_POLL_WR ) {
159- ((mp_obj_list_t * )list_array [1 ])-> items [rwx_len [1 ]++ ] = poll_map . table [ i ]. key ;
161+ ((mp_obj_list_t * )list_array [1 ])-> items [rwx_len [1 ]++ ] = poll_obj -> obj ;
160162 }
161163 if ((poll_obj -> flags_ret & ~(MP_IOCTL_POLL_RD | MP_IOCTL_POLL_WR )) != 0 ) {
162- ((mp_obj_list_t * )list_array [2 ])-> items [rwx_len [2 ]++ ] = poll_map . table [ i ]. key ;
164+ ((mp_obj_list_t * )list_array [2 ])-> items [rwx_len [2 ]++ ] = poll_obj -> obj ;
163165 }
164166 }
165167 mp_map_deinit (& poll_map );
@@ -194,7 +196,7 @@ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(poll_register_obj, 2, 3, poll_register);
194196/// \method unregister(obj)
195197STATIC mp_obj_t poll_unregister (mp_obj_t self_in , mp_obj_t obj_in ) {
196198 mp_obj_poll_t * self = self_in ;
197- mp_map_lookup (& self -> poll_map , obj_in , MP_MAP_LOOKUP_REMOVE_IF_FOUND );
199+ mp_map_lookup (& self -> poll_map , mp_obj_id ( obj_in ) , MP_MAP_LOOKUP_REMOVE_IF_FOUND );
198200 // TODO raise KeyError if obj didn't exist in map
199201 return mp_const_none ;
200202}
@@ -203,7 +205,7 @@ MP_DEFINE_CONST_FUN_OBJ_2(poll_unregister_obj, poll_unregister);
203205/// \method modify(obj, eventmask)
204206STATIC mp_obj_t poll_modify (mp_obj_t self_in , mp_obj_t obj_in , mp_obj_t eventmask_in ) {
205207 mp_obj_poll_t * self = self_in ;
206- mp_map_elem_t * elem = mp_map_lookup (& self -> poll_map , obj_in , MP_MAP_LOOKUP );
208+ mp_map_elem_t * elem = mp_map_lookup (& self -> poll_map , mp_obj_id ( obj_in ) , MP_MAP_LOOKUP );
207209 if (elem == NULL ) {
208210 nlr_raise (mp_obj_new_exception_msg (& mp_type_IOError , "object was never registered" ));
209211 }
@@ -243,11 +245,10 @@ STATIC mp_obj_t poll_poll(uint n_args, const mp_obj_t *args) {
243245 }
244246 poll_obj_t * poll_obj = (poll_obj_t * )self -> poll_map .table [i ].value ;
245247 if (poll_obj -> flags_ret != 0 ) {
246- mp_obj_t tuple [2 ] = {self -> poll_map . table [ i ]. key , MP_OBJ_NEW_SMALL_INT (poll_obj -> flags_ret )};
248+ mp_obj_t tuple [2 ] = {poll_obj -> obj , MP_OBJ_NEW_SMALL_INT (poll_obj -> flags_ret )};
247249 ret_list -> items [n_ready ++ ] = mp_obj_new_tuple (2 , tuple );
248250 }
249251 }
250- mp_map_deinit (& self -> poll_map );
251252 return ret_list ;
252253 }
253254 __WFI ();
0 commit comments