@@ -44,12 +44,14 @@ pub fn strlen(str: ?[*:0]const u8) callconv(.c) usize {
4444 return std .mem .len (s );
4545}
4646
47- pub fn strnlen (str : ? [* :0 ]const u8 , _ : usize ) callconv (.c ) usize {
48- // const s = str orelse return 0;
49- // return if (std.mem.indexOfScalar(u8, s[0..n], 0)) |index| index + 1 else n;
47+ pub fn strnlen (str : ? [* :0 ]const u8 , n : usize ) callconv (.c ) usize {
5048 const s = str orelse return 0 ;
49+ return if (std .mem .indexOfScalar (u8 , s [0.. n ], 0 )) | index | index else n ;
50+ }
5151
52- return std .mem .len (s );
52+ test "strnlen" {
53+ try std .testing .expect (strnlen (&.{ 10 , 20 , 30 , 0 }, 4 ) == 3 );
54+ try std .testing .expect (strnlen (&.{ 10 , 20 , 30 , 0 , 10 , 20 , 30 }, 7 ) == 3 );
5355}
5456
5557pub fn strrchr (str : ? [* :0 ]const u8 , chr : u32 ) callconv (.c ) ? [* :0 ]const u8 {
@@ -319,11 +321,12 @@ pub fn semphr_take(ptr: ?*anyopaque, tick: u32) callconv(.c) i32 {
319321 log .debug ("semphr_take {?} {}" , .{ ptr , tick });
320322
321323 const sem : * rtos.Semaphore = @ptrCast (@alignCast (ptr ));
322- const maybe_timeout : ? rtos.Duration = if (tick == c .OSI_FUNCS_TIME_BLOCKING )
323- .from_ticks (tick )
324- else
325- null ;
326- sem .take_with_timeout (maybe_timeout ) catch {
324+ const timeout : rtos.Timeout = switch (tick ) {
325+ 0 = > .non_blocking ,
326+ c .OSI_FUNCS_TIME_BLOCKING = > .never ,
327+ else = > | ticks | .{ .after = .from_ticks (ticks ) },
328+ };
329+ sem .take_with_timeout (timeout ) catch {
327330 log .debug (">>>> return from semaphore take with timeout: {*}" , .{sem });
328331 return 1 ;
329332 };
@@ -368,10 +371,11 @@ const RecursiveMutex = struct {
368371 if (@intFromEnum (current_task .priority ) > @intFromEnum (owning_task .priority )) {
369372 mutex .prev_priority = owning_task .priority ;
370373 owning_task .priority = current_task .priority ;
371- rtos .make_ready (owning_task );
374+ var _hptw = false ;
375+ rtos .make_ready (owning_task , & _hptw );
372376 }
373377
374- mutex .wait_queue .wait (current_task , null );
378+ mutex .wait_queue .wait (null );
375379 }
376380
377381 assert (mutex .value == 0 );
@@ -395,8 +399,13 @@ const RecursiveMutex = struct {
395399 owning_task .priority = prev_priority ;
396400 mutex .prev_priority = null ;
397401 }
402+
398403 mutex .owning_task = null ;
399- mutex .wait_queue .wake_one ();
404+
405+ var hptw = false ;
406+ mutex .wait_queue .wake_one (& hptw );
407+ if (hptw ) rtos .yield_from_cs (.reschedule );
408+
400409 return true ;
401410 } else {
402411 return false ;
@@ -505,17 +514,12 @@ pub fn queue_send(ptr: ?*anyopaque, item_ptr: ?*anyopaque, block_time_tick: u32)
505514 const queue : * QueueWrapper = @ptrCast (@alignCast (ptr ));
506515 const item : [* ]const u8 = @ptrCast (@alignCast (item_ptr ));
507516
508- const size = switch (block_time_tick ) {
509- 0 = > queue .inner .put_non_blocking (item [0.. queue .item_len ]),
510- else = > queue .inner .put (
511- item [0.. queue .item_len ],
512- 1 ,
513- if (block_time_tick != c .OSI_FUNCS_TIME_BLOCKING )
514- .from_ticks (block_time_tick )
515- else
516- null ,
517- ),
517+ const timeout : rtos.Timeout = switch (block_time_tick ) {
518+ 0 = > .non_blocking ,
519+ c .OSI_FUNCS_TIME_BLOCKING = > .never ,
520+ else = > | ticks | .{ .after = .from_ticks (ticks ) },
518521 };
522+ const size = queue .inner .put (item [0.. queue .item_len ], 1 , timeout );
519523 if (size == 0 ) return -1 ;
520524 return 1 ;
521525}
@@ -525,9 +529,11 @@ pub fn queue_send_from_isr(ptr: ?*anyopaque, item_ptr: ?*anyopaque, _hptw: ?*any
525529
526530 const queue : * QueueWrapper = @ptrCast (@alignCast (ptr ));
527531 const item : [* ]const u8 = @ptrCast (@alignCast (item_ptr ));
528- const n = @divExact (queue .inner .put_non_blocking (item [0.. queue .item_len ]), queue .item_len );
529532
530- @as (* u32 , @ptrCast (@alignCast (_hptw ))).* = @intFromBool (rtos .is_a_higher_priority_task_ready ());
533+ var hptw = false ;
534+ const n = @divExact (queue .inner .put_from_isr (item [0.. queue .item_len ], & hptw ), queue .item_len );
535+
536+ @as (* u32 , @ptrCast (@alignCast (_hptw ))).* |= @intFromBool (hptw );
531537
532538 return @intCast (n );
533539}
@@ -546,17 +552,12 @@ pub fn queue_recv(ptr: ?*anyopaque, item_ptr: ?*anyopaque, block_time_tick: u32)
546552 const queue : * QueueWrapper = @ptrCast (@alignCast (ptr ));
547553 const item : [* ]u8 = @ptrCast (@alignCast (item_ptr ));
548554
549- const size = switch (block_time_tick ) {
550- 0 = > queue .inner .get_non_blocking (item [0.. queue .item_len ]),
551- else = > queue .inner .get (
552- item [0.. queue .item_len ],
553- queue .item_len ,
554- if (block_time_tick != c .OSI_FUNCS_TIME_BLOCKING )
555- .from_ticks (block_time_tick )
556- else
557- null ,
558- ),
555+ const timeout : rtos.Timeout = switch (block_time_tick ) {
556+ 0 = > .non_blocking ,
557+ c .OSI_FUNCS_TIME_BLOCKING = > .never ,
558+ else = > | ticks | .{ .after = .from_ticks (ticks ) },
559559 };
560+ const size = queue .inner .get (item [0.. queue .item_len ], 1 , timeout );
560561 if (size == 0 ) return -1 ;
561562 return 1 ;
562563}
0 commit comments