scc_signals.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669
  1. #include "scc_signals.h"
  2. #include "my_rtrm.h"
  3. #include "signal_handlers.h"
  4. #include "paxos_signal_handlers.h"
  5. #include "sig_aux.h"
  6. #include "libfunctions.h"
  7. #include "variables.h"
  8. #include "controller_core.h"
  9. int sig_read_ar[2 * LINE_SIZE];
  10. int R = 0;
  11. #ifdef IDAG_SLEEP
  12. #include <time.h>
  13. #define SLEEP_ROUND_DURATION_NSEC 50000000 //100000000
  14. extern int my_idag;
  15. #endif
  16. int find_sender_id(int SID){
  17. return SID % NUES;
  18. }
  19. int scc_kill(int target_ID, int sig, inter_list *ref_inter_list) {
  20. int sig_array_local[2 * LINE_SIZE], old_value, new_value, i, increase_cnt=1;
  21. int num_of_coworkers, counter;
  22. core_list *tmp_core_list;
  23. #ifdef PLAT_SCC
  24. int str_len;
  25. char error_str[64];
  26. #endif
  27. int error = 0;
  28. signals_disable();
  29. if (ref_inter_list == NULL)
  30. fprintf(log_file,"target_ID %d and sig %s ref_inter_list is NULL\n",target_ID,sig2string(sig));
  31. //19.12.2015 Initial node sends SIG_INIT_APP when an app has terminated and receives no reply.
  32. //Thus we dont initialize our counter. Same for SIG_ACK and SIG_FINISH
  33. #if defined(tPFD) || defined(tEPFD)
  34. if (
  35. (sig != SIG_INIT_APP) && (sig != SIG_ACK) && (sig != SIG_ADD_TO_DDS) && (sig != SIG_INIT)
  36. && (sig != SIG_PREPARE_REQUEST) && (sig != SIG_PREPARE_ACCEPT_NO_PREVIOUS) && (sig != SIG_PREPARE_ACCEPT)
  37. && (sig != SIG_ACCEPT_REQUEST) && (sig != SIG_ACCEPTED) && (sig != SIG_LEARN) && (sig != SIG_LEARN_ACK)
  38. && (sig != SIG_LEARN_ACK_CONTR) && (sig != SIG_REINIT_APP) && (sig != SIG_CONTR_TO) && (sig != SIG_REMOVE_FROM_DDS)
  39. && (sig != SIG_FAIL) && (sig != SIG_FINISH)
  40. ){
  41. //suspected[target_ID]++;
  42. //alive[target_ID] = 0;
  43. }
  44. #endif
  45. for (i=0; i<LINE_SIZE; i++)
  46. sig_array_local[i] = sig;
  47. if (sig != SIG_HEARTBEAT_REP && sig != SIG_HEARTBEAT_REQ){
  48. sig_array_local[1] = R++ * NUES + node_id;
  49. }else{
  50. sig_array_local[1] = node_id;
  51. }
  52. if (ref_inter_list != NULL) { //for a signal not associated with no inter_list interaction like SIG_FINISH
  53. if (strcmp(sig2string(sig),"SIG_HEARTBEAT_REQ") != 0 && strcmp(sig2string(sig), "SIG_HEARTBEAT_REP") != 0)
  54. fprintf(log_file,"\t\tI enter here with target_ID %d and sig %s {%d} type = %s\n",target_ID,sig2string(sig), sig_array_local[1], inter2string(ref_inter_list->type));
  55. if (ref_inter_list->type == INIT_APP) {
  56. sig_array_local[2] = ref_inter_list->data.new_app.id;
  57. sig_array_local[3] = ref_inter_list->data.new_app.app_type;
  58. sig_array_local[4] = ref_inter_list->data.new_app.workld;
  59. sig_array_local[5] = ref_inter_list->data.new_app.num_of_cores;
  60. #ifndef ARTIFICIAL_APPS_SIM
  61. sig_array_local[6] = ref_inter_list->data.new_app.array_size;
  62. #else
  63. memcpy(&sig_array_local[6],&ref_inter_list->data.new_app.var,sizeof(int));
  64. memcpy(&sig_array_local[7],&ref_inter_list->data.new_app.A,sizeof(int));
  65. #endif
  66. //my_stats.message_size += sizeof(app);
  67. //clear = 1;
  68. } else if (ref_inter_list->type == IDAG_FIND_IDAGS_PENDING || ref_inter_list->type == SELFOPT_IDAG_FIND_IDAGS_PENDING) {//I am the requesting common node
  69. sig_array_local[2] = ref_inter_list->data.reg.C;
  70. sig_array_local[3] = ref_inter_list->data.reg.r;
  71. fprintf(log_file, "a C=%d r=%d\n",ref_inter_list->data.reg.C,ref_inter_list->data.reg.r);
  72. //if (ref_inter_list->type == IDAG_FIND_IDAGS_PENDING) ref_inter_list->type = IDAG_FIND_IDAGS;
  73. //else if (ref_inter_list->type == SELFOPT_IDAG_FIND_IDAGS_PENDING) ref_inter_list->type = SELFOPT_IDAG_FIND_IDAGS;
  74. //my_stats.message_size += sizeof(region);
  75. } else if (ref_inter_list->type == IDAG_REQ_DDS_PENDING || ref_inter_list->type == SELFOPT_IDAG_REQ_DDS_PENDING
  76. || ref_inter_list->type == DEBUG_IDAG_REQ_DDS) {
  77. sig_array_local[2] = ref_inter_list->data.reg.C;
  78. sig_array_local[3] = ref_inter_list->data.reg.r;
  79. fprintf(log_file, "a C=%d r=%d\n",ref_inter_list->data.reg.C,ref_inter_list->data.reg.r);
  80. //my_stats.message_size += sizeof(region);
  81. //if (ref_inter_list->type == IDAG_REQ_DDS_PENDING) ref_inter_list->type = IDAG_REQ_DDS;
  82. //if (ref_inter_list->type == SELFOPT_IDAG_REQ_DDS_PENDING) ref_inter_list->type = SELFOPT_IDAG_REQ_DDS;
  83. } else if (ref_inter_list->type == REP_IDAG_FIND_IDAGS) {//I am the idag
  84. sig_array_local[2] = ref_inter_list->data.idags_in_reg[num_idags];
  85. if (sig_array_local[2] > 5){
  86. increase_cnt = 2;
  87. }
  88. counter=3;
  89. for (i=0; i < num_idags; i++) {
  90. if (ref_inter_list->data.idags_in_reg[i]) {
  91. sig_array_local[counter++] = idag_id_arr[i];
  92. fprintf(log_file, "\t\tidag=%d\n",idag_id_arr[i]);
  93. my_stats.message_size += sizeof(int);
  94. }
  95. }
  96. } else if (ref_inter_list->type == REP_IDAG_REQ_DDS) {
  97. if (ref_inter_list->data.agents_in_reg == NULL)
  98. sig_array_local[2] = DDS_count;
  99. else
  100. sig_array_local[2] = ref_inter_list->data.agents_in_reg[0];
  101. } else if (ref_inter_list->type == AGENT_REQ_CORES_PENDING) {
  102. sig_array_local[2] = init_app.id;
  103. sig_array_local[3] = init_app.app_type;
  104. sig_array_local[4] = init_app.workld;
  105. sig_array_local[5] = init_app.num_of_cores;
  106. #ifndef ARTIFICIAL_APPS_SIM
  107. sig_array_local[6] = init_app.array_size;
  108. #else
  109. memcpy(&sig_array_local[6],&init_app.var,sizeof(int));
  110. memcpy(&sig_array_local[7],&init_app.A,sizeof(int));
  111. #endif
  112. /*
  113. sig_array_local[8] = ref_inter_list->data.reg_arr.region_arr[0].C;
  114. sig_array_local[9] = ref_inter_list->data.reg_arr.region_arr[0].r;
  115. increase_cnt = 2;
  116. */
  117. //fprintf(log_file, "Cores=%d r=%d\n",sig_array_local[5],ref_inter_list->data.reg_arr.region_arr[0].r);
  118. //free(ref_inter_list->data.reg_arr.region_arr);
  119. } else if (ref_inter_list->type == SELFOPT_REQ_CORES_PENDING) {
  120. sig_array_local[2] = my_app.id;
  121. sig_array_local[3] = my_app.app_type;
  122. sig_array_local[4] = my_app.workld;
  123. sig_array_local[5] = my_app.num_of_cores;
  124. #ifndef ARTIFICIAL_APPS_SIM
  125. sig_array_local[6] = my_app.array_size;
  126. #else
  127. memcpy(&sig_array_local[6],&my_app.var,sizeof(int));
  128. memcpy(&sig_array_local[7],&my_app.A,sizeof(int));
  129. #endif
  130. /*
  131. sig_array_local[8] = ref_inter_list->data.reg_arr.region_arr[0].C;
  132. sig_array_local[9] = ref_inter_list->data.reg_arr.region_arr[0].r;
  133. increase_cnt = 2;
  134. */
  135. //fprintf(log_file, "Cores=%d r=%d\n",sig_array_local[5],ref_inter_list->data.reg_arr.region_arr[0].r);
  136. //free(ref_inter_list->data.reg_arr.region_arr);
  137. } else if (ref_inter_list->type == REP_AGENT_REQ_CORES) {//I am the agent
  138. /* pre write these info and keep data_array only for cores. Besides, a great amount of offers will be zero */
  139. sig_array_local[2] = ref_inter_list->data.off_arr.num_of_offers;
  140. fprintf(log_file, "num_of_offers=%d\n",ref_inter_list->data.off_arr.num_of_offers);
  141. if (ref_inter_list->data.off_arr.num_of_offers > 0) {
  142. sig_array_local[3] = ref_inter_list->data.off_arr.offer_arr[0].num_of_cores;
  143. fprintf(log_file, "num_of_cores=%d\n",ref_inter_list->data.off_arr.offer_arr[0].num_of_cores);
  144. memcpy(&sig_array_local[4],&ref_inter_list->data.off_arr.offer_arr[0].spd_loss,sizeof(int));
  145. fprintf(log_file, "spd_loss=%0.2f\n",ref_inter_list->data.off_arr.offer_arr[0].spd_loss);
  146. }
  147. } else if (ref_inter_list->type == INIT_WORK_NODE) {
  148. if (ref_inter_list->data.work_bounds[0] != -1) {
  149. gettimeofday(&time_val, NULL);
  150. cur_t = localtime(&time_val.tv_sec);
  151. //fprintf(app_log_file,"[%d:%d:%d:%ld] I init work to %d\n",cur_t->tm_hour,cur_t->tm_min,cur_t->tm_sec,time_val.tv_usec,target_ID);
  152. /* 2.7.2016 - Changed by dimos - Instead of valid i send the app_id */
  153. sig_array_local[2] = my_app.id;
  154. sig_array_local[3] = node_id;
  155. sig_array_local[4] = my_app.app_type;
  156. sig_array_local[5] = ref_inter_list->data.work_bounds[0];
  157. sig_array_local[6] = ref_inter_list->data.work_bounds[1];
  158. #ifndef ARTIFICIAL_APPS_SIM
  159. sig_array_local[7] = my_app.array_size;
  160. #endif
  161. /********/
  162. fprintf(log_file, "work_time1=%d work_time2=%d\n",ref_inter_list->data.work_bounds[0],ref_inter_list->data.work_bounds[1]);
  163. //my_stats.message_size += 5 * sizeof(int);
  164. } else {
  165. sig_array_local[2] = -1;
  166. fprintf(log_file, "i=%d\n",sig_array_local[0]);
  167. //my_stats.message_size += sizeof(int);
  168. }
  169. //clear = 1;
  170. } else if (ref_inter_list->type == APPOINT_WORK_NODE) {
  171. if (ref_inter_list->data.work_bounds[0] != -1) {
  172. gettimeofday(&time_val, NULL);
  173. cur_t = localtime(&time_val.tv_sec);
  174. //fprintf(app_log_file,"[%d:%d:%d:%ld] I appoint work to %d\n",cur_t->tm_hour,cur_t->tm_min,cur_t->tm_sec,time_val.tv_usec,target_ID);
  175. /* 2.7.2016 - Changed by dimos - Instead of valid i send the app_id */
  176. sig_array_local[2] = my_app.id;
  177. /* 12.7.2017 Changed the order to be consistent with INIT_WORK_NODE */
  178. sig_array_local[4] = my_app.app_type;
  179. sig_array_local[5] = ref_inter_list->data.work_bounds[0];
  180. sig_array_local[6] = ref_inter_list->data.work_bounds[1];
  181. fprintf(log_file, "work_time1=%d work_time2=%d\n",ref_inter_list->data.work_bounds[0],ref_inter_list->data.work_bounds[1]);
  182. //my_stats.message_size += 3 * sizeof(int);
  183. } else {
  184. sig_array_local[2] = -1;
  185. //my_stats.message_size += sizeof(int);
  186. }
  187. //clear = 1;
  188. } else if (ref_inter_list->type == REP_AGENT_OFFER_SENT) {
  189. fprintf(log_file, "I have to reply %d for %d offers\n",target_ID,ref_inter_list->data.offer_acc_array[0]);
  190. sig_array_local[2] = ref_inter_list->data.offer_acc_array[1];
  191. fprintf(log_file, "offer_ans=%d\n",ref_inter_list->data.offer_acc_array[1]);
  192. //free(ref_inter_list->data.offer_acc_array);
  193. //clear = 1;
  194. } else if (ref_inter_list->type == IDAG_ADD_CORES_DDS) {
  195. sig_array_local[2] = ref_inter_list->data.app_cores[0];
  196. fprintf(log_file, "app_cores=%d\n",ref_inter_list->data.app_cores[0]);
  197. /* FIXME change position of orig_sender and new_owner in the creation of the list */
  198. //8 elements available, 3 allready in use
  199. if (my_idag != -1) {
  200. if (ref_inter_list->data.app_cores[0] > 5){
  201. increase_cnt=2;
  202. }
  203. for (i=1; i<=ref_inter_list->data.app_cores[0]; i++){
  204. sig_array_local[i+2] = ref_inter_list->data.app_cores[i];
  205. fprintf(log_file, "core=%d\n",ref_inter_list->data.app_cores[i]);
  206. }
  207. } else {
  208. //I am an idag and i have to send to other idags my original sender
  209. sig_array_local[3] = ref_inter_list->data.app_cores[ref_inter_list->data.app_cores[0]+1];
  210. fprintf(log_file, "orig_sender=%d\n",ref_inter_list->data.app_cores[ref_inter_list->data.app_cores[0]+1]);
  211. if (ref_inter_list->data.app_cores[0] > 4)
  212. increase_cnt++;
  213. for (i=1; i<=ref_inter_list->data.app_cores[0]; i++){
  214. sig_array_local[i+3] = ref_inter_list->data.app_cores[i];//LINE_SIZE+i-1
  215. fprintf(log_file, "core=%d\n",ref_inter_list->data.app_cores[i]);
  216. }
  217. }
  218. } else if (ref_inter_list->type == IDAG_REM_CORES_DDS) {
  219. //fprintf(log_file, "I am in add/remove/remove_app to %d with %d cores\n",sender_id,tmp_inter_list->data.app_cores[0]);
  220. sig_array_local[2] = ref_inter_list->data.app_cores[0];
  221. fprintf(log_file, "app_cores=%d\n",ref_inter_list->data.app_cores[0]);
  222. /* FIXME change position of orig_sender and new_owner in the creation of the list */
  223. //8 elements available, 3 allready in use
  224. if (my_idag != -1) {
  225. sig_array_local[3] = ref_inter_list->data.app_cores[ref_inter_list->data.app_cores[0]+1];
  226. fprintf(log_file, "new_owner=%d\n",ref_inter_list->data.app_cores[ref_inter_list->data.app_cores[0]+1]);
  227. if (ref_inter_list->data.app_cores[0] > 4)
  228. increase_cnt++;
  229. for (i=1; i<=ref_inter_list->data.app_cores[0]; i++) {
  230. sig_array_local[i+3] = ref_inter_list->data.app_cores[i];//LINE_SIZE+i-1
  231. fprintf(log_file, "core=%d\n",ref_inter_list->data.app_cores[i]);
  232. }
  233. } else {
  234. //I am an idag and i have to send to other idags my original sender
  235. sig_array_local[3] = ref_inter_list->data.app_cores[ref_inter_list->data.app_cores[0]+1];
  236. fprintf(log_file, "orig_sender=%d\n",ref_inter_list->data.app_cores[ref_inter_list->data.app_cores[0]+1]);
  237. sig_array_local[4] = ref_inter_list->data.app_cores[ref_inter_list->data.app_cores[0]+2];
  238. fprintf(log_file, "new_owner=%d\n",ref_inter_list->data.app_cores[ref_inter_list->data.app_cores[0]+2]);
  239. if (ref_inter_list->data.app_cores[0] > 3)
  240. increase_cnt++;
  241. for (i=1; i<=ref_inter_list->data.app_cores[0]; i++) {
  242. sig_array_local[i+4] = ref_inter_list->data.app_cores[i];//LINE_SIZE+i-1
  243. fprintf(log_file, "core=%d\n",ref_inter_list->data.app_cores[i]);
  244. }
  245. }
  246. } else if (ref_inter_list->type == REMOVE_APP) {
  247. //fprintf(log_file, "I am in add/remove/remove_app to %d with %d cores\n",sender_id,tmp_inter_list->data.app_cores[0]);
  248. sig_array_local[2] = ref_inter_list->data.app_cores[0];
  249. fprintf(log_file, "app_cores=%d\n",ref_inter_list->data.app_cores[0]);
  250. //8 elements available, 3 already in use
  251. if (my_idag != -1) {
  252. if (ref_inter_list->data.app_cores[0] > 5)
  253. increase_cnt++;
  254. for (i=1; i<=ref_inter_list->data.app_cores[0]; i++){
  255. sig_array_local[i+2] = ref_inter_list->data.app_cores[i];//LINE_SIZE+i-1
  256. fprintf(log_file, "core=%d\n",ref_inter_list->data.app_cores[i]);
  257. }
  258. } else {
  259. //I am an idag and i have to send to other idags my original sender
  260. sig_array_local[3] = ref_inter_list->data.app_cores[1];
  261. fprintf(log_file, "or_sender=%d\n",ref_inter_list->data.app_cores[0]);
  262. if (ref_inter_list->data.app_cores[0] > 4)
  263. increase_cnt++;
  264. for (i=2; i<=(ref_inter_list->data.app_cores[0]+1); i++){
  265. sig_array_local[i+2] = ref_inter_list->data.app_cores[i];//LINE_SIZE+i-1
  266. fprintf(log_file, "core=%d\n",ref_inter_list->data.app_cores[i]);
  267. }
  268. }
  269. /* PAXOS INTERACTIONS */
  270. } else if (ref_inter_list->type == PREPARE_REQUEST){
  271. paxos_node_stats.msg_count++;
  272. sig_array_local[2] = ref_inter_list->data.proposal_number; // proposal_number
  273. } else if (ref_inter_list->type == PREPARE_ACCEPT){
  274. paxos_node_stats.msg_count++;
  275. sig_array_local[2] = ref_inter_list->data.accepted_values[0]; // highest accepted proposal_number
  276. sig_array_local[3] = ref_inter_list->data.accepted_values[1]; // highest accepted value
  277. sig_array_local[4] = ref_inter_list->data.accepted_values[2]; // state
  278. } else if (ref_inter_list->type == PREPARE_ACCEPT_NO_PREVIOUS){
  279. paxos_node_stats.msg_count++;
  280. sig_array_local[2] = ref_inter_list->data.accepted_values[0]; // highest accepted proposal_number
  281. sig_array_local[3] = ref_inter_list->data.accepted_values[1]; // highest accepted value
  282. sig_array_local[4] = ref_inter_list->data.accepted_values[2]; // state
  283. } else if (ref_inter_list->type == ACCEPT_REQUEST){
  284. paxos_node_stats.msg_count++;
  285. sig_array_local[2] = ref_inter_list->data.accepted_values[0];
  286. sig_array_local[3] = ref_inter_list->data.accepted_values[1];
  287. } else if (ref_inter_list->type == ACCEPTED){
  288. paxos_node_stats.msg_count++;
  289. sig_array_local[2] = ref_inter_list->data.accepted_values[0];
  290. sig_array_local[3] = ref_inter_list->data.accepted_values[1];
  291. } else if (ref_inter_list->type == LEARN){
  292. paxos_node_stats.msg_count++;
  293. sig_array_local[2] = ref_inter_list->data.accepted_values[0];
  294. sig_array_local[3] = ref_inter_list->data.accepted_values[1];
  295. } else if (ref_inter_list->type == LEARN_ACK_CONTR){
  296. paxos_node_stats.msg_count++;
  297. sig_array_local[2] = ref_inter_list->data.controller_index;
  298. } else if (ref_inter_list-> type == REINIT_APP){
  299. paxos_node_stats.msg_count++;
  300. sig_array_local[2] = ref_inter_list->data.reappointed_app.id;
  301. sig_array_local[3] = ref_inter_list->data.reappointed_app.workld;
  302. sig_array_local[4] = ref_inter_list->data.reappointed_app.num_of_cores;
  303. #ifndef ARTIFICIAL_APPS_SIM
  304. sig_array_local[5] = ref_inter_list->data.reappointed_app.array_size;
  305. #endif
  306. } else if (ref_inter_list->type == ADD_TO_DDS){
  307. paxos_node_stats.msg_count++;
  308. sig_array_local[2] = ref_inter_list->data.workers_info[0];
  309. counter = ref_inter_list->data.workers_info[0];
  310. if (counter > 5){
  311. fprintf(log_file,"\t\tI am sending more than 5 workers. I have to use two lines!\n");
  312. increase_cnt = 2;
  313. }
  314. while (counter > 0){
  315. sig_array_local[2+counter] = ref_inter_list->data.workers_info[counter];
  316. fprintf(log_file,"\t\tsig_array_local[%d] = %d\n",2+counter,sig_array_local[2+counter]);
  317. counter--;
  318. }
  319. fprintf(log_file,"MY COUNTER = %d\n",sig_array_local[2]);
  320. } else if (ref_inter_list->type == REMOVE_FROM_DDS){
  321. paxos_node_stats.msg_count++;
  322. } else if (ref_inter_list->type == PAXOS_STATS_REQ){
  323. paxos_node_stats.msg_count++;
  324. } else if (ref_inter_list->type == PAXOS_STATS_REP){
  325. paxos_node_stats.msg_count++;
  326. sig_array_local[2] = ref_inter_list->data.paxos_stats[0];
  327. sig_array_local[3] = ref_inter_list->data.paxos_stats[1];
  328. } else if (ref_inter_list->type == HEARTBEAT_REQ){
  329. paxos_node_stats.fd_msg_count++;
  330. } else if (ref_inter_list->type == HEARTBEAT_REP){
  331. paxos_node_stats.fd_msg_count++;
  332. } else if (ref_inter_list->type == INIT_AGENT){
  333. sig_array_local[2] = ref_inter_list->data.one_app.new_app.id;
  334. sig_array_local[3] = ref_inter_list->data.one_app.new_app.app_type;
  335. sig_array_local[4] = ref_inter_list->data.one_app.new_app.workld;
  336. sig_array_local[5] = ref_inter_list->data.one_app.new_app.num_of_cores;
  337. #ifndef ARTIFICIAL_APPS_SIM
  338. sig_array_local[6] = ref_inter_list->data.one_app.new_app.array_size;
  339. #else
  340. memcpy(&sig_array_local[6],&ref_inter_list->data.one_app.new_app.var,sizeof(int));
  341. memcpy(&sig_array_local[7],&ref_inter_list->data.one_app.new_app.A,sizeof(int));
  342. #endif
  343. }
  344. /* END*/
  345. }
  346. #ifdef PLAT_SCC
  347. if (strcmp(sig2string(sig),"SIG_HEARTBEAT_REQ") != 0 && strcmp(sig2string(sig), "SIG_HEARTBEAT_REP") != 0){
  348. fprintf(log_file,"Trying to acquire lock %d\n",target_ID);
  349. }
  350. RCCE_acquire_lock(target_ID);
  351. //fprintf(log_file,"I successfully acquired lock %d\n",target_ID);
  352. RCCE_shflush();
  353. old_value = index_bottom[target_ID];
  354. if (strcmp(sig2string(sig),"SIG_HEARTBEAT_REQ") != 0 && strcmp(sig2string(sig), "SIG_HEARTBEAT_REP") != 0){
  355. fprintf(log_file,"I read bottom index %d increase_cnt=%d and target_ID %d\n",old_value,increase_cnt,target_ID);
  356. }
  357. error = RCCE_put((t_vcharp)(&sig_array[old_value*LINE_SIZE]), (t_vcharp)(&sig_array_local[0]), increase_cnt * LINE_SIZE * sizeof(int), target_ID);
  358. if (error != RCCE_SUCCESS) {
  359. RCCE_error_string(error, error_str, &str_len);
  360. fprintf(log_file,"I got an error in put with descr %s\n",error_str);
  361. fflush(log_file);
  362. }
  363. new_value = (old_value + increase_cnt) % MAX_SIGNAL_LIST_LEN;
  364. index_bottom[target_ID] = new_value;
  365. //RCCE_shflush();
  366. RCCE_release_lock(target_ID);
  367. if (strcmp(sig2string(sig),"SIG_HEARTBEAT_REQ") != 0 && strcmp(sig2string(sig), "SIG_HEARTBEAT_REP") != 0){
  368. fprintf(log_file,"I leave\n");
  369. }
  370. #else
  371. sem_wait(&scc_lock[target_ID]);
  372. old_value = index_bottom[target_ID];
  373. int mem_offset = target_ID * MAX_SIGNAL_LIST_LEN * LINE_SIZE;
  374. mem_offset += old_value * LINE_SIZE;
  375. if (strcmp(sig2string(sig),"SIG_HEARTBEAT_REQ") != 0 && strcmp(sig2string(sig), "SIG_HEARTBEAT_REP") != 0){
  376. fprintf(log_file,"I read bottom index %d increase_cnt=%d\n",old_value,increase_cnt);
  377. /*if (old_value == 63 && increase_cnt == 2){
  378. fprintf(log_file,"\t\tindex_bottom[%d]=%d.\n\t\tI wrote from position %d till %d and %d till %d\n",target_ID,index_bottom[target_ID],mem_offset,mem_offset+7,target_ID * MAX_SIGNAL_LIST_LEN * LINE_SIZE,target_ID * MAX_SIGNAL_LIST_LEN * LINE_SIZE + LINE_SIZE);
  379. }else{
  380. fprintf(log_file,"\t\tindex_bottom[%d]=%d.\n\t\tI wrote from position %d till %d\n",target_ID,index_bottom[target_ID],mem_offset,mem_offset+increase_cnt*LINE_SIZE);
  381. }*/
  382. }
  383. for (i=0; i<increase_cnt * LINE_SIZE; i++){
  384. if (old_value == MAX_SIGNAL_LIST_LEN-1 && increase_cnt == 2){
  385. if (i <= 7){
  386. sig_array[mem_offset + i] = sig_array_local[i];
  387. }else{
  388. sig_array[(target_ID * MAX_SIGNAL_LIST_LEN * LINE_SIZE) + i - LINE_SIZE] = sig_array_local[i];
  389. }
  390. }else{
  391. sig_array[mem_offset + i] = sig_array_local[i];
  392. }
  393. }
  394. new_value = (old_value + increase_cnt) % MAX_SIGNAL_LIST_LEN;
  395. index_bottom[target_ID] = new_value;
  396. sem_post(&scc_lock[target_ID]);
  397. #endif
  398. signals_enable();
  399. return error;
  400. }
  401. void scc_signals_check(void) {
  402. int sender_id, tmp_bottom, i, mem_offset, increase_cnt=1;
  403. char *sig_buf, *st_buf;
  404. //int sig_read_ar[LINE_SIZE]
  405. #ifdef PLAT_SCC
  406. int error, str_len;
  407. #endif
  408. char error_str[64];
  409. signals_disable();
  410. #ifdef PLAT_SCC
  411. RCCE_acquire_lock(node_id);
  412. #else
  413. sem_wait(&scc_lock[node_id]);
  414. #endif
  415. /* Overflow check */
  416. tmp_bottom = index_bottom[node_id];
  417. //last_index_bottom = tmp_bottom;
  418. while (index_top != tmp_bottom) {
  419. #ifdef EXTRA_DELAY
  420. scc_pause;
  421. #endif
  422. #ifdef PLAT_SCC
  423. error = RCCE_get((t_vcharp)(&sig_read_ar[0]), (t_vcharp)(&sig_array[index_top*LINE_SIZE]), LINE_SIZE * sizeof(int), node_id);
  424. RCCE_release_lock(node_id);
  425. if (error != RCCE_SUCCESS) {
  426. RCCE_error_string(error, error_str, &str_len);
  427. fprintf(log_file,"I got an error in get from %d with descr %s\n",sender_id,error_str);
  428. fflush(log_file);
  429. #else
  430. mem_offset = (node_id * MAX_SIGNAL_LIST_LEN * LINE_SIZE) + (index_top * LINE_SIZE); //node offset
  431. for (i = 0; i < LINE_SIZE; i++)
  432. sig_read_ar[i] = sig_array[mem_offset + i];
  433. sem_post(&scc_lock[node_id]);
  434. error_str[0] = '0';
  435. if (error_str[0] == '1') {
  436. printf("DAFUQ ?\n");
  437. #endif
  438. } else {
  439. sender_id = find_sender_id(sig_read_ar[1]);
  440. if (sig_read_ar[0] != NO_SIG){
  441. st_buf = id2string(state);
  442. sig_buf = sig2string(sig_read_ar[0]);
  443. if (strcmp(sig2string(sig_read_ar[0]),"Unknown Sig") == 0){
  444. fprintf(log_file,"I read Unknown sig and its number is %d\n",sig_read_ar[0]);
  445. }else if (strcmp(sig2string(sig_read_ar[0]),"SIG_HEARTBEAT_REQ") != 0 && strcmp(sig2string(sig_read_ar[0]), "SIG_HEARTBEAT_REP") != 0){
  446. fprintf(log_file,"\t\tmy index_top = %d and index_bottom = %d\n",index_top,tmp_bottom);
  447. fprintf(log_file,"\t\tI read sig %s {%d} - %d from sender_id %d. Current state = %s\n",sig_buf, sig_read_ar[1], sig_read_ar[0], sender_id, st_buf);
  448. //fprintf(log_file,"\t\tindex_top[%d]=%d.\n\t\tI read from position %d till %d\n",node_id,index_top,mem_offset,mem_offset+7);
  449. }
  450. }
  451. /* Failure Detector */
  452. #if defined(tPFD) || defined(tEPFD)
  453. alive[sender_id] = 1;
  454. suspected[sender_id] = 0;
  455. #endif
  456. /********************/
  457. if (paxos_state == FAILED_CORE && sig_read_ar[0] == SIG_RECOVER){
  458. fail_flag = 1;
  459. } else if (paxos_state != FAILED_CORE) {
  460. if (sig_read_ar[0] == SIG_INIT) {
  461. sig_INIT_handler(sender_id);
  462. } else if (sig_read_ar[0] == SIG_ACK) {
  463. sig_ACK_handler(sender_id);
  464. } else if (sig_read_ar[0] == SIG_TERMINATE) {
  465. sig_TERMINATE_handler(sender_id);
  466. } else if (sig_read_ar[0] == SIG_INIT_APP) {
  467. sig_INIT_APP_handler(sender_id);
  468. } else if (sig_read_ar[0] == SIG_IDAG_FIND_IDAGS) {
  469. sig_IDAG_FIND_IDAGS_handler(sender_id, &increase_cnt, index_top);
  470. } else if (sig_read_ar[0] == SIG_REQ_DDS) {
  471. sig_REQ_DDS_handler(sender_id);
  472. } else if (sig_read_ar[0] == SIG_REQ_CORES) {
  473. sig_REQ_CORES_handler(sender_id, &increase_cnt, index_top); /* increase_cnt was put like this because in response there is no need for increase */
  474. } else if (sig_read_ar[0] == SIG_REP_OFFERS) {
  475. sig_REP_OFFERS_handler(sender_id);
  476. } else if (sig_read_ar[0] == SIG_INIT_AGENT) {
  477. sig_INIT_AGENT_handler(sender_id);
  478. } else if (sig_read_ar[0] == SIG_ADD_CORES_DDS) {
  479. sig_ADD_CORES_DDS_handler(sender_id, &increase_cnt, index_top);
  480. } else if (sig_read_ar[0] == SIG_REM_CORES_DDS) {
  481. sig_REM_CORES_DDS_handler(sender_id, &increase_cnt, index_top);
  482. } else if (sig_read_ar[0] == SIG_APPOINT_WORK) {
  483. sig_APPOINT_WORK_handler(sender_id, &increase_cnt, index_top);
  484. } else if (sig_read_ar[0] == SIG_FINISH) {
  485. sig_FINISH_handler(sender_id, &increase_cnt, index_top);
  486. } else if (sig_read_ar[0] == SIG_REJECT) {
  487. sig_REJECT_handler(sender_id);
  488. } else if (sig_read_ar[0] == SIG_APP_TERMINATED) {
  489. num_apps_terminated++;
  490. fprintf(log_file,"app_terminated = %d sender_id = %d\n",num_apps_terminated,sender_id);
  491. printf("app_terminated = %d sender_id = %d\n",num_apps_terminated,sender_id);
  492. /* PAXOS SIGNALS HANDLING */
  493. } else if (sig_read_ar[0] == SIG_PREPARE_REQUEST) {
  494. sig_PREPARE_REQUEST_handler(sender_id);
  495. } else if (sig_read_ar[0] == SIG_PREPARE_ACCEPT_NO_PREVIOUS) {
  496. sig_PREPARE_ACCEPT_NO_PREVIOUS_handler(sender_id);
  497. } else if (sig_read_ar[0] == SIG_PREPARE_ACCEPT) {
  498. sig_PREPARE_ACCEPT_handler(sender_id);
  499. } else if (sig_read_ar[0] == SIG_ACCEPT_REQUEST) {
  500. sig_ACCEPT_REQUEST_handler(sender_id);
  501. } else if (sig_read_ar[0] == SIG_ACCEPTED) {
  502. sig_ACCEPTED_handler(sender_id);
  503. } else if (sig_read_ar[0] == SIG_LEARN) {
  504. sig_LEARN_handler(sender_id);
  505. } else if (sig_read_ar[0] == SIG_REINIT_APP) {
  506. sig_REINIT_APP_handler(sender_id);
  507. } else if (sig_read_ar[0] == SIG_CONTR_TO) {
  508. sig_CONTR_TO_handler(sender_id);
  509. } else if (sig_read_ar[0] == SIG_REMOVE_FROM_DDS) {
  510. sig_REMOVE_FROM_DDS_handler(sender_id);
  511. } else if (sig_read_ar[0] == SIG_ADD_TO_DDS) {
  512. sig_ADD_TO_DDS_handler(sender_id,&increase_cnt,index_top);
  513. } else if (sig_read_ar[0] == SIG_HEARTBEAT_REQ) {
  514. sig_HEARTBEAT_REQ_handler(sender_id);
  515. } else if (sig_read_ar[0] == SIG_HEARTBEAT_REP) {
  516. sig_HEARTBEAT_REP_handler(sender_id);
  517. } else if (sig_read_ar[0] == SIG_FAIL) {
  518. sig_FAIL_handler();
  519. } else if (sig_read_ar[0] == SIG_PAXOS_STATS_REQ) {
  520. sig_PAXOS_STATS_REQ_handler(sender_id);
  521. } else if (sig_read_ar[0] == SIG_PAXOS_STATS_REP) {
  522. sig_PAXOS_STATS_REP_handler(sender_id);
  523. /* END OF PAXOS SIGNAL HANDLING */
  524. } else if (sig_read_ar[0] != NO_SIG) {
  525. fprintf(log_file,"I read smth different than no_sig which is %d from %d\n",sig_read_ar[0],sender_id);
  526. fflush(log_file);
  527. }
  528. }
  529. if (sig_read_ar[0] != NO_SIG)
  530. if (strcmp(sig2string(sig_read_ar[0]),"SIG_HEARTBEAT_REQ") != 0 && strcmp(sig2string(sig_read_ar[0]), "SIG_HEARTBEAT_REP") != 0)
  531. fprintf(log_file,"I invalidated sender_ids %d signals increase_cnt=%d\n",sender_id,increase_cnt);
  532. index_top = (index_top + increase_cnt) % MAX_SIGNAL_LIST_LEN;
  533. increase_cnt = 1;
  534. #ifdef PLAT_SCC
  535. RCCE_acquire_lock(node_id);
  536. #else
  537. sem_wait(&scc_lock[node_id]);
  538. #endif
  539. tmp_bottom = index_bottom[node_id];
  540. if (paxos_state == NEW_IDAG){
  541. fprintf(log_file,"\t\tmy index_top = %d and index_bottom = %d\n",index_top,tmp_bottom);
  542. break;
  543. }
  544. }
  545. }
  546. #ifdef PLAT_SCC
  547. RCCE_release_lock(node_id);
  548. #else
  549. sem_post(&scc_lock[node_id]);
  550. #endif
  551. if (paxos_state == NEW_AGENT){
  552. //paxos_state = PAXOS_ACTIVE;
  553. //common_node_actions(local_scen_directory, local_scen_num);
  554. }
  555. //fprintf(log_file,"paxos_state : %s", id2string(paxos_state));
  556. if (paxos_state == NEW_IDAG){
  557. fprintf(log_file, "My state is %s %s\n", id2string(state), id2string(paxos_state));
  558. rollback();
  559. fprintf(log_file, "My state 2 is %s %s\n", id2string(state), id2string(paxos_state));
  560. signals_enable();
  561. fprintf(log_file, "My state 3 is %s %s\n", id2string(state), id2string(paxos_state));
  562. #ifndef PLAT_LINUX
  563. idle_agent_actions("", "");
  564. #else
  565. idle_agent_actions("", "",0,0); /* FIXME Change to correct last two arguments!!! */
  566. #endif
  567. }
  568. signals_enable();
  569. }
  570. void scc_pause(void) {
  571. int dummy=0, i;
  572. #ifdef IDAG_SLEEP
  573. struct timespec ts;
  574. if (my_idag == -1) { /* I am a Controller core */
  575. /* sleep(1); */
  576. ts.tv_sec = 0;
  577. ts.tv_nsec = SLEEP_ROUND_DURATION_NSEC;
  578. nanosleep(&ts, NULL);
  579. }
  580. #endif
  581. #ifdef LOW_VOLTAGE_0
  582. if ((node_id >= 0 && node_id <= 3) || (node_id >= 12 && node_id <= 15))
  583. for (i=0; i<125; i++) //667
  584. dummy++;
  585. else
  586. for (i=0; i<1000; i++)
  587. dummy++;
  588. #else
  589. for (i=0; i<1000; i++)
  590. //for(j=0; j<1000; j++)
  591. dummy++;
  592. #endif
  593. }