OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include <process.h> | 5 #include <process.h> |
6 #include <winsock2.h> | 6 #include <winsock2.h> |
7 #include <ws2tcpip.h> | 7 #include <ws2tcpip.h> |
8 #include <mswsock.h> | 8 #include <mswsock.h> |
9 | 9 |
10 #include "bin/builtin.h" | 10 #include "bin/builtin.h" |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 | 84 |
85 | 85 |
86 int IOBuffer::GetRemainingLength() { | 86 int IOBuffer::GetRemainingLength() { |
87 ASSERT(operation_ == kRead); | 87 ASSERT(operation_ == kRead); |
88 return data_length_ - index_; | 88 return data_length_ - index_; |
89 } | 89 } |
90 | 90 |
91 | 91 |
92 Handle::Handle(HANDLE handle) | 92 Handle::Handle(HANDLE handle) |
93 : handle_(reinterpret_cast<HANDLE>(handle)), | 93 : handle_(reinterpret_cast<HANDLE>(handle)), |
94 closing_(false), | 94 flags_(0), |
95 port_(0), | 95 port_(0), |
96 completion_port_(INVALID_HANDLE_VALUE), | 96 completion_port_(INVALID_HANDLE_VALUE), |
97 event_handler_(NULL), | 97 event_handler_(NULL), |
98 data_ready_(NULL), | 98 data_ready_(NULL), |
99 pending_read_(NULL), | 99 pending_read_(NULL), |
100 pending_write_(NULL) { | 100 pending_write_(NULL) { |
101 InitializeCriticalSection(&cs_); | 101 InitializeCriticalSection(&cs_); |
102 } | 102 } |
103 | 103 |
104 | 104 |
105 Handle::Handle(HANDLE handle, Dart_Port port) | 105 Handle::Handle(HANDLE handle, Dart_Port port) |
106 : handle_(reinterpret_cast<HANDLE>(handle)), | 106 : handle_(reinterpret_cast<HANDLE>(handle)), |
107 closing_(false), | 107 flags_(0), |
108 port_(port), | 108 port_(port), |
109 completion_port_(INVALID_HANDLE_VALUE), | 109 completion_port_(INVALID_HANDLE_VALUE), |
110 event_handler_(NULL), | 110 event_handler_(NULL), |
111 data_ready_(NULL), | 111 data_ready_(NULL), |
112 pending_read_(NULL), | 112 pending_read_(NULL), |
113 pending_write_(NULL) { | 113 pending_write_(NULL) { |
114 InitializeCriticalSection(&cs_); | 114 InitializeCriticalSection(&cs_); |
115 } | 115 } |
116 | 116 |
117 | 117 |
(...skipping 20 matching lines...) Expand all Loading... |
138 if (completion_port_ == NULL) { | 138 if (completion_port_ == NULL) { |
139 fprintf(stderr, "Error CreateIoCompletionPort: %d\n", GetLastError()); | 139 fprintf(stderr, "Error CreateIoCompletionPort: %d\n", GetLastError()); |
140 return false; | 140 return false; |
141 } | 141 } |
142 return true; | 142 return true; |
143 } | 143 } |
144 | 144 |
145 | 145 |
146 void Handle::close() { | 146 void Handle::close() { |
147 ScopedLock lock(this); | 147 ScopedLock lock(this); |
148 if (!closing_) { | 148 if (!IsClosing()) { |
149 // Close the socket and set the closing state. This close method can be | 149 // Close the socket and set the closing state. This close method can be |
150 // called again if this socket has pending IO operations in flight. | 150 // called again if this socket has pending IO operations in flight. |
151 ASSERT(handle_ != INVALID_HANDLE_VALUE); | 151 ASSERT(handle_ != INVALID_HANDLE_VALUE); |
152 closing_ = true; | 152 MarkClosing(); |
153 // According to the documentation from Microsoft socket handles should | 153 // According to the documentation from Microsoft socket handles should |
154 // not be closed using CloseHandle but using closesocket. | 154 // not be closed using CloseHandle but using closesocket. |
155 if (is_socket()) { | 155 if (is_socket()) { |
156 closesocket(reinterpret_cast<SOCKET>(handle_)); | 156 closesocket(reinterpret_cast<SOCKET>(handle_)); |
157 } else { | 157 } else { |
158 CloseHandle(handle_); | 158 CloseHandle(handle_); |
159 } | 159 } |
160 handle_ = INVALID_HANDLE_VALUE; | 160 handle_ = INVALID_HANDLE_VALUE; |
161 } | 161 } |
162 | 162 |
(...skipping 12 matching lines...) Expand all Loading... |
175 ScopedLock lock(this); | 175 ScopedLock lock(this); |
176 return pending_write_ != NULL; | 176 return pending_write_ != NULL; |
177 } | 177 } |
178 | 178 |
179 | 179 |
180 void Handle::ReadComplete(IOBuffer* buffer) { | 180 void Handle::ReadComplete(IOBuffer* buffer) { |
181 ScopedLock lock(this); | 181 ScopedLock lock(this); |
182 // Currently only one outstanding read at the time. | 182 // Currently only one outstanding read at the time. |
183 ASSERT(pending_read_ == buffer); | 183 ASSERT(pending_read_ == buffer); |
184 ASSERT(data_ready_ == NULL); | 184 ASSERT(data_ready_ == NULL); |
185 if (!closing_ && !buffer->IsEmpty()) { | 185 if (!IsClosing() && !buffer->IsEmpty()) { |
186 data_ready_ = pending_read_; | 186 data_ready_ = pending_read_; |
187 } else { | 187 } else { |
188 IOBuffer::DisposeBuffer(buffer); | 188 IOBuffer::DisposeBuffer(buffer); |
189 } | 189 } |
190 pending_read_ = NULL; | 190 pending_read_ = NULL; |
191 } | 191 } |
192 | 192 |
193 | 193 |
194 void Handle::WriteComplete(IOBuffer* buffer) { | 194 void Handle::WriteComplete(IOBuffer* buffer) { |
195 ScopedLock lock(this); | 195 ScopedLock lock(this); |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
334 } | 334 } |
335 | 335 |
336 pending_accept_count_++; | 336 pending_accept_count_++; |
337 | 337 |
338 return true; | 338 return true; |
339 } | 339 } |
340 | 340 |
341 | 341 |
342 void ListenSocket::AcceptComplete(IOBuffer* buffer, HANDLE completion_port) { | 342 void ListenSocket::AcceptComplete(IOBuffer* buffer, HANDLE completion_port) { |
343 ScopedLock lock(this); | 343 ScopedLock lock(this); |
344 if (!closing_) { | 344 if (!IsClosing()) { |
345 // Update the accepted socket to support the full range of API calls. | 345 // Update the accepted socket to support the full range of API calls. |
346 SOCKET s = socket(); | 346 SOCKET s = socket(); |
347 int rc = setsockopt(buffer->client(), | 347 int rc = setsockopt(buffer->client(), |
348 SOL_SOCKET, | 348 SOL_SOCKET, |
349 SO_UPDATE_ACCEPT_CONTEXT, | 349 SO_UPDATE_ACCEPT_CONTEXT, |
350 reinterpret_cast<char*>(&s), sizeof(s)); | 350 reinterpret_cast<char*>(&s), sizeof(s)); |
351 if (rc == NO_ERROR) { | 351 if (rc == NO_ERROR) { |
352 // Insert the accepted socket into the list. | 352 // Insert the accepted socket into the list. |
353 ClientSocket* client_socket = new ClientSocket(buffer->client(), 0); | 353 ClientSocket* client_socket = new ClientSocket(buffer->client(), 0); |
354 client_socket->CreateCompletionPort(completion_port); | 354 client_socket->CreateCompletionPort(completion_port); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
403 if (client != NULL) { | 403 if (client != NULL) { |
404 client->close(); | 404 client->close(); |
405 } else { | 405 } else { |
406 break; | 406 break; |
407 } | 407 } |
408 } | 408 } |
409 } | 409 } |
410 | 410 |
411 | 411 |
412 bool ListenSocket::IsClosed() { | 412 bool ListenSocket::IsClosed() { |
413 return closing_ && !HasPendingAccept(); | 413 return IsClosing() && !HasPendingAccept(); |
414 } | 414 } |
415 | 415 |
416 | 416 |
417 int Handle::Available() { | 417 int Handle::Available() { |
418 ScopedLock lock(this); | 418 ScopedLock lock(this); |
419 if (data_ready_ == NULL) return 0; | 419 if (data_ready_ == NULL) return 0; |
420 ASSERT(!data_ready_->IsEmpty()); | 420 ASSERT(!data_ready_->IsEmpty()); |
421 return data_ready_->GetRemainingLength(); | 421 return data_ready_->GetRemainingLength(); |
422 } | 422 } |
423 | 423 |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
527 void ClientSocket::AfterClose() { | 527 void ClientSocket::AfterClose() { |
528 ScopedLock lock(this); | 528 ScopedLock lock(this); |
529 if (data_ready_ != NULL) { | 529 if (data_ready_ != NULL) { |
530 IOBuffer::DisposeBuffer(data_ready_); | 530 IOBuffer::DisposeBuffer(data_ready_); |
531 data_ready_ = NULL; | 531 data_ready_ = NULL; |
532 } | 532 } |
533 } | 533 } |
534 | 534 |
535 | 535 |
536 bool ClientSocket::IsClosed() { | 536 bool ClientSocket::IsClosed() { |
537 return closing_ && !HasPendingRead() && !HasPendingWrite(); | 537 return IsClosing() && !HasPendingRead() && !HasPendingWrite(); |
538 } | 538 } |
539 | 539 |
540 | 540 |
541 void EventHandlerImplementation::HandleInterrupt(InterruptMessage* msg) { | 541 void EventHandlerImplementation::HandleInterrupt(InterruptMessage* msg) { |
542 if (msg->id == -1) { | 542 if (msg->id == -1) { |
543 // Change of timeout request. Just set the new timeout and port as the | 543 // Change of timeout request. Just set the new timeout and port as the |
544 // completion thread will use the new timeout value for its next wait. | 544 // completion thread will use the new timeout value for its next wait. |
545 timeout_ = msg->data; | 545 timeout_ = msg->data; |
546 timeout_port_ = msg->dart_port; | 546 timeout_port_ = msg->dart_port; |
547 } else { | 547 } else { |
548 bool delete_socket = false; | 548 bool delete_handle = false; |
549 Handle* socket_desc = | 549 Handle* handle = reinterpret_cast<Handle*>(msg->id); |
550 reinterpret_cast<Handle*>(msg->id); | 550 ASSERT(handle != NULL); |
551 ASSERT(socket_desc != NULL); | 551 if (handle->is_listen_socket()) { |
552 if (socket_desc->is_listen_socket()) { | |
553 ListenSocket* listen_socket = | 552 ListenSocket* listen_socket = |
554 reinterpret_cast<ListenSocket*>(socket_desc); | 553 reinterpret_cast<ListenSocket*>(handle); |
555 listen_socket->EnsureInitialized(this); | 554 listen_socket->EnsureInitialized(this); |
556 listen_socket->SetPortAndMask(msg->dart_port, msg->data); | 555 listen_socket->SetPortAndMask(msg->dart_port, msg->data); |
557 | 556 |
558 Handle::ScopedLock lock(listen_socket); | 557 Handle::ScopedLock lock(listen_socket); |
559 | 558 |
560 // If incomming connections are requested make sure that pending accepts | 559 // If incomming connections are requested make sure that pending accepts |
561 // are issued. | 560 // are issued. |
562 if ((msg->data & (1 << kInEvent)) != 0) { | 561 if ((msg->data & (1 << kInEvent)) != 0) { |
563 while (listen_socket->pending_accept_count() < 5) { | 562 while (listen_socket->pending_accept_count() < 5) { |
564 listen_socket->IssueAccept(); | 563 listen_socket->IssueAccept(); |
565 } | 564 } |
566 } | 565 } |
567 | 566 |
568 if ((msg->data & (1 << kCloseCommand)) != 0) { | 567 if ((msg->data & (1 << kCloseCommand)) != 0) { |
569 listen_socket->close(); | 568 listen_socket->close(); |
570 if (listen_socket->IsClosed()) { | 569 if (listen_socket->IsClosed()) { |
571 delete_socket = true; | 570 delete_handle = true; |
572 } | 571 } |
573 } | 572 } |
574 } else { | 573 } else { |
575 ClientSocket* client_socket = | 574 handle->SetPortAndMask(msg->dart_port, msg->data); |
576 reinterpret_cast<ClientSocket*>(socket_desc); | 575 handle->EnsureInitialized(this); |
577 client_socket->SetPortAndMask(msg->dart_port, msg->data); | |
578 client_socket->EnsureInitialized(this); | |
579 | 576 |
580 Handle::ScopedLock lock(client_socket); | 577 Handle::ScopedLock lock(handle); |
581 | 578 |
582 // If the data available callback has been requested and data are | 579 // If the data available callback has been requested and data are |
583 // available post it immediately. Otherwise make sure that a pending | 580 // available post it immediately. Otherwise make sure that a pending |
584 // read is issued unless the socket is already closed for read. | 581 // read is issued unless the socket is already closed for read. |
585 if ((msg->data & (1 << kInEvent)) != 0) { | 582 if ((msg->data & (1 << kInEvent)) != 0) { |
586 if (client_socket->Available() > 0) { | 583 if (handle->Available() > 0) { |
587 int event_mask = (1 << kInEvent); | 584 int event_mask = (1 << kInEvent); |
588 Dart_PostIntArray(client_socket->port(), 1, &event_mask); | 585 Dart_PostIntArray(handle->port(), 1, &event_mask); |
589 } else if (!client_socket->HasPendingRead() && | 586 } else if (!handle->HasPendingRead() && |
590 !client_socket->IsClosedRead()) { | 587 !handle->IsClosedRead()) { |
591 client_socket->IssueRead(); | 588 handle->IssueRead(); |
592 } | 589 } |
593 } | 590 } |
594 | 591 |
595 // If can send callback had been requested and there is no pending | 592 // If can send callback had been requested and there is no pending |
596 // send post it immediately. | 593 // send post it immediately. |
597 if ((msg->data & (1 << kOutEvent)) != 0) { | 594 if ((msg->data & (1 << kOutEvent)) != 0) { |
598 if (!client_socket->HasPendingWrite()) { | 595 if (!handle->HasPendingWrite()) { |
599 int event_mask = (1 << kOutEvent); | 596 int event_mask = (1 << kOutEvent); |
600 Dart_PostIntArray(client_socket->port(), 1, &event_mask); | 597 Dart_PostIntArray(handle->port(), 1, &event_mask); |
601 } | 598 } |
602 } | 599 } |
603 | 600 |
604 if ((msg->data & (1 << kShutdownReadCommand)) != 0) { | 601 if (handle->is_client_socket()) { |
605 client_socket->Shutdown(SD_RECEIVE); | 602 ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(handle); |
606 } | 603 if ((msg->data & (1 << kShutdownReadCommand)) != 0) { |
| 604 client_socket->Shutdown(SD_RECEIVE); |
| 605 } |
607 | 606 |
608 if ((msg->data & (1 << kShutdownWriteCommand)) != 0) { | 607 if ((msg->data & (1 << kShutdownWriteCommand)) != 0) { |
609 client_socket->Shutdown(SD_SEND); | 608 client_socket->Shutdown(SD_SEND); |
| 609 } |
610 } | 610 } |
611 | 611 |
612 if ((msg->data & (1 << kCloseCommand)) != 0) { | 612 if ((msg->data & (1 << kCloseCommand)) != 0) { |
613 client_socket->close(); | 613 handle->close(); |
614 if (client_socket->IsClosed()) { | 614 if (handle->IsClosed()) { |
615 delete_socket = true; | 615 delete_handle = true; |
616 } | 616 } |
617 } | 617 } |
618 } | 618 } |
619 if (delete_socket) { | 619 if (delete_handle) { |
620 delete socket_desc; | 620 delete handle; |
621 } | 621 } |
622 } | 622 } |
623 } | 623 } |
624 | 624 |
625 | 625 |
626 void EventHandlerImplementation::HandleAccept(ListenSocket* listen_socket, | 626 void EventHandlerImplementation::HandleAccept(ListenSocket* listen_socket, |
627 IOBuffer* buffer) { | 627 IOBuffer* buffer) { |
628 listen_socket->AcceptComplete(buffer, completion_port_); | 628 listen_socket->AcceptComplete(buffer, completion_port_); |
629 | 629 |
630 if (!listen_socket->is_closing()) { | 630 if (!listen_socket->IsClosing()) { |
631 int event_mask = 1 << kInEvent; | 631 int event_mask = 1 << kInEvent; |
632 if ((listen_socket->mask() & event_mask) != 0) { | 632 if ((listen_socket->mask() & event_mask) != 0) { |
633 Dart_PostIntArray(listen_socket->port(), 1, &event_mask); | 633 Dart_PostIntArray(listen_socket->port(), 1, &event_mask); |
634 } | 634 } |
635 } | 635 } |
636 | 636 |
637 if (listen_socket->IsClosed()) { | 637 if (listen_socket->IsClosed()) { |
638 delete listen_socket; | 638 delete listen_socket; |
639 } | 639 } |
640 } | 640 } |
641 | 641 |
642 | 642 |
643 void EventHandlerImplementation::HandleClosed(Handle* handle) { | 643 void EventHandlerImplementation::HandleClosed(Handle* handle) { |
644 if (!handle->is_closing()) { | 644 if (!handle->IsClosing()) { |
645 int event_mask = 1 << kCloseEvent; | 645 int event_mask = 1 << kCloseEvent; |
646 if ((handle->mask() & event_mask) != 0) { | 646 if ((handle->mask() & event_mask) != 0) { |
647 Dart_PostIntArray(handle->port(), 1, &event_mask); | 647 Dart_PostIntArray(handle->port(), 1, &event_mask); |
648 } | 648 } |
649 } | 649 } |
650 } | 650 } |
651 | 651 |
652 | 652 |
653 void EventHandlerImplementation::HandleRead(ClientSocket* client_socket, | 653 void EventHandlerImplementation::HandleRead(Handle* handle, |
654 int bytes, | 654 int bytes, |
655 IOBuffer* buffer) { | 655 IOBuffer* buffer) { |
656 buffer->set_data_length(bytes); | 656 buffer->set_data_length(bytes); |
657 client_socket->ReadComplete(buffer); | 657 handle->ReadComplete(buffer); |
658 if (bytes > 0) { | 658 if (bytes > 0) { |
659 if (!client_socket->is_closing()) { | 659 if (!handle->IsClosing()) { |
660 int event_mask = 1 << kInEvent; | 660 int event_mask = 1 << kInEvent; |
661 if ((client_socket->mask() & event_mask) != 0) { | 661 if ((handle->mask() & event_mask) != 0) { |
662 Dart_PostIntArray(client_socket->port(), 1, &event_mask); | 662 Dart_PostIntArray(handle->port(), 1, &event_mask); |
663 } | 663 } |
664 } | 664 } |
665 } else { | 665 } else { |
666 ASSERT(bytes == 0); | 666 ASSERT(bytes == 0); |
667 client_socket->MarkClosedRead(); | 667 handle->MarkClosedRead(); |
668 HandleClosed(client_socket); | 668 HandleClosed(handle); |
669 } | 669 } |
670 | 670 |
671 if (client_socket->IsClosed()) { | 671 if (handle->IsClosed()) { |
672 delete client_socket; | 672 delete handle; |
673 } | 673 } |
674 } | 674 } |
675 | 675 |
676 | 676 |
677 void EventHandlerImplementation::HandleWrite(ClientSocket* client_socket, | 677 void EventHandlerImplementation::HandleWrite(Handle* handle, |
678 int bytes, | 678 int bytes, |
679 IOBuffer* buffer) { | 679 IOBuffer* buffer) { |
680 client_socket->WriteComplete(buffer); | 680 handle->WriteComplete(buffer); |
681 | 681 |
682 if (bytes > 0) { | 682 if (bytes > 0) { |
683 if (!client_socket->is_closing()) { | 683 if (!handle->IsClosing()) { |
684 int event_mask = 1 << kOutEvent; | 684 int event_mask = 1 << kOutEvent; |
685 if ((client_socket->mask() & event_mask) != 0) { | 685 if ((handle->mask() & event_mask) != 0) { |
686 Dart_PostIntArray(client_socket->port(), 1, &event_mask); | 686 Dart_PostIntArray(handle->port(), 1, &event_mask); |
687 } | 687 } |
688 } | 688 } |
689 } else { | 689 } else { |
690 ASSERT(bytes == 0); | 690 ASSERT(bytes == 0); |
691 HandleClosed(client_socket); | 691 HandleClosed(handle); |
692 } | 692 } |
693 | 693 |
694 if (client_socket->IsClosed()) { | 694 if (handle->IsClosed()) { |
695 delete client_socket; | 695 delete handle; |
696 } | 696 } |
697 } | 697 } |
698 | 698 |
699 | 699 |
700 void EventHandlerImplementation::HandleTimeout() { | 700 void EventHandlerImplementation::HandleTimeout() { |
701 // TODO(sgjesse) check if there actually is a timeout. | 701 // TODO(sgjesse) check if there actually is a timeout. |
702 Dart_PostIntArray(timeout_port_, 0, NULL); | 702 Dart_PostIntArray(timeout_port_, 0, NULL); |
703 timeout_ = kInfinityTimeout; | 703 timeout_ = kInfinityTimeout; |
704 timeout_port_ = 0; | 704 timeout_port_ = 0; |
705 } | 705 } |
706 | 706 |
707 | 707 |
708 void EventHandlerImplementation::HandleIOCompletion(DWORD bytes, | 708 void EventHandlerImplementation::HandleIOCompletion(DWORD bytes, |
709 ULONG_PTR key, | 709 ULONG_PTR key, |
710 OVERLAPPED* overlapped) { | 710 OVERLAPPED* overlapped) { |
711 IOBuffer* buffer = IOBuffer::GetFromOverlapped(overlapped); | 711 IOBuffer* buffer = IOBuffer::GetFromOverlapped(overlapped); |
712 switch (buffer->operation()) { | 712 switch (buffer->operation()) { |
713 case IOBuffer::kAccept: { | 713 case IOBuffer::kAccept: { |
714 ListenSocket* listen_socket = reinterpret_cast<ListenSocket*>(key); | 714 ListenSocket* listen_socket = reinterpret_cast<ListenSocket*>(key); |
715 HandleAccept(listen_socket, buffer); | 715 HandleAccept(listen_socket, buffer); |
716 break; | 716 break; |
717 } | 717 } |
718 case IOBuffer::kRead: { | 718 case IOBuffer::kRead: { |
719 ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(key); | 719 Handle* handle = reinterpret_cast<Handle*>(key); |
720 HandleRead(client_socket, bytes, buffer); | 720 HandleRead(handle, bytes, buffer); |
721 break; | 721 break; |
722 } | 722 } |
723 case IOBuffer::kWrite: { | 723 case IOBuffer::kWrite: { |
724 ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(key); | 724 Handle* handle = reinterpret_cast<Handle*>(key); |
725 HandleWrite(client_socket, bytes, buffer); | 725 HandleWrite(handle, bytes, buffer); |
726 break; | 726 break; |
727 } | 727 } |
728 default: | 728 default: |
729 UNREACHABLE(); | 729 UNREACHABLE(); |
730 } | 730 } |
731 } | 731 } |
732 | 732 |
733 | 733 |
734 EventHandlerImplementation::EventHandlerImplementation() { | 734 EventHandlerImplementation::EventHandlerImplementation() { |
735 intptr_t result; | 735 intptr_t result; |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
826 _beginthreadex(NULL, 32 * 1024, EventHandlerThread, this, 0, &tid); | 826 _beginthreadex(NULL, 32 * 1024, EventHandlerThread, this, 0, &tid); |
827 if (thread_handle == -1) { | 827 if (thread_handle == -1) { |
828 FATAL("Failed to start event handler thread"); | 828 FATAL("Failed to start event handler thread"); |
829 } | 829 } |
830 | 830 |
831 // Initialize Winsock32 | 831 // Initialize Winsock32 |
832 if (!Socket::Initialize()) { | 832 if (!Socket::Initialize()) { |
833 FATAL("Failed to initialized Windows sockets"); | 833 FATAL("Failed to initialized Windows sockets"); |
834 } | 834 } |
835 } | 835 } |
OLD | NEW |