Guest User

Untitled

a guest
Feb 24th, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.66 KB | None | 0 0
  1. #include <winsock2.h>
  2. #include <mswsock.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <time.h>
  6.  
  7. #pragma comment(lib,"ws2_32") // Standard socket API.
  8. #pragma comment(lib,"mswsock") // AcceptEx, TransmitFile, etc,.
  9. #pragma comment(lib,"shlwapi") // UrlUnescape.
  10.  
  11. #define WORKER_MAX_THREAD_COUNT 256
  12. #define DATA_BUFSIZE 4096
  13.  
  14. enum
  15. {
  16. COMPLETION_KEY_NONE = 0,
  17. COMPLETION_KEY_SHUTDOWN = 1,
  18. COMPLETION_KEY_USER_TASK = 2,
  19. COMPLETION_KEY_USER_DATA_LOAD = 3
  20. };
  21.  
  22. static void dump_error(int err) {
  23. LPSTR messageBuffer = 0;
  24. size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
  25. NULL, WSAGetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL);
  26. fprintf(stderr, "--- [err: %d] %s\n", err, messageBuffer);
  27. LocalFree(messageBuffer);
  28. }
  29.  
  30. static unsigned int __stdcall WorkerProc(void* IoPort) {
  31. fprintf(stderr, "- Event loop started [id: %d]\n", GetCurrentThreadId());
  32.  
  33. for (;;)
  34. {
  35. BOOL Status = 0;
  36. DWORD NumTransferred = 0;
  37. ULONG_PTR CompKey = COMPLETION_KEY_NONE;
  38. LPOVERLAPPED pOver = 0;
  39.  
  40. Status = GetQueuedCompletionStatus((HANDLE)IoPort, &NumTransferred, &CompKey, &pOver, INFINITE);
  41. if (Status == FALSE) {
  42. int err = WSAGetLastError();
  43. if (err != WSA_IO_PENDING) {
  44. dump_error(err);
  45. }
  46.  
  47. continue;
  48. }
  49.  
  50. //-
  51. if (COMPLETION_KEY_SHUTDOWN == CompKey)
  52. break;
  53.  
  54. if (COMPLETION_KEY_USER_TASK == CompKey) {
  55. //fprintf(stderr, "- Processing [id: %d]\n", GetCurrentThreadId());
  56. time_t endTime = time(NULL) + 5;
  57. while (time(NULL) < endTime) {
  58. // do work here.
  59. }
  60. //fprintf(stderr, "- Done processing [id: %d]\n", GetCurrentThreadId());
  61. }
  62.  
  63. if (COMPLETION_KEY_USER_DATA_LOAD == CompKey) {
  64. //fprintf(stderr, "- Loading [id: %d]\n", GetCurrentThreadId());
  65. time_t endTime = time(NULL) + 5;
  66. while (time(NULL) < endTime) {
  67. // do work here.
  68. }
  69. }
  70. }
  71.  
  72. fprintf(stderr, "- Event loop done [id: %d]\n", GetCurrentThreadId());
  73. return 0;
  74. }
  75.  
  76. static void hang_in_there(void) {
  77. fprintf(stderr, "*** Press enter to exit ...");
  78. fgetc(stdin);
  79. }
  80.  
  81. int main(int argc, char **argv) {
  82. atexit(hang_in_there);
  83.  
  84. WSADATA wsaData = { 0 };
  85. WSAStartup(MAKEWORD(2, 2), &wsaData);
  86.  
  87. SYSTEM_INFO sysinfo;
  88. GetSystemInfo(&sysinfo);
  89. int numCPU = sysinfo.dwNumberOfProcessors;
  90.  
  91. HANDLE IoPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0);
  92. HANDLE IoLoadPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0);
  93.  
  94. HANDLE Workers[WORKER_MAX_THREAD_COUNT] = { 0 };
  95. unsigned int WorkerIds[WORKER_MAX_THREAD_COUNT] = { 0 };
  96.  
  97. Workers[0] = (HANDLE)_beginthreadex(0, 0, WorkerProc, IoLoadPort, 0, WorkerIds);
  98. SetThreadAffinityMask(Workers[0], 0x01);
  99.  
  100. for (size_t i = 1; i < numCPU; i++) {
  101. Workers[i] = (HANDLE)_beginthreadex(0, 0, WorkerProc, IoPort, 0, WorkerIds + i);
  102. SetThreadAffinityMask(Workers[i], 0xFE);
  103. }
  104.  
  105. for(;;)
  106. {
  107. fgetc(stdin);
  108. PostQueuedCompletionStatus(IoPort, 0, COMPLETION_KEY_USER_TASK, 0);
  109. //PostQueuedCompletionStatus(IoLoadPort, 0, COMPLETION_KEY_USER_DATA_LOAD, 0);
  110. }
  111.  
  112. for (size_t i = 0; i<numCPU; i++)
  113. PostQueuedCompletionStatus(IoPort, 0, COMPLETION_KEY_SHUTDOWN, 0);
  114. WaitForMultipleObjects(numCPU, Workers, TRUE, INFINITE);
  115. for (size_t i = 0; i<numCPU; i++)
  116. CloseHandle(Workers[i]);
  117. CloseHandle(IoPort);
  118.  
  119. WSACleanup();
  120. return 0;
  121. }
Add Comment
Please, Sign In to add comment