@@ -95,6 +95,9 @@ SYS_RING_BUF_DECLARE_POW2(ring_buffer, 5);
95
95
static u8_t ring_buf_initialized = 1 ;
96
96
97
97
#ifdef ZJS_LINUX_BUILD
98
+ #define k_is_preempt_thread () 0
99
+ #define irq_lock () 0
100
+ #define irq_unlock (key ) do {} while (0);
98
101
#define RB_LOCK () do {} while (0)
99
102
#define RB_UNLOCK () do {} while (0)
100
103
#define CB_LOCK () do {} while (0)
@@ -103,26 +106,42 @@ static u8_t ring_buf_initialized = 1;
103
106
// mutex to ensure only one thread can access ring buffer at a time
104
107
static struct k_mutex ring_mutex ;
105
108
106
- #define RB_LOCK () \
107
- LPRINT("Ringbuf lock..."); \
108
- k_mutex_lock(&ring_mutex, K_FOREVER); \
109
- LPRINT("Ringbuf locked.")
110
- #define RB_UNLOCK () \
109
+ #define RB_LOCK () \
110
+ { \
111
+ LPRINT("Ringbuf lock..."); \
112
+ if (k_mutex_lock(&ring_mutex, K_FOREVER)) { \
113
+ ERR_PRINT("Ringbuf lock error.\n"); \
114
+ } else { \
115
+ LPRINT("Ringbuf locked."); \
116
+ } \
117
+ }
118
+
119
+ #define RB_UNLOCK () \
120
+ { \
111
121
LPRINT("Ringbuf unlock..."); \
112
122
k_mutex_unlock(&ring_mutex); \
113
- LPRINT("Ringbuf unlocked.")
123
+ LPRINT("Ringbuf unlocked."); \
124
+ }
114
125
115
126
// mutex to ensure only one thread can access cb_map at a time
116
127
static struct k_mutex cb_mutex ;
117
128
118
- #define CB_LOCK () \
119
- LPRINT("Callbacks lock..."); \
120
- k_mutex_lock(&cb_mutex, K_FOREVER); \
121
- LPRINT("Callbacks locked.")
129
+ #define CB_LOCK () \
130
+ { \
131
+ LPRINT("Callbacks lock..."); \
132
+ if (k_mutex_lock(&cb_mutex, K_FOREVER)) { \
133
+ ERR_PRINT("Callback lock error.\n"); \
134
+ } else { \
135
+ LPRINT("Callbacks locked."); \
136
+ } \
137
+ }
138
+
122
139
#define CB_UNLOCK () \
140
+ { \
123
141
LPRINT("Callbacks unlock..."); \
124
142
k_mutex_unlock(&cb_mutex); \
125
- LPRINT("Callbacks unlocked.")
143
+ LPRINT("Callbacks unlocked."); \
144
+ }
126
145
#endif // ZJS_LINUX_BUILD
127
146
128
147
static zjs_callback_id cb_limit = INITIAL_CALLBACK_SIZE ;
@@ -371,15 +390,17 @@ void signal_callback_priv(zjs_callback_id id,
371
390
DBG_PRINT ("pushing item to ring buffer. id=%d, args=%p, size=%u\n" , id ,
372
391
args , size );
373
392
#endif
374
- CB_LOCK ();
393
+ int in_thread = k_is_preempt_thread (); // versus ISR or co-op thread
394
+ int key = 0 ;
395
+ if (in_thread ) CB_LOCK ();
375
396
if (id < 0 || id >= cb_size || !cb_map [id ]) {
376
397
DBG_PRINT ("callback ID %u does not exist\n" , id );
377
- CB_UNLOCK ();
398
+ if ( in_thread ) CB_UNLOCK ();
378
399
return ;
379
400
}
380
401
if (GET_CB_REMOVED (cb_map [id ]-> flags )) {
381
402
DBG_PRINT ("callback already removed\n" );
382
- CB_UNLOCK ();
403
+ if ( in_thread ) CB_UNLOCK ();
383
404
return ;
384
405
}
385
406
if (GET_TYPE (cb_map [id ]-> flags ) == CALLBACK_TYPE_JS ) {
@@ -393,7 +414,10 @@ void signal_callback_priv(zjs_callback_id id,
393
414
#ifdef INSTRUMENT_CALLBACKS
394
415
set_info_string (cb_map [id ]-> caller , file , func );
395
416
#endif
396
- RB_LOCK ();
417
+ if (in_thread ) {
418
+ RB_LOCK ();
419
+ key = irq_lock ();
420
+ }
397
421
int ret = zjs_port_ring_buf_put (& ring_buffer ,
398
422
(u16_t )id ,
399
423
0 , // we use value for CB_FLUSH_ONE/ALL
@@ -404,7 +428,10 @@ void signal_callback_priv(zjs_callback_id id,
404
428
// rather than locking everything, as we are only trying to prevent a
405
429
// callback
406
430
// from being edited and called at the same time.
407
- RB_UNLOCK ();
431
+ if (in_thread ) {
432
+ irq_unlock (key );
433
+ RB_UNLOCK ();
434
+ }
408
435
#ifndef ZJS_LINUX_BUILD
409
436
zjs_loop_unblock ();
410
437
#endif
@@ -421,7 +448,7 @@ void signal_callback_priv(zjs_callback_id id,
421
448
zjs_ringbuf_error_count ++ ;
422
449
zjs_ringbuf_last_error = ret ;
423
450
}
424
- CB_UNLOCK ();
451
+ if ( in_thread ) CB_UNLOCK ();
425
452
}
426
453
427
454
zjs_callback_id zjs_add_c_callback (void * handle , zjs_c_callback_func callback )
0 commit comments