src/server/daemon/httplistener.c

changeset 444
96d2ba2f28db
parent 441
797aeb31a2c6
child 445
834351da593b
equal deleted inserted replaced
443:ef3c8a0e1fee 444:96d2ba2f28db
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;
612 log_ereport(LOG_VERBOSE, "acceptor thread %p: exit", (void*)acceptor->tid); 597 log_ereport(LOG_VERBOSE, "acceptor thread %p: exit", (void*)acceptor->tid);
613 break; 598 break;
614 } 599 }
615 } 600 }
616 601
617 if(listener->next) { 602 cfg_unref(acceptor->listener->cfg);
618 http_listener_unref(listener->next);
619 }
620 http_listener_unref(listener);
621 603
622 return NULL; 604 return NULL;
623 } 605 }
624 606
625 void wssocket_ref(WSSocket *ws) { 607 void wssocket_ref(WSSocket *ws) {

mercurial