Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.05 KB | None | 0 0
  1. typedef struct _WORK {
  2.   LIST_ENTRY Entry;
  3.   PVOID Routine;
  4.   PVOID Arg;
  5.   HANDLE finished;
  6. } WORK, *PWORK;
  7.  
  8. LIST_ENTRY WorkQueue;
  9. RTL_CRITICAL_SECTION section;
  10. HANDLE QueueSem;
  11.  
  12. PWORK CreateWork(PVOID aRoutine, PVOID aArg)
  13. {
  14.   PWORK ret = malloc(sizeof(WORK));
  15.   if (ret != NULL) {
  16.     InicializeListHead(&ret->Entry);
  17.     ret->Routine = aRoutine;
  18.     ret->Arg = aArg;
  19.     ret->finished = CreateEvent(...., NULL); // unnamed
  20.   }
  21.  
  22.   return ret;
  23. }
  24.  
  25. VOID QueueWork(PWORK aWork)
  26. {
  27.   EnterCriticalSection(&section);
  28.   InsertTailList(&WorkQueue, &aWork->Entry);
  29.   LeaveCriticalSection(&section);
  30.   ReleaseSemaphore(QueueSem, 1ú; // zvysime citac
  31.   return;
  32. }
  33.  
  34. PWORK GetWork(VOID)
  35. {
  36.   EnterCriticalSection(&section);
  37.   PWORK ret = RemoveHeadList(&WorkQueue);
  38.   LeaveCriticalSection(&section);
  39.   return;
  40. }
  41.  
  42. VOID __stdcall ThreadPoolThreadProc(PVOID NevimCo)
  43. {
  44.   do {
  45.     WaitForSingleObject(QueueSem, INFINITE);
  46.     PWORK wrk = GetWork();
  47.     wrk->Routine(wrk->Arg);
  48.     SetEvent(wrk->Finished;
  49.   } while (!konec);
  50.  
  51.   return;
  52. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement