/* * 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"); } }
/* * 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; }
/* * 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; }