@@ -7,34 +7,25 @@ static mrb_state *_mrb = NULL;
77static mrb_value write_values ;
88static mrb_value read_values ;
99
10- /*
11- * Workaround: To avoid deadlock
12- */
13- static bool mutex_locked = false;
14- static bool heatbeat_flag = false;
15- static bool packet_flag = false;
16- static uint8_t * packet = NULL ;
17- static uint16_t packet_size = 0 ;
18-
1910void
2011BLE_push_event (uint8_t * data , uint16_t size )
2112{
22- if (mutex_locked ) return ;
23- mutex_locked = true;
13+ if (packet_mutex ) return ;
14+ packet_mutex = true;
2415 packet_flag = true;
2516 packet_size = size ;
2617 if (packet != NULL ) {
2718 mrb_free (_mrb , packet );
2819 }
2920 packet = mrb_malloc (_mrb , packet_size );
3021 memcpy (packet , data , packet_size );
31- mutex_locked = false;
22+ packet_mutex = false;
3223}
3324
3425void
3526BLE_heartbeat (void )
3627{
37- if (mutex_locked ) return ;
28+ if (packet_mutex ) return ;
3829 heatbeat_flag = true;
3930}
4031
@@ -45,7 +36,9 @@ BLE_write_data(uint16_t att_handle, const uint8_t *data, uint16_t size)
4536 return -1 ;
4637 }
4738 mrb_value write_value = mrb_str_new (_mrb , (const char * )data , size );
39+ write_values_mutex = true;
4840 mrb_hash_set (_mrb , write_values , mrb_fixnum_value (att_handle ), write_value );
41+ write_values_mutex = false;
4942 return 0 ;
5043}
5144
@@ -75,26 +68,27 @@ static mrb_value
7568mrb_pop_packet (mrb_state * mrb , mrb_value self )
7669{
7770 mrb_value packet_value = mrb_nil_value ();
78- if (mutex_locked || !packet_flag ) return packet_value ;
79- mutex_locked = true;
71+ if (packet_mutex || !packet_flag ) return packet_value ;
72+ packet_mutex = true;
8073 packet_flag = false;
8174 packet_value = mrb_str_new (mrb , (const char * )packet , packet_size );
8275 mrb_free (mrb , packet );
8376 packet = NULL ;
84- mutex_locked = false;
77+ packet_mutex = false;
8578 return packet_value ;
8679}
8780
8881static mrb_value
89- mrb_get_write_value (mrb_state * mrb , mrb_value self )
82+ mrb_pop_write_value (mrb_state * mrb , mrb_value self )
9083{
84+ if (write_values_mutex ) return mrb_nil_value ();
9185 mrb_int handle ;
9286 mrb_get_args (mrb , "i" , & handle );
93- return mrb_hash_get (mrb , write_values , mrb_fixnum_value (handle ));
87+ return mrb_hash_delete_key (mrb , write_values , mrb_fixnum_value (handle ));
9488}
9589
9690static mrb_value
97- mrb_set_read_value (mrb_state * mrb , mrb_value self )
91+ mrb_push_read_value (mrb_state * mrb , mrb_value self )
9892{
9993 mrb_int handle ;
10094 mrb_value read_value ;
@@ -174,8 +168,8 @@ mrb_picoruby_ble_gem_init(mrb_state* mrb)
174168 mrb_define_method_id (mrb , class_BLE , MRB_SYM (_init ), mrb__init , MRB_ARGS_REQ (1 ));
175169 mrb_define_method_id (mrb , class_BLE , MRB_SYM (hci_power_control ), mrb_hci_power_control , MRB_ARGS_REQ (1 ));
176170 mrb_define_method_id (mrb , class_BLE , MRB_SYM (gap_local_bd_addr ), mrb_gap_local_bd_addr , MRB_ARGS_NONE ());
177- mrb_define_method_id (mrb , class_BLE , MRB_SYM (get_write_value ), mrb_get_write_value , MRB_ARGS_REQ (1 ));
178- mrb_define_method_id (mrb , class_BLE , MRB_SYM (set_read_value ), mrb_set_read_value , MRB_ARGS_REQ (2 ));
171+ mrb_define_method_id (mrb , class_BLE , MRB_SYM (pop_write_value ), mrb_pop_write_value , MRB_ARGS_REQ (1 ));
172+ mrb_define_method_id (mrb , class_BLE , MRB_SYM (push_read_value ), mrb_push_read_value , MRB_ARGS_REQ (2 ));
179173 mrb_define_method_id (mrb , class_BLE , MRB_SYM (pop_heartbeat ), mrb_pop_heartbeat , MRB_ARGS_NONE ());
180174 mrb_define_method_id (mrb , class_BLE , MRB_SYM (pop_packet ), mrb_pop_packet , MRB_ARGS_NONE ());
181175
0 commit comments