Eigenstate: myrddin-dev mailing list

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 4/4] Only attempt to ftxwake in sempost if there might be a waiter.


Fixed a couple of bugs in the futex timeout patches, and pushed
the updated series. We now have rwlocks, thanks!

On Sat, 11 Aug 2018 19:15:59 -0700, iriri <iri@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx> wrote:

> 
> ---
>  lib/thread/sem+futex.myr | 16 ++++++++++------
>  1 file changed, 10 insertions(+), 6 deletions(-)
> 
> diff --git a/lib/thread/sem+futex.myr b/lib/thread/sem+futex.myr
> index 434e195d..711dcf93 100644
> --- a/lib/thread/sem+futex.myr
> +++ b/lib/thread/sem+futex.myr
> @@ -5,13 +5,14 @@ use "futex"
>  
>  pkg thread =
>  	type sem = struct
> -		_val : ftxtag
> +		_val      : ftxtag
> +		_nwaiters : uint32
>  	;;
>  
> -	const mksem : (v : uint32 -> sem)
> -	const semwait : (s : sem# -> void)
> +	const mksem      : (v : uint32 -> sem)
> +	const semwait    : (s : sem# -> void)
>  	const semtrywait : (s : sem# -> bool)
> -	const sempost : (s : sem# -> void)
> +	const sempost    : (s : sem# -> void)
>  ;;
>  
>  const mksem = {v
> @@ -21,9 +22,11 @@ const mksem = {v
>  const semwait = {s
>  	var v = 0
>  
> +	xadd(&s._nwaiters, 1)
>  	for ; ;
>  		while (v = s._val) > 0
>  			if xcas(&s._val, v, v - 1) == v
> +				xadd(&s._nwaiters, -1)
>  				-> void
>  			;;
>  		;;
> @@ -47,6 +50,7 @@ const semtrywait = {s
>  const sempost = {s
>  	std.assert((xadd(&s._val, 1) : uint32) != ~0x0, "error: semaphore overflowed\n")
>  
> -	/* Unconditionally wake one waiter */
> -	ftxwake(&s._val)
> +	if xget(&s._nwaiters) > 0
> +		ftxwake(&s._val)
> +	;;
>  }
> -- 
> 2.18.0
> 
> 


-- 
    Ori Bernstein

References:
[PATCH 4/4] Only attempt to ftxwake in sempost if there might be a waiter.iriri <iri@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx>