From 583d6fdae009de0c75d488c95749ca6e54901bd0 Mon Sep 17 00:00:00 2001 From: MasterRoby3 Date: Sun, 3 Sep 2023 21:20:58 +0200 Subject: [PATCH] Backup added --- backup/ControlledQueue.cxx | 44 ++++ backup/ControlledQueue.h | 28 ++ backup/Progetto.code-workspace | 8 + backup/README.md | 2 + backup/a.out | Bin 0 -> 17656 bytes backup/core | Bin 0 -> 499712 bytes backup/evBuild.out | Bin 0 -> 17808 bytes backup/event_builder.cxx | 244 ++++++++++++++++++ backup/fragment_dataformat.h | 85 ++++++ backup/full_event_format.h | 16 ++ backup/prov.out | Bin 0 -> 62632 bytes backup/prova.cpp | 5 + backup/provider.cxx | 161 ++++++++++++ backup/spawn_clients.sh | 12 + .../is_epoll_really_thsafe/exec_order_test.sh | 1 - 15 files changed, 605 insertions(+), 1 deletion(-) create mode 100644 backup/ControlledQueue.cxx create mode 100644 backup/ControlledQueue.h create mode 100644 backup/Progetto.code-workspace create mode 100644 backup/README.md create mode 100755 backup/a.out create mode 100644 backup/core create mode 100755 backup/evBuild.out create mode 100644 backup/event_builder.cxx create mode 100644 backup/fragment_dataformat.h create mode 100644 backup/full_event_format.h create mode 100755 backup/prov.out create mode 100644 backup/prova.cpp create mode 100644 backup/provider.cxx create mode 100755 backup/spawn_clients.sh diff --git a/backup/ControlledQueue.cxx b/backup/ControlledQueue.cxx new file mode 100644 index 0000000..3340333 --- /dev/null +++ b/backup/ControlledQueue.cxx @@ -0,0 +1,44 @@ +#include "ControlledQueue.h" +#include +#include + +ControlledQueue::ControlledQueue(uint32_t maxSize, int timeoutMicroseconds) : m_maxSize(maxSize), m_timeoutMicroseconds(timeoutMicroseconds) {;} + +void ControlledQueue::put(Fragment fragment) { + std::unique_lock lk(m_mtx); + + /* + This while synthax is explicitly used to avoid unwanted spurious awakenings. + I'm keeping only the wait with not timeout to transmit backpressure to the upper reading thread, which blocks. + Since that thread has locked the mutex corresponding to the fd, basically the whole fd is blocked. + That way I can tranmit backpressure with TCP to the sending client. + */ + while (! (m_queue.size() < m_maxSize) ) { + m_cv.wait(lk); + } + + m_queue.push(fragment); + + lk.unlock(); + m_cv.notify_all(); +} + +/* + Basically here a simple string exception is thrown if the wait terminates because of timeout and not because someone has inserted an element. + That way it can be catched from the main program that can set the error code accordingly. +*/ +Fragment ControlledQueue::get() { + std::unique_lock lk(m_mtx); + + if ( !m_cv.wait_for(lk, std::chrono::microseconds(m_timeoutMicroseconds), !(m_queue.empty())) ) { + throw "Get Timeout"; + } + + Fragment fragment = m_queue.front(); + m_queue.pop(); + + lk.unlock(); + m_cv.notify_all(); + + return fragment; +} \ No newline at end of file diff --git a/backup/ControlledQueue.h b/backup/ControlledQueue.h new file mode 100644 index 0000000..a3d1bc9 --- /dev/null +++ b/backup/ControlledQueue.h @@ -0,0 +1,28 @@ +#pragma once + +#include + +#include +#include +#include + +#include "fragment_dataformat.h" + + + +class ControlledQueue { + public: + ControlledQueue(uint32_t maxSize, int timeoutMicroseconds); + + void put(Fragment fragment); + Fragment get(); + bool empty() { return m_queue.empty(); } + + private: + std::mutex m_mtx; + std::condition_variable m_cv; + uint32_t m_maxSize; + std::queue m_queue; + int m_timeoutMicroseconds; + +}; \ No newline at end of file diff --git a/backup/Progetto.code-workspace b/backup/Progetto.code-workspace new file mode 100644 index 0000000..bab1b7f --- /dev/null +++ b/backup/Progetto.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": ".." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/backup/README.md b/backup/README.md new file mode 100644 index 0000000..4663ac1 --- /dev/null +++ b/backup/README.md @@ -0,0 +1,2 @@ +# Event Builder Project +This repo contains the code for a simple Event Builder inspired by ATLAS event format. It's a project for the exam "Tecniche Digitali di Acquisizione Dati" @UNIPV. diff --git a/backup/a.out b/backup/a.out new file mode 100755 index 0000000000000000000000000000000000000000..37154d7a9ee91ead565b464b4a02ffcd32231146 GIT binary patch literal 17656 zcmeHPe{fXSb-pX{Ltt15+qf7K^Gtw1V+lbGkwY=NNDEJ`zzRsN69+%9c2{VPw5#qu zVL?iaD?@nQDj_M!kc=~7l4(lPPKUTn;$RviJ4GbpiACbNG>vPOvD=kR9ED(yOfcK; z+Wg8mIU z0}>Do;wJpwA>J!yfS)EYRUS|Tr7Cq*cxjc!D?v%`gf1_n@6mEh*+ZhFS1L{F3Ydx- zB}sbIDXaNHTC4S#a=BZdLCQ#m{B>y;H3W%iz8=LUTPur2R>zO&Io^ zy1r6zS)l!As+%iTb;mo_-My+iTH75@^!3;FH>|5&cXwSnS+_>E`&KwYU9n|byV&wd z$BBmI^f?3D{_Wn&XY2oA?mKs!CBMlBvPUwMNS?z_^fnw+uG;lDatb4QKK7#?qNP#* z1veKd{1z~y2>u|jV)6@1;B!mh_mseQm%#5Yfq$|DzO)2>9=L&{Fs%VltX&@{fq$U{ z{^1h%EhX?jErEBI!0Egx=I0o214m)<0VpQl4}3|XF!AYRWOvLKvHrL%y6j{kEqY_A zR5B&viI{CA>||J^eke)6;^ZGRx27y#deWPskW_+-N{6(E!@#fmUi_d6WWrc zM2iZlbE*PoR{kHM-am!-aK?QZ;o|wBZ()2Em3&>tl;=yH=jwGQOz3%$@dqr&Oj=5wBqu{<0VyD6K8-{hh~OyuD-=Wv?L!)YGjv>>2zGeKw!aWVobN4UO( zNMJ=C&T}ml)aT*yIz}K;LqHNicJk-rKpswIoXmjA5ymkhq%}alLfV^j4hXaZsoaQD@T>+IN+|M9rZ$L4GSF5c2?GGr1a2^AM90<^_@<(^A%%iLW4jNb)}oWeZL*GvA-iKkncaYOR^h^Jea@fyjeh^JeZaUuCfh_5Do;yQq39mLbE z%J`V%pQ;n0^9XpER{y-&IscI9Tr>w>ooH=q8JvC!Z7~Pu?vP}|Aw(uOzY{uFsuwp= z$%d6MXbw(aLgb!Fdp^43UX)XJ%*u^bFFrtqpVJib?@;03+RH>%UN@ZybNJ1T=I~^t z={swlzi!_O1M{_ks@zzotcUdvZ1^sUMBl1*b6~^UwaA*zYxW#7v*C-tv$bepwhKRJ zr+)^#Zzt<99sf8A+o6MjQ*(+u`yTcE8S3!tD+q`ax|RuD8_q6%V#vM?-hLIK%^pI* z8IsHX9daoD!E@S%;q1TU^kq9oLK78YBy= z%H$nn@&!Q3?YEGFth6`JwYO@@-VVgWboQS%M?&YMn}hA=;Pz-HbXs}*SCDl=m*CV? zC2wFDW*>1YIf7jEcS1i_jb9_V3z^W1aPF_K<#MKTmYOu|{1lBk4OP{sZ=eXcnb|p6 z*fi`3-&K%LN)Oz4VKjJb+G|8*`m5*j5{jDR~N zxkfG`*y}?R`)>m^kBvNWkj`zw2SV3;Z(PjoLjw>^bFdu|z7%|#<`dI7e~N~o9FV9q z4BJz&o{2iM*8wR%m%^h=J3PANyad?<>`{Is`wDV0u-{eP__Ka(tqzA*gyLf`1X*v6Hkr>JSpu=$gVrZZ~J z8Zn)#BU*gqTC|1+`oz1geppp9Z+a+*C4W8fLgv}znK zfs{8a<}ow#kKE3ZF5WpoGu=m2^uH+w$^~ykHsnX-;85TD72kfrIV#5mSUIc$t}ma5 zk8jM7&3ndUt9sCoU4%h36=82|^Sv$|Smkxf92|UJ8XP;Nh9FH&4XE7-y*RM{MNxfp z2=m|?3OAiGXK1E?wiZw?Nk%ez($IwEEwx7mF6>a*Ok3 zlk?xf+^w&e1JC))dtUB)ov!^4?hJk`xHI@r(88QA=uSZ1BY5r#Xn2%UIRfPflp|1% zKsf^C2>f4-fKRW6sO2i7GaT=ZMde}>=QlSQ%c4d{vM&)e?4;3~OxXZt^Rkt0xRO#! zS@Fa!l1#)NH6qDG0;^hBz)H{NB`T@W=oT2Asbr7Ql}y8I`YyJAmmw|EbG%G#u~ZKh zwd`2*E+Z9-#NvBmQDaB*mTkcncq7`=;a#y0!GP4?*4NV!OBu7p4qEpzblY6d^A^z5 zqMM;s=BT1zG^*XFwiwAyt(`W)Y1!f0TH-MeSaTMj5{PNI1WyRyFjs?KS zaQqrFvd!!RFtUFQ$85xQh@SZK%D~Asy$9_+c_o+INx&w5&8I7x{R=)-8S)#0(?b3g ze>uI$Uw>$Z>2DaAxy2uN#NQC~*9ZM8Hu;TB{soZVpd5kUX$0Kw=Jdx@d~f1Cw3KeDk#1MS{f>E& z=J^?5q2~F!Ji6be#N}^Y&m|>K_ufeS4ch}cgVj-)>UB9k_+8aFJx5W}?%eP#msS%Z zAjRBo{Eq2{@^cR@Bvbl5Ma07zVEnjtg#8}Ua{O%|*N=rH*&Y;2QM{~|`~j_x7xa?n zIOCB-^4oPemIx&8`mO8vT@(JUys+MNdK_%l^nOh{HQl4>Ax%H8>DM&Go2JV(U8gDgbt0g0TN)cbWUOe4b;QF7V|6_~TU}kdZl%r{YwFjmu3x>n zp0$e8N_>gQ`wj9XDluyKyLm5ODYCS(Sdc35<#|<+4y?rJ=5d^_Qi(4#dAxh^nS#fK z7q1dLp1k-h!Q<46&vwVN7suJ7;PkNR3qLcT9c7-!4uT#d#K-vPI|rH1SKhc0GlvZ)qzK&jST<_Ctv9lLa`1g>e4PnQeU#86Re6 z_J``D)QH1ZBtDM-Cp&ySAX!R#aQMWHasC|eV*ZzE*WXAxH;d@|kSR#T?9l!QfqD!3 z@hnguX8FQ?d_l|ecj1!7&qbNJaa_Fx+()y0Knl1&pRJ%c+<0ExgofRW_!xSk=XfrX zxU24F8h{%vH9S>+glVwugixJlV+_(`ITY%52SRnZN zz#?sg)1;@Brs;x+wC@)$Xn#JS@ji*O_7pv=<%jeQgM2rL;$s?LtK%=<^FiiW0) zAUBMo2IuM10S_$h&~|uUWq+OlPV$BQKBDEXYX9ZCOqhJWM7{q}0{=w`yaLy=V*bxB zfiEwCe-JqJOQHXbzzuH*B)3!A@r%8>a`}!JB`M%bipUR2`6308l%2NwIy>tkVrnOg zW%pRvCX(A7BiATlV$mBt-STt;hh4sx zo1Q$t4V#+0r5|0rPHl#oT4Rc%@#L1;zN9x^d9@0*H(Aki(&`E)qO|p?`93IOUC8Q7 zV{r^kTZ7$EJ-Rp**ITy=?76|G;Xq3DJ>lK49dcXP9=&>2pwf{}YY(TkYI#Ix6PO23 zd&)eJYP%Q0HZc!CyV5*>Wnr@yk4D-BR&;9@bt<`_8qtcCz&J%Vf5(}}s#X5D5l>}?Y`teJrI)svPAlJpZ^vT^7 zg%ReIsyfS+2Io;jxF;S#^+}s7!#O%3>d?8O4)aV8=7J*g)^7>X^S2KNrg540d4?%J zf9ql?%Xy;j!$Hrytk2IqOqY^SUgGN~L+g;q*UxH0Obr&)v{0X}msrM3a{c@q#gyyk z_XPYr&StkEgS$7^e}3L#x+|zF?SsW7#MS5LGN%0A0U|Pyjr{Zw7<$HM z|M~fiDL$T-iT!6ern^x}?+lpd=RBr{QWu5(Ygp_u=I> z{2qiUzc(R$y7ej4{}eEaiGH0yH!CV>s&AJxsC;!9WE>p%`i9nXX+gjX%!{K1`ux1g zl>Oy8nP>W?0)4*!VtU?fn6kk2v%Rkt==1Y0Q+{8>^3+%P>FZ#qiQIp}(50HT7qp-K z)>7h|$mHu6?%$8Hpr(cO(|6$c`uyC@^u+&C{|}%~&#H6|QR3$@-q&B~FY`?Q1v=F@ zSf8K&CThvr)Ob_e6wmtqi2~{(*5~I${=W%h+JEjw*5iIW23-++tGah literal 0 HcmV?d00001 diff --git a/backup/core b/backup/core new file mode 100644 index 0000000000000000000000000000000000000000..c5a5dc19aa318f91693101ecbbd9e3b7d74f8a7f GIT binary patch literal 499712 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 literal 0 HcmV?d00001 diff --git a/backup/event_builder.cxx b/backup/event_builder.cxx new file mode 100644 index 0000000..ea35e72 --- /dev/null +++ b/backup/event_builder.cxx @@ -0,0 +1,244 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + + +int makeSocket() { + int sockfd; + if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + perror("socket failed"); + exit(EXIT_FAILURE); + } + return sockfd; +} + +void bindSocketPort(int server_fd, int port) { + struct sockaddr_in localAddr; + localAddr.sin_family = AF_INET; + localAddr.sin_addr.s_addr = INADDR_ANY; + localAddr.sin_port = htons(port); + + if (bind(server_fd, (struct sockaddr *)&localAddr, sizeof(localAddr)) < 0) { + perror("bind failed"); + exit(EXIT_FAILURE); + } + printf("FD %d bound to port %d\n", server_fd, port); +} + +void startListening(int server_fd) { + if (listen(server_fd, 3) < 0) { + perror("listen"); + exit(EXIT_FAILURE); + } + printf("FD %d listening to new connections\n", server_fd); +} + +int acceptConnection(int server_fd) { + int client_fd; + struct sockaddr_in remoteAddr; + + size_t addrlen = sizeof(remoteAddr); + if ((client_fd = accept(server_fd, (struct sockaddr *)&remoteAddr, (socklen_t *)&addrlen)) < 0) { + perror("accept"); + exit(EXIT_FAILURE); + } + printf("Connection from host %s, port %d, FD %d\n", inet_ntoa(remoteAddr.sin_addr), ntohs(remoteAddr.sin_port), client_fd); + return client_fd; +} + +void term_handler(int signal) { + printf("Terminated, received SIGNAL %d", signal); + exit(EXIT_SUCCESS); +} + +/* +int main(int argc, char const *argv[]) { + signal(SIGTERM, term_handler); + + if (argc != 2) { + printf("Usage: %s portNumber \n", argv[0]); + exit(EXIT_FAILURE); + } + int port = atoi(argv[1]); + printf("Start socket port %d\n", port); + + int server_fd = makeSocket(); + bindSocketPort(server_fd, port); + startListening(server_fd); + int client_fd = acceptConnection(server_fd); + + while (true) { + uint32_t word; + ssize_t bytes = read(client_fd, &word, 4); + if (bytes != 4) { + perror("Receive failed"); + exit(EXIT_FAILURE); + } + printf("[RICEVUTO]\t0x%x\n", word); + } + + + return 0; +}*/ + +#define TRUE 1 +#define FALSE 0 + +int main(int argc, char const *argv[]) { + signal(SIGTERM, term_handler); + + if (argc != 2) { + printf("Usage: %s portNumber \n", argv[0]); + exit(EXIT_FAILURE); + } + int port = atoi(argv[1]); + printf("Start socket port %d\n", port); + + int opt = TRUE; + int master_socket , addrlen , new_socket , client_socket[30] , + max_clients = 30 , activity, i , valread , sd; + int max_sd; + + //set of socket descriptors + fd_set readfds; + + //initialise all client_socket[] to 0 so not checked + for (i = 0; i < max_clients; i++) + { + client_socket[i] = 0; + } + + master_socket = makeSocket(); + + //set master socket to allow multiple connections , + //this is just a good habit, it will work without this + if( setsockopt(master_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, + sizeof(opt)) < 0 ) + { + perror("setsockopt"); + exit(EXIT_FAILURE); + } + + bindSocketPort(master_socket, port); + startListening(master_socket); + + while (true) { + //clear the socket set + FD_ZERO(&readfds); + + //add master socket to set + FD_SET(master_socket, &readfds); + max_sd = master_socket; + + //add child sockets to set + for ( i = 0 ; i < max_clients ; i++) + { + //socket descriptor + sd = client_socket[i]; + + //if valid socket descriptor then add to read list + if(sd > 0) + FD_SET( sd , &readfds); + + //highest file descriptor number, need it for the select function + if(sd > max_sd) + max_sd = sd; + } + + //wait for an activity on one of the sockets , timeout is NULL , + //so wait indefinitely + activity = select( max_sd + 1 , &readfds , NULL , NULL , NULL); + + if ((activity < 0) && (errno!=EINTR)) + { + printf("select error"); + } + + //If something happened on the master socket , + //then its an incoming connection + if (FD_ISSET(master_socket, &readfds)) + { + new_socket = acceptConnection(master_socket); + + //add new socket to array of sockets + for (i = 0; i < max_clients; i++) + { + //if position is empty + if( client_socket[i] == 0 ) + { + client_socket[i] = new_socket; + printf("Adding to list of sockets as %d\n" , i); + + break; + } + } + } + + //else its some IO operation on some other socket + for (i = 0; i < max_clients; i++) + { + sd = client_socket[i]; + + if (FD_ISSET( sd , &readfds)) + { + //Check if it was for closing , and also read the + //incoming message + uint32_t word; + if ((valread = recv( sd , &word, 4, 0)) == 0) + { + struct sockaddr_in address; + int addrlen; + //Somebody disconnected , get his details and print + getpeername(sd , (struct sockaddr*)&address , \ + (socklen_t*)&addrlen); + printf("Host disconnected , ip %s , port %d \n" , + inet_ntoa(address.sin_addr) , ntohs(address.sin_port)); + + printf("Disconnected fd %d", sd); + + //Close the socket and mark as 0 in list for reuse + close( sd ); + client_socket[i] = 0; + } + + //Echo back the message that came in + else + { + printf("[RICEVUTO]\t0x%x FROM %d\n", word, sd); + } + } + } + + + } + + /* + + int client_fd = acceptConnection(server_fd); + + while (true) { + uint32_t word; + ssize_t bytes = read(client_fd, &word, 4); + if (bytes != 4) { + perror("Receive failed"); + exit(EXIT_FAILURE); + } + printf("[RICEVUTO]\t0x%x\n", word); + }*/ + + + return 0; +} \ No newline at end of file diff --git a/backup/fragment_dataformat.h b/backup/fragment_dataformat.h new file mode 100644 index 0000000..ece7d01 --- /dev/null +++ b/backup/fragment_dataformat.h @@ -0,0 +1,85 @@ +#pragma once + +#include +#include +#include + +#define FRAGMENT_HEADER_MARKER 0xee1234ee + +typedef struct Header { + uint32_t startOfHeaderMarker = FRAGMENT_HEADER_MARKER; + uint32_t headerSize; + uint32_t fragmentSize; + uint32_t sourceIdentifier; + uint32_t runNumber; + uint32_t detectorEventNumber; + uint32_t numberOfStatusElements; + uint32_t *statusElementsArray; + /*friend std::ostream& operator <<(std::ostream& os, Header const& header) + { + return os << std::setw(8) << std::setfill('0') << header.startOfHeaderMarker << '\n' + << std::setw(8) << std::setfill('0') << header.headerSize << '\n' + << std::setw(8) << std::setfill('0') << header.fragmentSize << '\n' + << std::setw(8) << std::setfill('0') << header.runNumber << '\n' + << std::setw(8) << std::setfill('0') << header.detectorEventNumber << '\n' + << std::setw(8) << std::setfill('0') << header.numberOfStatusElements << '\n'; + }*/ +} Header; + +typedef struct Fragment { + Header header; + uint32_t *payloadElements; +} Fragment; + +enum ERROR_CODES { + INCORRECT_ERROR = (1 << 0), + CORRUPTED_ERROR = (1 << 1), + MISSING_DATA_ERROR = (1 << 2), + TIMEOUT_ERROR = (1 << 3) +}; + +void encode_header(uint32_t *buffer, const Header &header) { + buffer[0] = header.startOfHeaderMarker; + buffer[1] = header.headerSize; + buffer[2] = header.fragmentSize; + buffer[3] = header.sourceIdentifier; + buffer[4] = header.runNumber; + buffer[5] = header.detectorEventNumber; + buffer[6] = header.numberOfStatusElements; + + std::memcpy(&buffer[7], header.statusElementsArray, header.numberOfStatusElements * sizeof(uint32_t)); +} + + +void encode_fragment(uint32_t *buffer, const Fragment &fragment){ + encode_header(buffer, fragment.header); + std::memcpy(&buffer[fragment.header.headerSize], fragment.payloadElements, (fragment.header.fragmentSize - fragment.header.headerSize) * sizeof(uint32_t)); +} + + +Fragment decode_fragment(uint32_t *buffer) { + Fragment fragment; + fragment.header.startOfHeaderMarker = buffer[0]; + fragment.header.headerSize = buffer[1]; + fragment.header.fragmentSize = buffer[2]; + fragment.header.sourceIdentifier = buffer[3]; + fragment.header.runNumber = buffer[4]; + fragment.header.detectorEventNumber = buffer[5]; + fragment.header.numberOfStatusElements = buffer[6]; + + uint32_t nStatusElements = fragment.header.numberOfStatusElements; + fragment.header.statusElementsArray = new uint32_t[nStatusElements]; + for (int i = 1; i <= nStatusElements; i++) { + fragment.header.statusElementsArray[6+i] = buffer[6+i]; + } + + uint32_t payload_size = fragment.header.fragmentSize - fragment.header.headerSize; + fragment.payloadElements = new uint32_t[payload_size]; + for (int i = 1; i <= payload_size; i++) { + fragment.payloadElements[6+nStatusElements+i] = buffer[6+nStatusElements+i]; + } + + return fragment; +} + + diff --git a/backup/full_event_format.h b/backup/full_event_format.h new file mode 100644 index 0000000..97d6e37 --- /dev/null +++ b/backup/full_event_format.h @@ -0,0 +1,16 @@ +#pragma once + +#include "fragment_dataformat.h" +#include + +#define FULL_EVENT_HEADER_MARKER 0xaa1234aa + +typedef struct FullEvent { + uint32_t startOfHeaderMarker = FULL_EVENT_HEADER_MARKER; + uint32_t headerSize; + uint32_t eventSize; + uint32_t runNumber; + + Fragment *fragmentsArray; + +}FullEvent; \ No newline at end of file diff --git a/backup/prov.out b/backup/prov.out new file mode 100755 index 0000000000000000000000000000000000000000..466593a9b8f166c85d1b06325f81d001ed030ddf GIT binary patch literal 62632 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 ZVZKzm3O5BeiR$+plN{$*Dp-oz{{h+=3k3iG literal 0 HcmV?d00001 diff --git a/backup/prova.cpp b/backup/prova.cpp new file mode 100644 index 0000000..8d79f0f --- /dev/null +++ b/backup/prova.cpp @@ -0,0 +1,5 @@ +#include + +int main() { + return 0; +} \ No newline at end of file diff --git a/backup/provider.cxx b/backup/provider.cxx new file mode 100644 index 0000000..f5086d9 --- /dev/null +++ b/backup/provider.cxx @@ -0,0 +1,161 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#include "fragment_dataformat.h" + +#define MIN_FRAGMENTS 0 +#define MAX_FRAGMENTS 100 + + +/* +int rndError(float p){ + float rndFloat = static_cast(rand()) / static_cast(RAND_MAX); + return rndFloat < p; +}*/ + + +int makeSocket() { + int sockfd; + if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + perror("socket failed"); + exit(EXIT_FAILURE); + } + return sockfd; +} + +void connectTo(int sock, const char* host, int port) { + struct sockaddr_in serv_addr; + serv_addr.sin_family = AF_INET; + serv_addr.sin_addr.s_addr = inet_addr(host); + serv_addr.sin_port = htons(port); + + if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { + perror("Connection failed"); + exit(EXIT_FAILURE); + } + + printf("Connected to %s: %d\n", host, port); +} + + +void term_handler(int signal) { + printf("Terminated, received SIGNAL %d", signal); + exit(EXIT_SUCCESS); +} + + +int main(int argc, char* argv[]) { + signal(SIGTERM, term_handler); + signal(SIGINT, term_handler); + + //will use it later to obtain random number from hardware + std::random_device rd; + std::mt19937 generator(42); + std::discrete_distribution discrete_distr({0.9, 0.1}); + std::normal_distribution normal_distr(25., 10.); + std::uniform_int_distribution unif_int_distib; + std::uniform_real_distribution unif_float_distrib(0.5, 2); + + //commenting all old_style generation + //srand (static_cast (42)); + + bool out_condition = true; + uint32_t event_number = 0; + + uint32_t run_number = 0; + uint32_t source_id = 0; + + if (argc != 5) { + printf("Usage %s host portNumber sourceId runNumber\n", argv[0]); + exit(EXIT_FAILURE); + } + + const char* host = argv[1]; + int port = atoi(argv[2]); + source_id = atoi(argv[3]); + run_number = atoi(argv[4]); + + int socket = makeSocket(); + connectTo(socket, host, port); + + while (true) { + Header header; + header.sourceIdentifier = source_id; + header.runNumber = run_number; + header.detectorEventNumber = event_number; + event_number++; + header.numberOfStatusElements = 0; + //if swap to old style just change with function above and prob 0.1 for 1 + uint8_t incorrectError = discrete_distr(generator); + uint8_t corruptedError = discrete_distr(generator); + uint8_t missingDataError = discrete_distr(generator); + uint8_t timeoutError = discrete_distr(generator); + + uint32_t firstStatusElement = 0x0; + + if (incorrectError) firstStatusElement |= INCORRECT_ERROR; + if (corruptedError) firstStatusElement |= CORRUPTED_ERROR; + if (missingDataError) firstStatusElement |= MISSING_DATA_ERROR; + if (timeoutError) firstStatusElement |= TIMEOUT_ERROR; + + if (firstStatusElement != 0x0) { + header.numberOfStatusElements = 1; + header.statusElementsArray = new uint32_t[header.numberOfStatusElements]; + header.statusElementsArray[0] = firstStatusElement; + } + + uint32_t payload_size = std::max(std::min(static_cast(std::round(normal_distr(generator))), MAX_FRAGMENTS), MIN_FRAGMENTS); + header.headerSize = 7 + header.numberOfStatusElements; + header.fragmentSize = header.headerSize + payload_size; + + Fragment fragment; + fragment.header = header; + fragment.payloadElements = new uint32_t[payload_size]; + for (uint32_t i = 0; i < payload_size; i++) { + fragment.payloadElements[i] = unif_int_distib(generator); + } + + uint32_t buffer[header.fragmentSize]; + encode_fragment(buffer, fragment); + ssize_t bytes = send(socket, reinterpret_cast(buffer), sizeof(buffer), 0); + if (bytes != header.fragmentSize * sizeof(uint32_t)) { + perror("Send failed: num bytes not matching"); + exit(EXIT_FAILURE); + } + + + //std::cout << std::hex << std::setw(8) << std::setfill('0'); + ////std::cout << fragment.header; + //for (uint8_t i = 0; i < fragment.header.numberOfStatusElements; i++) { + // std::cout << "status element " << std::setw(8) << std::setfill('0') << fragment.header.statusElementsArray[i] << std::endl; + //} + //for (uint32_t i = 0; i < payload_size; i++) { + // std::cout << "payload element " << std::setw(8) << std::setfill('0') << fragment.payloadElements[i] << std::endl; + //} + //std::cout << std::endl; + + if (header.numberOfStatusElements > 0){ + delete [] fragment.header.statusElementsArray; + } + delete [] fragment.payloadElements; + + + sleep(unif_float_distrib(generator)); + } + + return 0; +} \ No newline at end of file diff --git a/backup/spawn_clients.sh b/backup/spawn_clients.sh new file mode 100755 index 0000000..57caa28 --- /dev/null +++ b/backup/spawn_clients.sh @@ -0,0 +1,12 @@ +#!/bin/bash +echo "Usage: $0 host port runNumber numberOfProviders" + +if [ $# -eq 4 ] +then + echo "Selected host: $1:$2 runNumber: $3 numberOfProviders: $4" + for i in $(seq 1 $4); + do + echo "Spawning provider number $i" + ./prov.out $1 $2 $3 & + done +fi diff --git a/testing/is_epoll_really_thsafe/exec_order_test.sh b/testing/is_epoll_really_thsafe/exec_order_test.sh index 63aa618..52e4dba 100755 --- a/testing/is_epoll_really_thsafe/exec_order_test.sh +++ b/testing/is_epoll_really_thsafe/exec_order_test.sh @@ -11,4 +11,3 @@ do kill -15 `pidof ./prov.out` sleep 1 done -