pastebin

Paste Search Dynamic
Recent pastes
os61
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <time.h>
  6. #define MAX_LEN 255
  7. #define PAGES_COUNT 20
  8. #define PAGE_SIZE 4096
  9.  
  10. FILE *logfile;
  11. HANDLE mapHandle = null;
  12. LPVOID mapAddr = null;
  13.  
  14. void logTime(char* str) {
  15.     FILETIME fileTime;
  16.     GetSystemTimePreciseAsFileTime(&fileTime);
  17.     LARGE_INTEGER intTime;
  18.     intTime.LowPart = fileTime.dwLowDateTime;
  19.     intTime.HighPart = fileTime.dwHighDateTime;
  20.     printf("Время %I64d: %s\n", intTime.QuadPart, str);
  21.     fprintf(logfile, "Время %I64d: %s\n", intTime.QuadPart, str);
  22. }
  23.  
  24.  
  25. void createMappingFile() {
  26.        
  27.     PLARGE_INTEGER mapSize = (PLARGE_INTEGER)malloc(sizeof *mapSize);
  28.     mapSize -> QuadPart = PAGES_COUNT*PAGE_SIZE;
  29.     mapHandle = CreateFileMappingA(INVALID_HANDLE_VALUE, null, PAGE_READWRITE, mapSize -> HighPart, mapSize -> LowPart, "buffer");
  30.     printf("Handle = %p\n", mapHandle);
  31.     if (!mapHandle)
  32.         printf("Ошибка: код ошибки %ld\n", GetLastError());
  33.     else if (GetLastError() == ERROR_ALREADY_EXISTS)
  34.         printf("Проецируемый файл уже существует\n");
  35.     free(mapSize);
  36.        
  37. }
  38.  
  39. void mapView() {
  40.     mapAddr = MapViewOfFile(mapHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  41.     if (!mapAddr)
  42.         printf("Ошибка: код ошибки %ld\n", GetLastError());
  43.     else
  44.         printf("Файл успешно спроецирован по адресу %p\n", mapAddr);
  45. }
  46.  
  47. void setData(int pageNumber) {
  48.    
  49.     if ((pageNumber >= 0) && (pageNumber < PAGES_COUNT)) {
  50.         char buf[PAGE_SIZE];
  51.         int deltime = rand()%1001 + 500;
  52.         sprintf(buf, "Some data at page %d in %d ms", pageNumber, deltime);
  53.         logTime(buf);
  54.         if (mapAddr) {
  55.             memcpy(mapAddr + pageNumber*PAGE_SIZE, buf, PAGE_SIZE);
  56.         }
  57.         else {
  58.             printf("Ошибка при вводе данных\n");
  59.         }
  60.         Sleep(deltime);
  61.     }
  62. }
  63.  
  64.  
  65. int main()
  66. {
  67.     system("chcp.com 65001");
  68.     srand(time(null));
  69.     char buf[80];
  70.     sprintf(buf, "logs/logwrite_%ld.txt", GetCurrentProcessId());
  71.     logfile = fopen(buf, "w");
  72.     mapHandle = OpenFileMappingA(FILE_MAP_ALL_ACCESS, true, "buffer");
  73.     if (!mapHandle)
  74.         createMappingFile();
  75.     mapView();
  76.     if (VirtualLock(mapAddr, PAGES_COUNT*PAGE_SIZE))
  77.         printf("Страницы успешно заблокированы\n");
  78.     HANDLE writeSemHandle = OpenSemaphore(SEMAPHORE_ALL_ACCESS, false, "writeSemaphore");
  79.     if (!writeSemHandle) {
  80.         writeSemHandle = CreateSemaphore(null, PAGES_COUNT, PAGES_COUNT, "writeSemaphore");
  81.         if (!writeSemHandle)
  82.             printf("Ошибка: код ошибки %ld\n", GetLastError());
  83.     }
  84.     HANDLE readSemHandle = OpenSemaphore(SEMAPHORE_ALL_ACCESS, false, "readSemaphore");
  85.     if (!readSemHandle) {
  86.         readSemHandle = CreateSemaphore(null, 0, PAGES_COUNT, "readSemaphore");
  87.         if (!readSemHandle)
  88.             printf("Ошибка: код ошибки %ld\n", GetLastError());
  89.     }
  90.     HANDLE pageMutex[PAGES_COUNT];
  91.     for (int i = 0; i<PAGES_COUNT; ++i) {
  92.         char name[80];
  93.         sprintf(name, "mutex%d", i);
  94.         pageMutex[i] = OpenMutex(MUTEX_ALL_ACCESS, false, name);
  95.         if (!pageMutex[i]) {
  96.             pageMutex[i] = CreateMutex(null, false, name);
  97.             if (!pageMutex[i])
  98.                 printf("Ошибка: код ошибки %ld\n", GetLastError());
  99.         }
  100.     }
  101.     while (1) {
  102.         logTime("Waiting for Semaphore");
  103.         WaitForSingleObject(writeSemHandle, INFINITE);
  104.         logTime("Waiting for mutex");
  105.         int index = WaitForMultipleObjects(PAGES_COUNT, pageMutex, false, INFINITE) - WAIT_OBJECT_0;
  106.         char ind[80];
  107.         sprintf(ind, "Writing to page %d", index);
  108.         setData(index);
  109.         logTime("Releasing");
  110.         ReleaseMutex(pageMutex[index]);
  111.         ReleaseSemaphore(readSemHandle, 1, null);
  112.     }
  113.    
  114.     CloseHandle(mapHandle);
  115.    
  116.     return 0;
  117. }
  118.  
  119.  
  120. #include <windows.h>
  121. #include <stdio.h>
  122. #include <stdlib.h>
  123. #include <string.h>
  124. #include <time.h>
  125. #define MAX_LEN 255
  126. #define PAGES_COUNT 20
  127. #define PAGE_SIZE 4096
  128.  
  129. FILE *logfile;
  130. HANDLE mapHandle = null;
  131. LPVOID mapAddr = null;
  132.  
  133. void logTime(char* str) {
  134.     FILETIME fileTime;
  135.     GetSystemTimePreciseAsFileTime(&fileTime);
  136.     LARGE_INTEGER intTime;
  137.     intTime.LowPart = fileTime.dwLowDateTime;
  138.     intTime.HighPart = fileTime.dwHighDateTime;
  139.     printf("Время %I64d: %s\n", intTime.QuadPart, str);
  140.     fprintf(logfile, "Время %I64d: %s\n", intTime.QuadPart, str);
  141. }
  142.  
  143. void createMappingFile() {
  144.        
  145.     PLARGE_INTEGER mapSize = (PLARGE_INTEGER)malloc(sizeof *mapSize);
  146.     mapSize -> QuadPart = PAGES_COUNT*PAGE_SIZE;
  147.     mapHandle = CreateFileMappingA(INVALID_HANDLE_VALUE, null, PAGE_READWRITE, mapSize -> HighPart, mapSize -> LowPart, "buffer");
  148.     printf("Handle = %p\n", mapHandle);
  149.     if (!mapHandle)
  150.         printf("Ошибка: код ошибки %ld\n", GetLastError());
  151.     else if (GetLastError() == ERROR_ALREADY_EXISTS)
  152.         printf("Проецируемый файл уже существует\n");
  153.     free(mapSize);
  154.        
  155. }
  156.  
  157. void mapView() {
  158.     mapAddr = MapViewOfFile(mapHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  159.     if (!mapAddr)
  160.         printf("Ошибка: код ошибки %ld\n", GetLastError());
  161.     else
  162.         printf("Файл успешно спроецирован по адресу %p\n", mapAddr);
  163. }
  164.  
  165. void getData(int pageNumber) {
  166.     if (mapAddr) {
  167.         logTime((char *) (mapAddr + pageNumber*PAGE_SIZE));
  168.         Sleep(rand()%1001 + 500);
  169.     }
  170.     else
  171.         printf("Ошибка получения данных\n");
  172. }
  173.  
  174.  
  175. int main()
  176. {
  177.     system("chcp.com 65001");
  178.     srand(time(null));
  179.     char buf[80];
  180.     sprintf(buf, "logs/logread_%ld.txt", GetCurrentProcessId());
  181.     logfile = fopen(buf, "w");
  182.     mapHandle = OpenFileMappingA(FILE_MAP_ALL_ACCESS, true, "buffer");
  183.         if (!mapHandle)
  184.             createMappingFile();
  185.         else
  186.             printf("Файл открыт\n");
  187.     mapView();
  188.     if (VirtualLock(mapAddr, PAGES_COUNT*PAGE_SIZE))
  189.         printf("Страницы успешно заблокированы\n");
  190.     HANDLE writeSemHandle = OpenSemaphore(SEMAPHORE_ALL_ACCESS, false, "writeSemaphore");
  191.     if (!writeSemHandle) {
  192.         writeSemHandle = CreateSemaphore(null, PAGES_COUNT, PAGES_COUNT, "writeSemaphore");
  193.         if (!writeSemHandle)
  194.             printf("Ошибка: код ошибки %ld\n", GetLastError());
  195.     }
  196.     HANDLE readSemHandle = OpenSemaphore(SEMAPHORE_ALL_ACCESS, false, "readSemaphore");
  197.     if (!readSemHandle) {
  198.         readSemHandle = CreateSemaphore(null, 0, PAGES_COUNT, "readSemaphore");
  199.         if (!readSemHandle)
  200.             printf("Ошибка: код ошибки %ld\n", GetLastError());
  201.     }
  202.     HANDLE pageMutex[PAGES_COUNT];
  203.     for (int i = 0; i<PAGES_COUNT; ++i) {
  204.         char name[80];
  205.         sprintf(name, "mutex%d", i);
  206.         pageMutex[i] = OpenMutex(MUTEX_ALL_ACCESS, false, name);
  207.         if (!pageMutex[i]) {
  208.             pageMutex[i] = CreateMutex(null, false, name);
  209.             if (!pageMutex[i])
  210.                 printf("Ошибка: код ошибки %ld\n", GetLastError());
  211.         }
  212.     }
  213.     while (1) {
  214.         logTime("Waiting for Semaphore");
  215.         WaitForSingleObject(readSemHandle, INFINITE);
  216.         logTime("Waiting for mutex");
  217.         int index = WaitForMultipleObjects(PAGES_COUNT, pageMutex, false, INFINITE) - WAIT_OBJECT_0;
  218.         char ind[80];
  219.         sprintf(ind, "Reading page %d", index);
  220.         getData(index);
  221.         logTime("Releasing");
  222.         ReleaseMutex(pageMutex[index]);
  223.         ReleaseSemaphore(writeSemHandle, 1, null);
  224.     }
  225.     CloseHandle(mapHandle);
  226.    
  227.     return 0;
  228. }
Parsed in 0.066 seconds