Beispiel #1
0
static void lt_proxy_loop(void* arg)
{
    lthread_t *lt = NULL;
    proxy_conn_t *proxy = (proxy_conn_t*)arg;

    fprintf(stderr, "proxy loop\n");
    lthread_create(&lt, (void*)lt_proxy_loop_read, proxy);
    lt_proxy_loop_write(arg);

    lthread_join(lt, NULL, LTHREAD_FOREVER);
}
Beispiel #2
0
int main(int argc, char **argv) {
	struct lthread lt_car, lt_road;
	int score;

	race_init();
	race_print_road(road);

	lthread_init(&lt_road, move_road);
	lthread_init(&lt_car, move_car);

	lthread_launch(&lt_road);
	lthread_launch(&lt_car);

	lthread_join(&lt_road);
	lthread_join(&lt_car);

	score = (step - RACE_ROAD_LEN) / RACE_OBSTACLE_STEP;
	race_print_score(score);

	return 0;
}
Beispiel #3
0
static void lt_request_cli(void *arg)
{
    int ret;
    lthread_t *lt = NULL;
    proxy_conn_t *priv_conn = proxy_conn_create(-1, 1);
    proxy_conn_t *proxy_conn = (proxy_conn_t*)arg;

    DEFINE_LTHREAD;
    lthread_detach();

    fprintf(stderr, "request new client\n");
    ret = tcp_dial_ipv4(&priv_conn->conn, "192.168.6.1:80");
    if(0 != ret) {
        proxy_conn_free(priv_conn);
        proxy_conn_free(proxy_conn);
        return;
    }

    fprintf(stderr, "dial priv conn ok\n");
    priv_conn->other = proxy_conn;
    proxy_conn->other = priv_conn;
    //lthread_create(&lt1, (void*)lt_proxy_loop, (void*)priv_conn);
    lthread_create(&lt, (void*)lt_proxy_loop, (void*)proxy_conn);
    lt_proxy_loop(priv_conn);

    lthread_join(lt, NULL, LTHREAD_FOREVER);

    void* data = NULL;
    kstring_t *buf = NULL;
    while(0 == chan_recv(priv_conn->write_ch, &data)) {
        if(data != NULL) {
            buf = (kstring_t*)data;
            ks_free(buf);
            free(buf);
        } else {
            //mark as end
            break;
        }
    }
    while(0 == chan_recv(proxy_conn->write_ch, &data)) {
        if(data != NULL) {
            buf = (kstring_t*)data;
            ks_free(buf);
            free(buf);
        } else {
            //mark as end
            break;
        }
    }
    proxy_conn_free(priv_conn);
    proxy_conn_free(proxy_conn);
}
Beispiel #4
0
void lt_main(void *arg)
{
    int fd, opt = 1;
    proxy_server *srv = (proxy_server*)arg;
    lthread_t *lt_accept = NULL;
    struct sockaddr cin = {0};
    socklen_t addrlen = sizeof(struct sockaddr);
    proxy_conn_t *proxy = NULL;

    DEFINE_LTHREAD;
    lthread_detach();

    srv->listen_fd = create_listener("0.0.0.0", 9000);
    if(srv->listen_fd < 0) {
        exit(1);
    }
    fprintf(stderr, "listener creating :9000\n");

    lthread_create(&lt_accept, (void*)lt_accept_loop, (void*)srv);

    while(!srv->is_die) {
        fd = lthread_accept(srv->listen_fd, &cin, &addrlen);
        if(fd < 0) {
            perror("accept error");
            break;
        }
        if(srv->quiting) {
            lthread_close(fd);
            break;
        }
        if(srv->is_die) {
            //already die, close and break
            lthread_close(fd);
            fprintf(stderr, "server already die :9000\n");
            break;
        }

        if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int)) == -1) {
            perror("failed to set SOREUSEADDR on socket");
            break;
        }

        fprintf(stderr, "accept new client\n");
        proxy = proxy_conn_create(fd, 0);
        if(0 != chan_send(srv->accepts_ch, proxy)) {
            //send failed, free proxy
            proxy_conn_free(proxy);
            break;
        }

        //yield myself
        lthread_sleep((uint64_t)0);
    }
    if(-1 != srv->listen_fd) {
        close(srv->listen_fd);
        srv->listen_fd = -1;
    }
    if(!srv->is_die) {
        srv->is_die = 1;
        chan_close(srv->die_ch);
        fprintf(stderr, "srv die\n");
    }

    fprintf(stderr, "lt_accept end\n");
    lthread_join(lt_accept, NULL, LTHREAD_FOREVER);

    //server release
    server_release(srv);
}