gcc/libgo/runtime/go-chan-len.c
Ian Lance Taylor b39c10b813 Unify handling of runtime support functions.
This introduces the new approach, and rewrites the lowering
code which uses runtime functions.  The code which calls
runtime functions at GENERIC conversion time is not yet
rewritten.

From-SVN: r172396
2011-04-13 21:00:59 +00:00

42 lines
999 B
C

/* go-chan-len.c -- the len function applied to a channel.
Copyright 2009 The Go Authors. All rights reserved.
Use of this source code is governed by a BSD-style
license that can be found in the LICENSE file. */
#include <stddef.h>
#include "go-assert.h"
#include "channel.h"
/* Return the len function applied to a channel--the number of
elements in the buffer. This could be done inline but I'm doing it
as a function for now to make it easy to change the channel
structure. */
int
__go_chan_len (struct __go_channel *channel)
{
int i;
int ret;
if (channel == NULL)
return 0;
i = pthread_mutex_lock (&channel->lock);
__go_assert (i == 0);
if (channel->num_entries == 0)
ret = 0;
else if (channel->next_fetch == channel->next_store)
ret = 0;
else
ret = ((channel->next_store + channel->num_entries - channel->next_fetch)
% channel->num_entries);
i = pthread_mutex_unlock (&channel->lock);
__go_assert (i == 0);
return ret;
}