Ejemplo n.º 1
0
/*
 * Listener task. Get a lock group as an argument.
 * Waits for signals on the group, and prints them.
 */
void main_waiter (void *arg)
{
	mutex_group_t *g = arg;
	mutex_t *m;
	void *msg;

	for (;;) {
		mutex_group_wait (g, &m, &msg);
		debug_printf ("Time %d, message %s\n",
			timer_milliseconds (&timer), msg ? msg : "Timer");
	}
}
Ejemplo n.º 2
0
/*
 * Send len>0 bytes.
 * Return a number ob transmitted bytes, or -1 on error.
 */
int
tcp_write (tcp_socket_t *s, const void *arg, unsigned short len)
{
	tcp_debug ("tcp_write(s=%p, arg=%p, len=%u)\n",
		(void*) s, arg, len);
	mutex_lock (&s->lock);

	if (s->state != SYN_SENT && s->state != SYN_RCVD &&
	    s->state != ESTABLISHED /*&& s->state != CLOSE_WAIT*/) {
		mutex_unlock (&s->lock);
		tcp_debug ("tcp_write() called in invalid state\n");
		return -1;
	}
	if (len == 0) {
		mutex_unlock (&s->lock);
		return -1;
	}
	mutex_group_t *g = 0;
	ARRAY (group, sizeof(mutex_group_t) + 2 * sizeof(mutex_slot_t));

	while (tcp_enqueue (s, (void*) arg, len, 0, 0, 0) == 0) {
		/* Не удалось поставить пакет в очередь - мало памяти. */
		if (! g) {
			memset (group, 0, sizeof(group));
			g = mutex_group_init (group, sizeof(group));
			mutex_group_add (g, &s->lock);
			mutex_group_add (g, &s->ip->timer->decisec);
			mutex_group_listen (g);
		}
		/* Каждые 100 мсек делаем повторную попытку. */
		mutex_unlock (&s->lock);
		mutex_group_wait (g, 0, 0);
		mutex_lock (&s->lock);

		/* Проверим, не закрылось ли соединение. */
		if (s->state != SYN_SENT && s->state != SYN_RCVD &&
		    s->state != ESTABLISHED /*&& s->state != CLOSE_WAIT*/) {
			mutex_unlock (&s->lock);
			if (g)
				mutex_group_unlisten (g);
			return -1;
		}
	}
	mutex_unlock (&s->lock);
	if (g)
		mutex_group_unlisten (g);

	mutex_lock (&s->ip->lock);
	tcp_output (s);
	mutex_unlock (&s->ip->lock);
	return len;
}
Ejemplo n.º 3
0
/*
 * Send len>0 bytes.
 * Return a number ob transmitted bytes, or -1 on error.
 */
int
tcp_write (tcp_socket_t *s, const void *arg, unsigned short len)
{
	tcp_debug ("tcp_write(s=%p, arg=%p, len=%u)\n",
		(void*) s, arg, len);

	if (!tcp_socket_is_state(s, TCP_STATES_TRANSFER)) {
		tcp_debug ("tcp_write() called in invalid state\n");
		return -1;
	}
	if (len == 0) {
		return -1;
	}
	mutex_group_t *g = 0;
	ARRAY (group, sizeof(mutex_group_t) + 2 * sizeof(mutex_slot_t));

	const char* ptr = (const char*)arg;
	unsigned left = len;
	while (left > 0){

	    int sent = tcp_enqueue (s, ptr, len, 0);
	    left    -= sent;
        ptr     += sent;

        if (left == 0)
            break;

#       if TCP_LOCK_STYLE <= TCP_LOCK_SURE
        if (mutex_is_my(&s->lock))
        mutex_unlock (&s->lock);
        tcp_output_poll (s);
#       elif TCP_LOCK_STYLE <= TCP_LOCK_RELAXED
        tcp_output_poll (s);
        mutex_unlock (&s->lock);
#       endif

        /* Не удалось поставить пакет в очередь - мало памяти. */
        if (! g) {
            memset (group, 0, sizeof(group));
            g = mutex_group_init (group, sizeof(group));
            mutex_group_add (g, &s->lock);
            mutex_group_add (g, &s->ip->timer->decisec);
            mutex_group_listen (g);
        }
        /* Каждые 100 мсек делаем повторную попытку. */
        mutex_group_wait (g, 0, 0);
        /* Проверим, не закрылось ли соединение. */
        if (!tcp_socket_is_state(s, TCP_STATES_TRANSFER)) {
            if (g)
                mutex_group_unlisten (g);
            return -1;
        }
	}

	if (g)
		mutex_group_unlisten (g);

#       if TCP_LOCK_STYLE <= TCP_LOCK_SURE
        mutex_unlock (&s->lock);
        tcp_output (s);
#       elif TCP_LOCK_STYLE <= TCP_LOCK_RELAXED
        tcp_output (s);
        mutex_unlock (&s->lock);
#       endif
	return len;
}