Keine Beschreibung
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

main-header.h 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. #ifndef __main_header_h__
  2. #define __main_header_h__
  3. // all this is for the homework side of things
  4. int do_trace = 0;
  5. int do_timing = 0;
  6. #define p0 do_pause(id, 1, 0, "p0");
  7. #define p1 do_pause(id, 1, 1, "p1");
  8. #define p2 do_pause(id, 1, 2, "p2");
  9. #define p3 do_pause(id, 1, 3, "p3");
  10. #define p4 do_pause(id, 1, 4, "p4");
  11. #define p5 do_pause(id, 1, 5, "p5");
  12. #define p6 do_pause(id, 1, 6, "p6");
  13. #define c0 do_pause(id, 0, 0, "c0");
  14. #define c1 do_pause(id, 0, 1, "c1");
  15. #define c2 do_pause(id, 0, 2, "c2");
  16. #define c3 do_pause(id, 0, 3, "c3");
  17. #define c4 do_pause(id, 0, 4, "c4");
  18. #define c5 do_pause(id, 0, 5, "c5");
  19. #define c6 do_pause(id, 0, 6, "c6");
  20. int producer_pause_times[MAX_THREADS][7];
  21. int consumer_pause_times[MAX_THREADS][7];
  22. // needed to avoid interleaving of print out from threads
  23. pthread_mutex_t print_lock = PTHREAD_MUTEX_INITIALIZER;
  24. void do_print_headers() {
  25. if (do_trace == 0)
  26. return;
  27. int i;
  28. printf("%3s ", "NF");
  29. for (i = 0; i < max; i++) {
  30. printf(" %3s ", " ");
  31. }
  32. printf(" ");
  33. for (i = 0; i < producers; i++)
  34. printf("P%d ", i);
  35. for (i = 0; i < consumers; i++)
  36. printf("C%d ", i);
  37. printf("\n");
  38. }
  39. void do_print_pointers(int index) {
  40. if (use_ptr == index && fill_ptr == index) {
  41. printf("*");
  42. } else if (use_ptr == index) {
  43. printf("u");
  44. } else if (fill_ptr == index) {
  45. printf("f");
  46. } else {
  47. printf(" ");
  48. }
  49. }
  50. void do_print_buffer() {
  51. int i;
  52. printf("%3d [", num_full);
  53. for (i = 0; i < max; i++) {
  54. do_print_pointers(i);
  55. if (buffer[i] == EMPTY) {
  56. printf("%3s ", "---");
  57. } else if (buffer[i] == END_OF_STREAM) {
  58. printf("%3s ", "EOS");
  59. } else {
  60. printf("%3d ", buffer[i]);
  61. }
  62. }
  63. printf("] ");
  64. }
  65. void do_eos() {
  66. if (do_trace) {
  67. Mutex_lock(&print_lock);
  68. do_print_buffer();
  69. //printf("%3d [added end-of-stream marker]\n", num_full);
  70. printf("[main: added end-of-stream marker]\n");
  71. Mutex_unlock(&print_lock);
  72. }
  73. }
  74. void do_pause(int thread_id, int is_producer, int pause_slot, char *str) {
  75. int i;
  76. if (do_trace) {
  77. Mutex_lock(&print_lock);
  78. do_print_buffer();
  79. // skip over other thread's spots
  80. for (i = 0; i < thread_id; i++) {
  81. printf(" ");
  82. }
  83. printf("%s\n", str);
  84. Mutex_unlock(&print_lock);
  85. }
  86. int local_id = thread_id;
  87. int pause_time;
  88. if (is_producer) {
  89. pause_time = producer_pause_times[local_id][pause_slot];
  90. } else {
  91. local_id = thread_id - producers;
  92. pause_time = consumer_pause_times[local_id][pause_slot];
  93. }
  94. // printf(" PAUSE %d\n", pause_time);
  95. sleep(pause_time);
  96. }
  97. void ensure(int expression, char *msg) {
  98. if (expression == 0) {
  99. fprintf(stderr, "%s\n", msg);
  100. exit(1);
  101. }
  102. }
  103. void parse_pause_string(char *str, char *name, int expected_pieces,
  104. int pause_array[MAX_THREADS][7]) {
  105. // string looks like this (or should):
  106. // 1,2,0:2,3,4,5
  107. // n-1 colons if there are n producers/consumers
  108. // comma-separated for sleep amounts per producer or consumer
  109. int index = 0;
  110. char *copy_entire = strdup(str);
  111. char *outer_marker;
  112. int colon_count = 0;
  113. char *p = strtok_r(copy_entire, ":", &outer_marker);
  114. while (p) {
  115. // init array: default sleep is 0
  116. int i;
  117. for (i = 0; i < 7; i++)
  118. pause_array[index][i] = 0;
  119. // for each piece, comma separated
  120. char *inner_marker;
  121. char *copy_piece = strdup(p);
  122. char *c = strtok_r(copy_piece, ",", &inner_marker);
  123. int comma_count = 0;
  124. int inner_index = 0;
  125. while (c) {
  126. int pause_amount = atoi(c);
  127. ensure(inner_index < 7, "you specified a sleep string incorrectly... (too many comma-separated args)");
  128. // printf("setting %s pause %d to %d\n", name, inner_index, pause_amount);
  129. pause_array[index][inner_index] = pause_amount;
  130. inner_index++;
  131. c = strtok_r(NULL, ",", &inner_marker);
  132. comma_count++;
  133. }
  134. free(copy_piece);
  135. index++;
  136. // continue with colon separated list
  137. p = strtok_r(NULL, ":", &outer_marker);
  138. colon_count++;
  139. }
  140. free(copy_entire);
  141. if (expected_pieces != colon_count) {
  142. fprintf(stderr, "Error: expected %d %s in sleep specification, got %d\n", expected_pieces, name, colon_count);
  143. exit(1);
  144. }
  145. }
  146. #endif // __main_header_h__