365 } else { |
365 } else { |
366 listener->session_handler = create_event_session_handler(pool); |
366 listener->session_handler = create_event_session_handler(pool); |
367 } |
367 } |
368 listener->nacceptors = conf->nacceptors; |
368 listener->nacceptors = conf->nacceptors; |
369 listener->port = conf->port; |
369 listener->port = conf->port; |
370 listener->ref = 1; |
|
371 listener->next = NULL; |
370 listener->next = NULL; |
372 listener->ssl = NULL; |
371 listener->ssl = NULL; |
373 |
372 |
374 // create sockets |
373 // create sockets |
375 listener->server_socket = get_socket(conf, LISTENER_PROTO_IPV4); |
374 listener->server_socket = get_socket(conf, LISTENER_PROTO_IPV4); |
457 listener->running = TRUE; |
456 listener->running = TRUE; |
458 |
457 |
459 return 0; |
458 return 0; |
460 } |
459 } |
461 |
460 |
462 void http_listener_ref(HttpListener *listener) { |
|
463 ws_atomic_inc32(&listener->ref); |
|
464 } |
|
465 |
|
466 void http_listener_unref(HttpListener *listener) { |
|
467 uint32_t ref = ws_atomic_dec32(&listener->ref); |
|
468 if(ref == 0) { |
|
469 log_ereport(LOG_VERBOSE, "HttpListener %s: destroy", listener->name.ptr); |
|
470 free(listener->acceptors); |
|
471 // TODO: unref cfg |
|
472 // TODO: unref session handler |
|
473 free(listener); |
|
474 } |
|
475 } |
|
476 |
|
477 int http_listener_socket_eq(HttpListener *l1, HttpListener *l2) { |
461 int http_listener_socket_eq(HttpListener *l1, HttpListener *l2) { |
478 if(l1->server_socket && l2->server_socket && l1->server_socket == l2->server_socket) { |
462 if(l1->server_socket && l2->server_socket && l1->server_socket == l2->server_socket) { |
479 return TRUE; |
463 return TRUE; |
480 } |
464 } |
481 if(l1->server_socket6 && l2->server_socket6 && l1->server_socket6 == l2->server_socket6) { |
465 if(l1->server_socket6 && l2->server_socket6 && l1->server_socket6 == l2->server_socket6) { |
486 |
470 |
487 void http_listener_set_next(HttpListener *listener, HttpListener *next) { |
471 void http_listener_set_next(HttpListener *listener, HttpListener *next) { |
488 while(listener->next) { |
472 while(listener->next) { |
489 listener = listener->next; |
473 listener = listener->next; |
490 } |
474 } |
491 |
|
492 http_listener_ref(next); |
|
493 listener->next = next; |
475 listener->next = next; |
494 } |
476 } |
495 |
477 |
496 |
478 |
497 Acceptor* acceptor_new(HttpListener *listener) { |
479 Acceptor* acceptor_new(HttpListener *listener) { |
500 acceptor->ipv6 = WS_FALSE; |
482 acceptor->ipv6 = WS_FALSE; |
501 return acceptor; |
483 return acceptor; |
502 } |
484 } |
503 |
485 |
504 void acceptor_start(Acceptor *a) { |
486 void acceptor_start(Acceptor *a) { |
|
487 cfg_ref(a->listener->cfg); |
505 if(pthread_create( |
488 if(pthread_create( |
506 &a->tid, |
489 &a->tid, |
507 NULL, |
490 NULL, |
508 (void*(*)(void*))acceptor_thread, |
491 (void*(*)(void*))acceptor_thread, |
509 a) != 0) |
492 a) != 0) |
510 { |
493 { |
511 log_ereport(LOG_FAILURE, "Listener %s: acceptor_start: %s", a->listener->name.ptr, strerror(errno)); |
494 log_ereport(LOG_FAILURE, "Listener %s: acceptor_start: %s", a->listener->name.ptr, strerror(errno)); |
|
495 cfg_unref(a->listener->cfg); |
512 } |
496 } |
513 } |
497 } |
514 |
498 |
515 void* acceptor_thread(Acceptor *acceptor) { |
499 void* acceptor_thread(Acceptor *acceptor) { |
516 WS_ASSERT(acceptor); |
500 WS_ASSERT(acceptor); |
517 WS_ASSERT(acceptor->listener); |
501 WS_ASSERT(acceptor->listener); |
|
502 WS_ASSERT(acceptor->listener->cfg); |
518 WS_ASSERT(acceptor->listener->session_handler); |
503 WS_ASSERT(acceptor->listener->session_handler); |
519 WS_ASSERT(acceptor->listener->session_handler->enqueue_connection); |
504 WS_ASSERT(acceptor->listener->session_handler->enqueue_connection); |
520 |
505 |
521 HttpListener *listener = acceptor->listener; |
506 HttpListener *listener = acceptor->listener; |
522 |
507 |
523 int server_socket; |
508 int server_socket; |
524 |
509 |
525 ConnectionAddr ca; |
510 ConnectionAddr ca; |
526 struct sockaddr *ca_ptr; |
511 struct sockaddr *ca_ptr; |
527 socklen_t ca_length; |
512 socklen_t ca_length; |