From 94a56c43c83767b2a1a0a829eb78cba6bf560e6c Mon Sep 17 00:00:00 2001 From: Horst Schirmeier Date: Tue, 15 Mar 2016 23:20:05 +0100 Subject: [PATCH] remove deprecated stuff Change-Id: Ifc25d216bbf782416159ceb0c366a080d2c8c428 --- deprecated/old-aspects/FireTimer.ah.old | 29 ---- .../old-aspects/JumpToPreviousCtx.ah.old | 35 ---- .../old-aspects/MemAccessBitFlip.ah.old | 102 ----------- .../DataRetrievalExperiment.cc | 36 ---- .../DataRetrievalExperiment.hpp | 14 -- .../ExperimentDataExample/CMakeLists.txt | 19 -- .../FaultCoverageExperiment.proto | 7 - .../ExperimentDataExample/build_example.sh | 3 - .../ExperimentDataExample/example.cc | 63 ------- .../JumpAndRunExperiment.hpp | 76 -------- .../old-experiments/MemWriteExperiment.hpp | 71 -------- deprecated/old-experiments/MyExperiment.hpp | 60 ------- .../SingleSteppingExperiment.hpp | 60 ------- .../instantiate-experiment.ah.template | 16 -- deprecated/old-tests/CMakeLists.txt | 34 ---- deprecated/old-tests/TestData.proto | 6 - deprecated/old-tests/client.cc | 110 ------------ deprecated/old-tests/dwarf.cc | 163 ------------------ deprecated/old-tests/main.elf | Bin 313919 -> 0 bytes deprecated/old-tests/server.cc | 62 ------- deprecated/old-tests/testjc.cc | 42 ----- deprecated/old-utils/ExperimentDataQueue.cc | 24 --- deprecated/old-utils/ExperimentDataQueue.hpp | 55 ------ deprecated/old-utils/Signal.cc | 16 -- deprecated/old-utils/Signal.hpp | 135 --------------- .../SynchronizedExperimentDataQueue.cc | 25 --- .../SynchronizedExperimentDataQueue.hpp | 57 ------ 27 files changed, 1320 deletions(-) delete mode 100644 deprecated/old-aspects/FireTimer.ah.old delete mode 100644 deprecated/old-aspects/JumpToPreviousCtx.ah.old delete mode 100644 deprecated/old-aspects/MemAccessBitFlip.ah.old delete mode 100644 deprecated/old-experiments/DataRetrievalExperiment.cc delete mode 100644 deprecated/old-experiments/DataRetrievalExperiment.hpp delete mode 100644 deprecated/old-experiments/ExperimentDataExample/CMakeLists.txt delete mode 100644 deprecated/old-experiments/ExperimentDataExample/FaultCoverageExperiment.proto delete mode 100755 deprecated/old-experiments/ExperimentDataExample/build_example.sh delete mode 100644 deprecated/old-experiments/ExperimentDataExample/example.cc delete mode 100644 deprecated/old-experiments/JumpAndRunExperiment/JumpAndRunExperiment.hpp delete mode 100644 deprecated/old-experiments/MemWriteExperiment.hpp delete mode 100644 deprecated/old-experiments/MyExperiment.hpp delete mode 100644 deprecated/old-experiments/SingleSteppingExperiment.hpp delete mode 100644 deprecated/old-experiments/instantiate-experiment.ah.template delete mode 100644 deprecated/old-tests/CMakeLists.txt delete mode 100644 deprecated/old-tests/TestData.proto delete mode 100644 deprecated/old-tests/client.cc delete mode 100644 deprecated/old-tests/dwarf.cc delete mode 100755 deprecated/old-tests/main.elf delete mode 100644 deprecated/old-tests/server.cc delete mode 100644 deprecated/old-tests/testjc.cc delete mode 100644 deprecated/old-utils/ExperimentDataQueue.cc delete mode 100644 deprecated/old-utils/ExperimentDataQueue.hpp delete mode 100644 deprecated/old-utils/Signal.cc delete mode 100644 deprecated/old-utils/Signal.hpp delete mode 100644 deprecated/old-utils/SynchronizedExperimentDataQueue.cc delete mode 100644 deprecated/old-utils/SynchronizedExperimentDataQueue.hpp diff --git a/deprecated/old-aspects/FireTimer.ah.old b/deprecated/old-aspects/FireTimer.ah.old deleted file mode 100644 index 6b9eebba..00000000 --- a/deprecated/old-aspects/FireTimer.ah.old +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef __FIRETIMER_AH__ - #define __FIRETIMER_AH__ - -#include - -// FIXME: This seems deprecated...?! - -aspect fireTimer { - - advice "bx_pc_system_c" : slice class { - public: - // TODO: Log-level? - void fireTimer(Bit32u timerNum){ - if(timerNum <= numTimers){ - if(!timer[timerNum].active){ - std::cout << "[FAIL] WARNING: The selected timer is actually NOT active!" << std::endl; - } - currCountdownPeriod = Bit64u(1); - timer[timerNum].timeToFire = Bit64u(currCountdownPeriod) + ticksTotal; - std::cout << "[FAIL] Timer " << timerNum <<" will fire now!" << std::endl; - }else{ - std::cout << "[FAIL] There are actually only " << numTimers <<" allocated!" << std::endl; - } - } - }; -}; - - -#endif // __FIRETIMER_AH__ diff --git a/deprecated/old-aspects/JumpToPreviousCtx.ah.old b/deprecated/old-aspects/JumpToPreviousCtx.ah.old deleted file mode 100644 index 75913414..00000000 --- a/deprecated/old-aspects/JumpToPreviousCtx.ah.old +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef __JUMP_TO_PREVIOUS_CTX_AH__ - #define __JUMP_TO_PREVIOUS_CTX_AH__ - -#include "config/FailConfig.hpp" - -// FIXME: What's the purpose of this file/code? Deprecated? - -#if 0 -// #if defined(CONFIG_SR_RESTORE) || defined(CONFIG_SR_REBOOT) - -#include "bochs.h" -#include "../SALInst.hpp" - -aspect jumpToPreviousCtx -{ - pointcut end_reset_handler() = "void bx_gui_c::reset_handler(...)"; - //|| "int bxmain()"; - - - advice execution (end_reset_handler()) : after () - { - - if (fail::restore_bochs_request || fail::reboot_bochs_request ) - { - fail::restore_bochs_request = false; - fail::reboot_bochs_request = false; - fail::simulator.toPreviousCtx(); - } - - } -}; - -#endif // CONFIG_SR_RESTORE || CONFIG_SR_REBOOT - -#endif // __JUMP_TO_PREVIOUS_CTX_AH__ diff --git a/deprecated/old-aspects/MemAccessBitFlip.ah.old b/deprecated/old-aspects/MemAccessBitFlip.ah.old deleted file mode 100644 index d924307f..00000000 --- a/deprecated/old-aspects/MemAccessBitFlip.ah.old +++ /dev/null @@ -1,102 +0,0 @@ -#ifndef __MEM_ACCESS_BIT_FLIP_AH__ - #define __MEM_ACCESS_BIT_FLIP_AH__ - -#include "config/FailConfig.hpp" - -#ifdef CONFIG_FI_MEM_ACCESS_BITFLIP - -#include -#include -#include - -#include "bochs.h" -#include "../../controller/EventList.hpp" -#include "../../controller/Event.hpp" - -// FIXME: This is deprecated stuff. Delete this file. - -using namespace std; - -// FIXME this code doesn't make any sense for the read_virtual_% functions -// (the fault would need to be injected into their *return* value) - -aspect MemAccessBitFlip -{ - pointcut injection_methods() - = "% ...::bx_cpu_c::read_virtual_%(...)" || // -> access32/64.cc -/* - "% ...::bx_cpu_c::read_RMW_virtual_%(...)" || // -> access32.cc - "% ...::bx_cpu_c::system_read_%(...)" || // -> access.cc - "% ...::bx_cpu_c::v2h_read_byte(...)" || // -> access.cc -*/ - "% ...::bx_cpu_c::write_virtual_%(...)"; // -> access32/64.cc -/* - "% ...::bx_cpu_c::write_RMW_virtual_%(...)" || // -> access32.cc - "% ...::bx_cpu_c::write_new_stack_%(...)" || // -> access32/64.cc - "% ...::bx_cpu_c::system_write_%(...)" || // -> access.cc - "% ...::bx_cpu_c::v2h_write_byte(...)"; // -> access.cc -*/ - - - // - // Injects a bitflip each time the guest system requests to write/read - // data to/from RAM at the (hardcoded) addresses defined above: - // - // Event source: "memory write/read access" - // - advice execution (injection_methods()) : before () - { - for(size_t i = 0; i < fi::evbuf.getEventCount(); i++) // check for active events - { - fi::SimpleBitFlip* pEv = dynamic_cast(fi::evbuf.getEvent(i)); // FIXME: Performance verbessern - if(pEv && *(tjp->arg<1>())/*typed!*/ == pEv->getAddress()) - { - cout << " " << tjp->signature() << endl; - - // Get a pointer to the data that should be written to RAM - // *before* it is actually written: - Bit32u* pData = (Bit32u*)(tjp->arg(JoinPoint::ARGS-1)); - - // Flip bit at position pEv->getBitPos(): - char* ptr = (char*)pData; // For simplification we're just looking at the - // first byte of the data - ptr[0] = (ptr[0]) ^ (pEv->getMask() << pEv->getBitPos()); - - cout << " >>> Bit flipped at index " << pEv->getBitPos() - << " at address 0x" << hex << (*(tjp->arg<1>())) << "!" << endl; - fi::evbuf.fireEvent(pEv); - // Continue... (maybe more events to process) - } - } - } -/* - // - // Shows the mapping of a virtual address (within eCos) to a *host* address: - // - if(g_fEnableInjection) // event fired? - { - g_fEnableInjection = false; - const unsigned SEGMENT_SELECTOR_IDX = 2; // always the code segment (seg-base-addr should be zero) - const bx_address logicalAddr = MEM_ADDR_TO_INJECT; // offset within the segment ("local eCos address") - - // Get the linear address: - Bit32u linearAddr = pThis->get_laddr32(SEGMENT_SELECTOR_IDX/ *seg* /, logicalAddr/ *offset* /); - // Map the linear address to the physical address: - bx_phy_address physicalAddr; - bx_bool fValid = pThis->dbg_xlate_linear2phy(linearAddr, (bx_phy_address*)&physicalAddr); - // Determine the *host* address of the physical address: - Bit8u* hostAddr = BX_MEM(0)->getHostMemAddr(pThis, physicalAddr, BX_READ); - // Now, hostAddr contains the "final" address where we are allowed to inject errors: - *(unsigned*)hostAddr = BAD_VALUE; // inject error - if(!fValid) - printf("[Error]: Could not map logical address to host address.\n"); - else - printf("[Info]: Error injected at logical addr %p (host addr %p).\n", logicalAddr, hostAddr); - } -*/ -}; - -#endif // CONFIG_FI_MEM_ACCESS_BITFLIP - -#endif // __MEM_ACCESS_BIT_FLIP_AH__ - diff --git a/deprecated/old-experiments/DataRetrievalExperiment.cc b/deprecated/old-experiments/DataRetrievalExperiment.cc deleted file mode 100644 index c059a26f..00000000 --- a/deprecated/old-experiments/DataRetrievalExperiment.cc +++ /dev/null @@ -1,36 +0,0 @@ -#include - -#include "DataRetrievalExperiment.hpp" -#include "../SAL/SALInst.hpp" -#include "../controller/Event.hpp" -#include "ExperimentDataExample/FaultCoverageExperiment.pb.h" - -using namespace std; -using namespace fail; - -#define MEMTEST86_BREAKPOINT 0x4EDC - -bool DataRetrievalExperiment::run() -{ - cout << "[getExperimentDataExperiment] Experiment start." << endl; - - // Breakpoint address for Memtest86: - BPSingleEvent mainbp(MEMTEST86_BREAKPOINT); - simulator.addEventAndWait(&mainbp); - cout << "[getExperimentDataExperiment] Breakpoint reached." << endl; - - FaultCoverageExperimentData* test = NULL; - cout << "[getExperimentDataExperiment] Getting ExperimentData (FaultCoverageExperiment)..." << endl; - test = simulator.getExperimentData(); - cout << "[getExperimentDataExperiment] Content of ExperimentData (FaultCoverageExperiment):" << endl; - - if (test->has_data_name()) - cout << "Name: "<< test->data_name() << endl; - // m_instrptr1 augeben - cout << "m_instrptr1: " << hex << test->m_instrptr1() << endl; - // m_instrptr2 augeben - cout << "m_instrptr2: " << hex << test->m_instrptr2() << endl; - - simulator.clearEvents(this); - return true; // experiment successful -} diff --git a/deprecated/old-experiments/DataRetrievalExperiment.hpp b/deprecated/old-experiments/DataRetrievalExperiment.hpp deleted file mode 100644 index b7a1fc6f..00000000 --- a/deprecated/old-experiments/DataRetrievalExperiment.hpp +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef __DATA_RETRIEVAL_EXPERIMENT_HPP__ - #define __DATA_RETRIEVAL_EXPERIMENT_HPP__ - -#include "../controller/ExperimentFlow.hpp" - -class DataRetrievalExperiment : public fail::ExperimentFlow -{ - public: - DataRetrievalExperiment() { } - - bool run(); -}; - -#endif // __DATA_RETRIEVAL_EXPERIMENT_HPP__ diff --git a/deprecated/old-experiments/ExperimentDataExample/CMakeLists.txt b/deprecated/old-experiments/ExperimentDataExample/CMakeLists.txt deleted file mode 100644 index 53084df2..00000000 --- a/deprecated/old-experiments/ExperimentDataExample/CMakeLists.txt +++ /dev/null @@ -1,19 +0,0 @@ -## Setup desired protobuf descriptions HERE ## -set(MY_PROTOS - FaultCoverageExperiment.proto -) - -set(SRCS - example.cc -) - -#### PROTOBUFS #### -find_package(Protobuf REQUIRED) -include_directories(${PROTOBUF_INCLUDE_DIRS}) -include_directories(${CMAKE_CURRNET_BINARY_DIR}) - -PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS ${MY_PROTOS} ) - -## Build library -add_library(fcexperimentmessage ${PROTO_SRCS} ${SRCS} ) - diff --git a/deprecated/old-experiments/ExperimentDataExample/FaultCoverageExperiment.proto b/deprecated/old-experiments/ExperimentDataExample/FaultCoverageExperiment.proto deleted file mode 100644 index 831cc292..00000000 --- a/deprecated/old-experiments/ExperimentDataExample/FaultCoverageExperiment.proto +++ /dev/null @@ -1,7 +0,0 @@ -message FaultCoverageExperimentData{ - - optional string data_name = 1; - required int64 m_InstrPtr1 = 2; - required int64 m_InstrPtr2 = 3; - -} diff --git a/deprecated/old-experiments/ExperimentDataExample/build_example.sh b/deprecated/old-experiments/ExperimentDataExample/build_example.sh deleted file mode 100755 index 8a012673..00000000 --- a/deprecated/old-experiments/ExperimentDataExample/build_example.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -cd $(dirname $0) -g++ ../../controller/JobServer.cc ../../controller/ExperimentDataQueue.cc example.cc FaultCoverageExperiment.pb.cc -o ./ExperimentData_example -l protobuf -pthread diff --git a/deprecated/old-experiments/ExperimentDataExample/example.cc b/deprecated/old-experiments/ExperimentDataExample/example.cc deleted file mode 100644 index e45b910a..00000000 --- a/deprecated/old-experiments/ExperimentDataExample/example.cc +++ /dev/null @@ -1,63 +0,0 @@ -#include -#include - -#include "controller/ExperimentData.hpp" -#include "controller/ExperimentDataQueue.hpp" -#include "jobserver/JobServer.hpp" -#include "FaultCoverageExperiment.pb.h" - -using namespace std; - -int main(int argc, char* argv[]) -{ - // FIXME: Translation missing. - - ExperimentDataQueue exDaQu; - ExperimentData* readFromQueue; - - // Daten in Struktur schreiben und in Datei speichern - ofstream fileWrite; - fileWrite.open("test.txt"); - - FaultCoverageExperimentData faultCovExWrite; - // Namen setzen - faultCovExWrite.set_data_name("Testfall 42"); - // Instruktionpointer 1 - faultCovExWrite.set_m_instrptr1(0x4711); - // Instruktionpointer 2 - faultCovExWrite.set_m_instrptr2(0x1122); - - // In ExperimentData verpacken - ExperimentData exDaWrite(&faultCovExWrite); - // In Queue einbinden - exDaQu.addData(&exDaWrite); - // Aus Queue holen - if (exDaQu.size() != 0) - readFromQueue = exDaQu.getData(); - - // Serialisierung ueber Wrapper-Methode in ExperimentData - readFromQueue->serialize(&fileWrite); -// cout << "Ausgabe: " << out << endl; - fileWrite.close(); - - //--------------------------------------------------------------- - - // Daten aus Datei lesen und in Struktur schreiben - ifstream fileRead; - fileRead.open("test.txt"); - FaultCoverageExperimentData faultCovExRead; - ExperimentData exDaRead(&faultCovExRead); - exDaRead.unserialize( &fileRead); - - // Wenn Name, dann ausgeben - if(faultCovExRead.has_data_name()){ - cout << "Name: "<< faultCovExRead.data_name() << endl; - } - // m_instrptr1 augeben - cout << "m_instrptr1: " << faultCovExRead.m_instrptr1() << endl; - // m_instrptr2 augeben - cout << "m_instrptr2: " << faultCovExRead.m_instrptr2() << endl; - fileRead.close(); - - return 0; -} diff --git a/deprecated/old-experiments/JumpAndRunExperiment/JumpAndRunExperiment.hpp b/deprecated/old-experiments/JumpAndRunExperiment/JumpAndRunExperiment.hpp deleted file mode 100644 index 5a0ef392..00000000 --- a/deprecated/old-experiments/JumpAndRunExperiment/JumpAndRunExperiment.hpp +++ /dev/null @@ -1,76 +0,0 @@ -#ifndef __JUMP_AND_RUN_EXPERIMENT_HPP__ - #define __JUMP_AND_RUN_EXPERIMENT_HPP__ - -#include - -#include "../controller/ExperimentFlow.hpp" -#include "../SAL/SALInst.hpp" -#include "../SAL/bochs/BochsRegister.hpp" -#include "config/FailConfig.hpp" - -// Check if aspect dependencies are satisfied: -#if !defined(CONFIG_EVENT_CPULOOP) || !defined(CONFIG_EVENT_JUMP) - #error Breakpoint- and jump-events needed! Enable aspects first (see FailConfig.hpp)! -#endif - -using namespace std; -using namespace fail; - -class JumpAndRunExperiment : public fail::ExperimentFlow { -public: - bool run() - { - /************************************ - * Description of experiment flow. * - ************************************/ - // Wait for function entry adresss: - cout << "[JumpAndRunExperiment] Setting up experiment. Allowing to " - << "start now." << endl; - BPEvent mainFuncEntry(0x3c1f); - simulator.addEvent(&mainFuncEntry); - if (&mainFuncEntry != simulator.waitAny()) { - cerr << "[JumpAndRunExperiment] Now, we are completely lost! " - << "It's time to cry! :-(" << endl; - simulator.clearEvents(this); - return false; - } - else - cout << "[JumpAndRunExperiment] Entry of main function reached! " - << " Let's see who's jumping around here..." << endl; - - const unsigned COUNTER = 20000; - unsigned i = 0; - BxFlagsReg* pFlags = dynamic_cast(simulator. - getRegisterManager().getSetOfType(RT_ST).snatch()); - assert(pFlags != NULL && "FATAL ERROR: NULL ptr not expected!"); - JumpEvent ev; - // Catch the next "counter" jumps: - while (++i <= COUNTER) { - ev.setWatchInstructionPointer(ANY_INSTR); - simulator.addEvent(&ev); - if (simulator.waitAny() != &ev) { - cerr << "[JumpAndRunExperiment] Damn! Something went " - << "terribly wrong! Who added that event?! :-(" << endl; - simulator.clearEvents(this); - return false; - } - else - cout << "[JumpAndRunExperiment] Jump detected. Instruction: " - << "0x" hex << ev.getTriggerInstructionPointer() - << " -- FLAGS [CF, ZF, OF, PF, SF] = [" - << pFlags->getCarryFlag() << ", " - << pFlags->getZeroFlag() << ", " - << pFlags->getOverflowFlag() << ", " - << pFlags->getParityFlag() << ", " - << pFlags->getSignFlag() << "]." << endl; - } - cout << "[JumpAndRunExperiment] " << dec << counter - << " jump(s) detected -- enough for today...exiting! :-)" - << endl; - - simulator.clearEvents(this); - return true; - } -}; - -#endif // __JUMP_AND_RUN_EXPERIMENT_HPP__ diff --git a/deprecated/old-experiments/MemWriteExperiment.hpp b/deprecated/old-experiments/MemWriteExperiment.hpp deleted file mode 100644 index e82317bd..00000000 --- a/deprecated/old-experiments/MemWriteExperiment.hpp +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef __MEM_WRITE_EXPERIMENT_HPP__ - #define __MEM_WRITE_EXPERIMENT_HPP__ - -#include - -#include "../controller/ExperimentFlow.hpp" -#include "../SAL/SALInst.hpp" -#include "config/FailConfig.hpp" - -// Check aspect dependencies: -#if !defined(CONFIG_EVENT_CPULOOP) || !defined(CONFIG_EVENT_MEMACCESS) || !defined(CONFIG_SR_SAVE) || !defined(CONFIG_FI_MEM_ACCESS_BITFLIP) - #error Event dependecies not satisfied! Enabled needed aspects in FailConfig.hpp! -#endif - -using namespace std; -using namespace fail; - -class MemWriteExperiment : public fail::ExperimentFlow { -public: - bool run() // Example experiment (defines "what we wanna do") - { - /************************************ - * Description of experiment flow. * - ************************************/ - - // 1. Add some events (set up the experiment): - cout << "[MemWriteExperiment] Setting up experiment. Allowing to" - << " start now." << endl; - MemWriteEvent mem1(0x000904F0), mem2(0x02ff0916), mem3(0x0050C8E8); - BPEvent breakpt(0x4ae6); - simulator.addEvent(&mem1); - simulator.addEvent(&mem2); - simulator.addEvent(&mem3); - simulator.addEvent(&breakpt); - - // 2. Wait for event condition "(id1 && id2) || id3" to become true: - cout << "[MemWriteExperiment] Waiting for condition (1) (\"(id1 &&" - << " id2) || id3\") to become true..." << endl; - bool f1 = false, f2 = false, f3 = false, f4 = false; - while (!(f1 || f2 || f3 || f4)) { - BPEvent* pev = simulator.waitAny(); - cout << "[MemWriteExperiment] Received event id=" << id - << "." << endl; - if(pev == &mem4) - f4 = true; - if(pev == &mem3) - f3 = true; - if(pev == &mem2) - f2 = true; - if(pev == &mem1) - f1 = true; - } - cout << "[MemWriteExperiment] Condition (1) satisfied! Ready to " - << "add next event..." << endl; - // 3. Add a new event now: - cout << "[MemWriteExperiment] Adding new Event..."; cout.flush(); - simulator.clearEvents(); // remove residual events in the buffer - // (we're just interested in the new event) - simulator.save("./bochs_save_point"); - cout << "done!" << endl; - - // 4. Continue simulation (waitAny) and inject bitflip: - // ... - - simulator.clearEvents(this); - return true; - } -}; - -#endif // __MEM_WRITE_EXPERIMENT_HPP__ - diff --git a/deprecated/old-experiments/MyExperiment.hpp b/deprecated/old-experiments/MyExperiment.hpp deleted file mode 100644 index 540984b4..00000000 --- a/deprecated/old-experiments/MyExperiment.hpp +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef __MY_EXPERIMENT_HPP__ - #define __MY_EXPERIMENT_HPP__ - -#include - -#include "../controller/ExperimentFlow.hpp" -#include "../SAL/SALInst.hpp" - -using namespace std; -using namespace fail; - -class MyExperiment : public fail::ExperimentFlow { -public: - bool run() // Example experiment (defines "what we wanna do") - { - /************************************ - * Description of experiment flow. * - ************************************/ - - // 1. Add some events (set up the experiment): - cout << "[MyExperiment] Setting up experiment. Allowing to start" - << " now." << endl; - BPEvent ev1(0x8048A00), ev2(0x8048F01), ev3(0x3c1f); - simulator.addEvent(&ev1); - simulator.addEvent(&ev2); - simulator.addEvent(&ev3); - - // 2. Wait for event condition "(id1 && id2) || id3" to become true: - BPEvent* pev; - cout << "[MyExperiment] Waiting for condition (1) (\"(id1 && id2)" - << " || id3\") to become true..." << endl; - bool f1 = false, f2 = false, f3 = false; - while (!((f1 && f2) || f3)) { - pev = simulator.waitAny(); - cout << "[MyExperiment] Received event id=" << pev->getId() - << "." << endl; - if(pev == &ev3) - f3 = true; - if(pev == &ev2) - f2 = true; - if(pev == &ev1) - f1 = true; - } - cout << "[MyExperiment] Condition (1) satisfied! Ready..." << endl; - // Remove residual (for all active experiments!) - // events in the buffer: - simulator.clearEvents(); - BPEvent foobar(ANY_ADDR); - foobar.setCounter(400); - cout << "[MyExperiment] Adding breakpoint-event, firing after the" - << " next 400 instructions..."; cout.flush(); - simulator.addEventAndWait(&foobar); - cout << "cought! Exiting now." << endl; - - simulator.clearEvents(this); - return true; - } -}; - -#endif // __MY_EXPERIMENT_HPP__ diff --git a/deprecated/old-experiments/SingleSteppingExperiment.hpp b/deprecated/old-experiments/SingleSteppingExperiment.hpp deleted file mode 100644 index ad42f180..00000000 --- a/deprecated/old-experiments/SingleSteppingExperiment.hpp +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef __SINGLE_STEPPING_EXPERIMENT_HPP__ - #define __SINGLE_STEPPING_EXPERIMENT_HPP__ - -#include - -#include "../controller/ExperimentFlow.hpp" -#include "../SAL/SALInst.hpp" -#include "config/FailConfig.hpp" -#include "../SAL/bochs/BochsRegister.hpp" - -// Check if aspect dependency is satisfied: -#ifndef CONFIG_EVENT_CPULOOP - #error Breakpoint-events needed! Enable aspect first (see FailConfig.hpp)! -#endif - -using namespace std; -using namespace fail; - -#define FUNCTION_ENTRY_ADDRESS 0x3c1f - -class SingleSteppingExperiment : public fail::ExperimentFlow { -public: - bool run() - { - /************************************ - * Description of experiment flow. * - ************************************/ - // Wait for function entry adresss: - cout << "[SingleSteppingExperiment] Setting up experiment. Allowing" - << " to start now." << endl; - BPEvent mainFuncEntry(FUNCTION_ENTRY_ADDRESS); - simulator.addEvent(&mainFuncEntry); - if (&mainFuncEntry != simulator.waitAny()) { - cerr << "[SingleSteppingExperiment] Now, we are completely lost!" - << " It's time to cry! :-(" << endl; - simulator.clearEvents(this); - return false; - } - cout << "[SingleSteppingExperiment] Entry of main function reached!" - << " Beginning single-stepping..." << endl; - char action; - while (true) { - BPEvent bp(ANY_ADDR); - simulator.addEvent(&bp); - simulator.waitAny(); - cout << "0x" << hex - << simulator.getRegisterManager().getInstructionPointer() - << endl; - cout << "Continue (y/n)? "; - cin >> action; cin.sync(); cin.clear(); - if (action != 'y') - break; - } - - simulator.clearEvents(this); - return true; - } -}; - -#endif // __SINGLE_STEPPING_EXPERIMENT_HPP__ diff --git a/deprecated/old-experiments/instantiate-experiment.ah.template b/deprecated/old-experiments/instantiate-experiment.ah.template deleted file mode 100644 index 78b473d7..00000000 --- a/deprecated/old-experiments/instantiate-experiment.ah.template +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef __INSTANTIATE_EXPERIMENT_AH__ - #define __INSTANTIATE_EXPERIMENT_AH__ - -// copy this file to a .ah file and instantiate the experiment(s) you need - -#include "hscsimple.hpp" -#include "../SAL/SALInst.hpp" - -aspect hscsimple { - hscsimpleExperiment experiment; - advice execution ("void fail::SimulatorController::initExperiments()") : after () { - fail::simulator.addFlow(&experiment); - } -}; - -#endif // __INSTANTIATE_EXPERIMENT_AH__ diff --git a/deprecated/old-tests/CMakeLists.txt b/deprecated/old-tests/CMakeLists.txt deleted file mode 100644 index e994624d..00000000 --- a/deprecated/old-tests/CMakeLists.txt +++ /dev/null @@ -1,34 +0,0 @@ -## Setup desired protobuf descriptions HERE ## -#set(MY_PROTOS -# TestData.proto -#) - -set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake) - -#find_package (LibElf REQUIRED) -#find_package (LibDwarf REQUIRED) - -#### PROTOBUFS #### -#find_package(Protobuf REQUIRED) -#include_directories(${PROTOBUF_INCLUDE_DIRS}) -include_directories(${CMAKE_BINARY_DIR}) -include_directories(${CMAKE_CURERNT_BINARY_DIR}) - -#PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS ${MY_PROTOS} ) - -## Build library -#add_library(testmessages ${PROTO_SRCS}) - -## Add some tests -#add_executable(testclient client.cc ) -#add_executable(testclient testjc.cc ) -#add_executable(testserver server.cc) -#target_link_libraries(testclient fail ${PROTOBUF_LIBRARY} ${CMAKE_THREAD_LIBS_INIT} anexperimentmessage protomessages) -#target_link_libraries(testserver fail ${PROTOBUF_LIBRARY} ${CMAKE_THREAD_LIBS_INIT} anexperimentmessage protomessages) - - -#add_executable(dwarf dwarf.cc) -#target_link_libraries(dwarf ${LIBDWARF_LIBRARIES} ${LIBELF_LIBRARIES} ) -#include_directories(${CMAKE_BINARY_DIR}/core/experiments/MHTestCampaign) -#add_executable(mhcampaign mhcampaign.cc) -#target_link_libraries(mhcampaign mhtestcampaign fail ${PROTOBUF_LIBRARY} ${Boost_THREAD_LIBRARY}) diff --git a/deprecated/old-tests/TestData.proto b/deprecated/old-tests/TestData.proto deleted file mode 100644 index 5f01e07e..00000000 --- a/deprecated/old-tests/TestData.proto +++ /dev/null @@ -1,6 +0,0 @@ -message TestData { - optional string foo = 1; - optional int64 input = 2; - - optional int64 output = 3; -} diff --git a/deprecated/old-tests/client.cc b/deprecated/old-tests/client.cc deleted file mode 100644 index 6d8f7ef0..00000000 --- a/deprecated/old-tests/client.cc +++ /dev/null @@ -1,110 +0,0 @@ -#include - -#include "jobserver/messagedefs/FailControlMessage.pb.h" -#include "jobserver/SocketComm.hpp" - -#include "experiments/AnExperiment/AnExperiment.pb.h" - -#include - -using namespace std; - -void error(const char *s) -{ - perror(s); - exit(0); -} - - -template -Message *get_job(int sockfd) -{ - Message *msg = new Message; - FailControlMessage ctrlmsg; - - ctrlmsg.set_command(FailControlMessage_Command_NEED_WORK); - ctrlmsg.set_build_id(42); - - cout << "Sending need work msg: " << ctrlmsg.build_id() << ", Command: " << ctrlmsg.command() << endl; - fail::SocketComm::send_msg(sockfd, ctrlmsg); - cout << "sent ctrl message." << endl; - fail::SocketComm::rcv_msg(sockfd, ctrlmsg); - cout << "Received ctrl message: " << ctrlmsg.command() << endl; - switch(ctrlmsg.command()){ - case FailControlMessage_Command_DIE: return 0; - case FailControlMessage_Command_WORK_FOLLOWS: - fail::SocketComm::rcv_msg(sockfd, *msg); - return msg; - default: - cerr << "wtf?" << endl; - } - return 0; -} - -template -void return_result(int sockfd, Message *msg) -{ - FailControlMessage ctrlmsg; - - ctrlmsg.set_command(FailControlMessage_Command_RESULT_FOLLOWS); - ctrlmsg.set_build_id(42); - cout << "Sending Result msg: " << ctrlmsg.build_id() << ", Command: " << ctrlmsg.command() << endl; - fail::SocketComm::send_msg(sockfd, ctrlmsg); - fail::SocketComm::send_msg(sockfd, *msg); - delete msg; -} - -int main(int argc, char **argv){ - int portno; - struct hostent *server; - - cout << "JobClient" << endl; - - if (argc < 3) { - cerr << "usage: " << argv[0] << " hostname port" << endl; - return 1; - } - portno = atoi(argv[2]); - server = gethostbyname(argv[1]); - if (server == NULL) { - cerr << "cannot resolve host " << argv[1] << endl; - return 1; - } - - int i = 1; - while (1) { - int sockfd; - struct sockaddr_in serv_addr; - cout << ">>>>>>>>>Durchgang " << i++ << endl; - sockfd = socket(AF_INET, SOCK_STREAM, 0); - if (sockfd < 0) { - error("socket()"); - } - memset(&serv_addr, 0, sizeof(serv_addr)); - serv_addr.sin_family = AF_INET; - memcpy(&serv_addr.sin_addr.s_addr, server->h_addr, server->h_length); - serv_addr.sin_port = htons(portno); - - if (connect(sockfd, (sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { - error("connect()"); - } - - MHTestData *msg = get_job(sockfd); - if(!msg){ - break; - close(sockfd); - } - cout << "[Minion] received job input: " << msg->input() << endl; - cout << "[Minion] Calculating " << msg->input() << "^2 = " << msg->input() * msg->input() << endl; - msg->set_output(msg->input() * msg->input()); - sleep(1); - cout << "[Minion] returning result: " << msg->output() << endl; - - return_result(sockfd, msg); - - close(sockfd); - } - cout << "ByeBye" << endl; - return 0; -} - diff --git a/deprecated/old-tests/dwarf.cc b/deprecated/old-tests/dwarf.cc deleted file mode 100644 index 27fa6efd..00000000 --- a/deprecated/old-tests/dwarf.cc +++ /dev/null @@ -1,163 +0,0 @@ -/* Code sample: Using libdwarf for getting the address of a function -** from DWARF in an ELF executable. -** Not much error-handling or resource-freeing is done here... -** -** Eli Bendersky (http://eli.thegreenplace.net) -** This code is in the public domain. -*/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -void die(char* fmt, ...) -{ - va_list args; - - va_start(args, fmt); - vfprintf(stderr, fmt, args); - va_end(args); - - exit(EXIT_FAILURE); -} - - -/* List a function if it's in the given DIE. -*/ -void list_func_in_die(Dwarf_Debug dgb, Dwarf_Die the_die) -{ - char* die_name = 0; - const char* tag_name = 0; - Dwarf_Error err; - Dwarf_Half tag; - Dwarf_Attribute* attrs; - Dwarf_Addr lowpc, highpc; - Dwarf_Signed attrcount, i; - int rc = dwarf_diename(the_die, &die_name, &err); - - if (rc == DW_DLV_ERROR) - die("Error in dwarf_diename\n"); - else if (rc == DW_DLV_NO_ENTRY) - return; - - if (dwarf_tag(the_die, &tag, &err) != DW_DLV_OK) - die("Error in dwarf_tag\n"); - - /* Only interested in subprogram DIEs here */ - if (tag != DW_TAG_subprogram) - return; - - if (dwarf_get_TAG_name(tag, &tag_name) != DW_DLV_OK) - die("Error in dwarf_get_TAG_name\n"); - - printf("DW_TAG_subprogram: '%s'\n", die_name); - - /* Grab the DIEs attributes for display */ - if (dwarf_attrlist(the_die, &attrs, &attrcount, &err) != DW_DLV_OK) - die("Error in dwarf_attlist\n"); - - for (i = 0; i < attrcount; ++i) { - Dwarf_Half attrcode; - if (dwarf_whatattr(attrs[i], &attrcode, &err) != DW_DLV_OK) - die("Error in dwarf_whatattr\n"); - - /* We only take some of the attributes for display here. - ** More can be picked with appropriate tag constants. - */ - if (attrcode == DW_AT_low_pc) - dwarf_formaddr(attrs[i], &lowpc, 0); - else if (attrcode == DW_AT_high_pc) - dwarf_formaddr(attrs[i], &highpc, 0); - } - - printf("low pc : 0x%08llx\n", lowpc); - printf("high pc : 0x%08llx\n", highpc); -} - - -/* List all the functions from the file represented by the given descriptor. -*/ -void list_funcs_in_file(Dwarf_Debug dbg) -{ - Dwarf_Unsigned cu_header_length, abbrev_offset, next_cu_header; - Dwarf_Half version_stamp, address_size; - Dwarf_Error err; - Dwarf_Die no_die = 0, cu_die, child_die; - - /* Find compilation unit header */ - while (dwarf_next_cu_header( - dbg, - &cu_header_length, - &version_stamp, - &abbrev_offset, - &address_size, - &next_cu_header, - &err) != DW_DLV_ERROR) { - - /* Expect the CU to have a single sibling - a DIE */ - if (dwarf_siblingof(dbg, no_die, &cu_die, &err) == DW_DLV_ERROR) - die("Error getting sibling of CU\n"); - - /* Expect the CU DIE to have children */ - if (dwarf_child(cu_die, &child_die, &err) == DW_DLV_ERROR) - die("Error getting child of CU DIE\n"); - - /* Now go over all children DIEs */ - while (1) { - int rc; - list_func_in_die(dbg, child_die); - - rc = dwarf_siblingof(dbg, child_die, &child_die, &err); - - if (rc == DW_DLV_ERROR) - die("Error getting sibling of DIE\n"); - else if (rc == DW_DLV_NO_ENTRY) - break; /* done */ - } -} -} - -int main(int argc, char** argv) -{ - Dwarf_Debug dbg = 0; - Dwarf_Error err; - const char* progname; - int fd = -1; - - if (argc < 2) { - fprintf(stderr, "Expected a program name as argument\n"); - return 1; - } - - progname = argv[1]; - if ((fd = open(progname, O_RDONLY)) < 0) { - perror("open"); - return 1; - } - - if (dwarf_init(fd, DW_DLC_READ, 0, 0, &dbg, &err) != DW_DLV_OK) { - fprintf(stderr, "Failed DWARF initialization\n"); - return 1; - } - - list_funcs_in_file(dbg); - - if (dwarf_finish(dbg, &err) != DW_DLV_OK) { - fprintf(stderr, "Failed DWARF finalization\n"); - return 1; - } - - close(fd); - return 0; -} - - - diff --git a/deprecated/old-tests/main.elf b/deprecated/old-tests/main.elf deleted file mode 100755 index 526ef3a0f086fb51fa9cb341402a4c23ba04d1d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 313919 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

?QgiU-=_!x)BfUhX;opNjcW!Tep7Sjs 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 z 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

Vi1ux0!wkpIfkS(CczzR1mBR50`T1S&@vdB3 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 g^48d22w?1>!>5 -#include "experiments/AnExperiment.hpp" - -#include - - -fail::JobServer js; -using namespace std; - -static const int nums = 30; - -void exec_js(){ - js.waitForConnections(); - cout << "That's it.." << endl; - -} - - - -int main(int argc, char**argv){ - - - cout << "Testing Jobserver" << endl; - boost::thread th(exec_js); - - AnExperimentData* datas[nums]; - - for(int i = 1; i <= nums; i++){ - datas[i] = new AnExperimentData; - datas[i]->setInput(i); - js.addExperiment(datas[i]); - usleep(100 * 1000); // 100 ms - } - js.setNoMoreExperiments(); - - // test results. - int f; - int res = 0; - int res2 = 0; - AnExperimentData * exp; - for(int i = 1; i <= nums; i++){ - exp = static_cast( js.m_doneJobs.Dequeue() ); - f = exp->getOutput(); -// cout << ">>>>>>>>>>>>>>> Output: " << i << "^2 = " << f << endl; - res += f; - res2 += (i*i); - delete exp; - } - if (res == res2) { - cout << "TEST SUCCESSFUL FINISHED! " << "[" << res << "==" << res2 << "]" << endl; - }else{ - cout << "TEST FAILED!" << " [" << res << "!=" << res2 << "]" << endl; - } - cout << "thats all, waiting for server thread. " << endl; - js.done(); - - th.join(); - - return 0; -} - diff --git a/deprecated/old-tests/testjc.cc b/deprecated/old-tests/testjc.cc deleted file mode 100644 index b45bf545..00000000 --- a/deprecated/old-tests/testjc.cc +++ /dev/null @@ -1,42 +0,0 @@ -#include -#include "jobserver/JobClient.hpp" - -#include "experiments/AnExperiment.hpp" - - -using namespace std; -using namespace fail; -int main(int argc, char** argv){ - - int portno; - JobClient* jc; - cout << "JobClient" << endl; - if(argc == 1){ - jc = new JobClient(); - }else if(argc == 3){ - portno = atoi(argv[2]); - jc = new JobClient(argv[1], portno); - }else{ - cerr << "usage: " << argv[0] << " hostname port" << endl; - return 1; - } - - AnExperimentData exp; - - while(1){ - if(jc->getExperimentData(exp)){ - /// Do some work. - cout << "Got data: " << exp.getInput() << endl; - int result = exp.getInput() * exp.getInput(); - usleep(500 * 1000); // 500 ms - /// Send back. - exp.setOutput(result); - jc->sendResult(exp); - }else{ - cout << "No (more) data for me :(" << endl; - break; - } - } - delete jc; - -} diff --git a/deprecated/old-utils/ExperimentDataQueue.cc b/deprecated/old-utils/ExperimentDataQueue.cc deleted file mode 100644 index 2670ebb7..00000000 --- a/deprecated/old-utils/ExperimentDataQueue.cc +++ /dev/null @@ -1,24 +0,0 @@ -#include "ExperimentDataQueue.hpp" - -#include - -// FIXME: This is deprecated stuff. Remove it. - -namespace fi -{ - -void ExperimentDataQueue::addData(ExperimentData* exp) -{ - assert(exp != 0); - m_queue.push_front(exp); -} - -ExperimentData* ExperimentDataQueue::getData() -{ - ExperimentData* ret = m_queue.back(); - m_queue.pop_back(); - return ret; -} - - -} diff --git a/deprecated/old-utils/ExperimentDataQueue.hpp b/deprecated/old-utils/ExperimentDataQueue.hpp deleted file mode 100644 index edcf5b85..00000000 --- a/deprecated/old-utils/ExperimentDataQueue.hpp +++ /dev/null @@ -1,55 +0,0 @@ -/** - * \brief A queue for experiment data. - * - * - * \author Martin Hoffmann, Richard Hellwig - * - */ - -// FIXME: This is deprecated stuff. Remove it. - -#ifndef __EXPERIMENT_DATA_QUEUE_H__ -#define __EXPERIMENT_DATA_QUEUE_H__ - - -#include -#include "ExperimentData.hpp" - - -namespace fi{ - -/** - * \class ExperimentDataQueue - * Class which manage ExperimentData in a queue. - */ - class ExperimentDataQueue - { - protected: - std::deque m_queue; - - public: - ExperimentDataQueue() {} - ~ExperimentDataQueue() {} - - /** - * Adds ExperimentData to the queue. - * @param exp ExperimentData that is to be added to the queue. - */ - void addData(ExperimentData* exp); - /** - * Returns an item from the queue - * @return the next element of the queue - */ - ExperimentData* getData(); - /** - * Returns the number of elements in the queue - * @return the size of teh queue - */ - size_t size() const { return m_queue.size(); }; - }; - -}; - -#endif //__EXPERIMENT_DATA_QUEUE_H__ - - diff --git a/deprecated/old-utils/Signal.cc b/deprecated/old-utils/Signal.cc deleted file mode 100644 index a862e5d2..00000000 --- a/deprecated/old-utils/Signal.cc +++ /dev/null @@ -1,16 +0,0 @@ - -// Author: Adrian Böckenkamp -// Date: 15.06.2011 - -// FIXME: This is deprecated stuff. Delete it. - -#include "Signal.hpp" - -namespace fi -{ - -std::auto_ptr Signal::m_This; -Mutex Signal::m_InstanceMutex; - - -} // end-of-namespace: fi diff --git a/deprecated/old-utils/Signal.hpp b/deprecated/old-utils/Signal.hpp deleted file mode 100644 index cddaefca..00000000 --- a/deprecated/old-utils/Signal.hpp +++ /dev/null @@ -1,135 +0,0 @@ -#ifndef __SIGNAL_HPP__ - #define __SIGNAL_HPP__ - -// FIXME: This is deprecated stuff. Delete it. - -#include -#include -#include -#ifndef __puma -#include -#include - -#include -#include -#endif - -namespace fi -{ - -#ifndef __puma -typedef boost::mutex Mutex; // lock/unlock -typedef boost::mutex::scoped_lock ScopeLock; // use RAII with lock/unlock mechanism -typedef boost::condition_variable ConditionVariable; // wait/notify_one -#else -typedef int Mutex; -typedef int ScopeLock; -typedef int ConditionVariable; -#endif - -// Simulate a "private" semaphore using boost-mechanisms: -class Semaphore -{ - private: - Mutex m_Mutex; - ConditionVariable m_CondVar; - unsigned long m_Value; - public: - // Create a semaphore object based on a mutex and a condition variable - // and initialize it to value "init". - Semaphore(unsigned long init = 0) : m_Value(init) { } - - void post() - { - ScopeLock lock(m_Mutex); - ++m_Value; // increase semaphore value: -#ifndef __puma - m_CondVar.notify_one(); // wake up other thread, currently waiting on condition var. -#endif - } - - void wait() - { - ScopeLock lock(m_Mutex); -#ifndef __puma - while(!m_Value) // "wait-if-zero" - m_CondVar.wait(lock); -#endif - --m_Value; // decrease semaphore value - } -}; - -class Signal -{ - private: - static Mutex m_InstanceMutex; // used to sync calls to getInst() - static std::auto_ptr m_This; // the one and only instance - - Semaphore m_semBochs; - Semaphore m_semContr; - Semaphore m_semSimCtrl; - bool m_Locked; // prevent misuse of thread-sync - - // Singleton class (forbid creation, copying and assignment): - Signal() - : m_semBochs(0), m_semContr(0), - m_semSimCtrl(0), m_Locked(false) { } - Signal(Signal const& s) - : m_semBochs(), m_semContr(), - m_semSimCtrl(), m_Locked(false) { } // never called. - Signal& operator=(Signal const&) { return *this; } // dito. - ~Signal() { } - friend class std::auto_ptr; - public: - static Signal& getInst() - { - ScopeLock lock(m_InstanceMutex); // lock/unlock handled by RAII principle - if(!m_This.get()) - m_This.reset(new Signal()); - return (*m_This); - } - - // Called from Experiment-Controller class ("beyond Bochs"): - void lockExperiment() - { - assert(!m_Locked && - "[Signal::lockExperiment]: lockExperiment called twice without calling unlockExperiment() in between."); - m_Locked = true; - m_semContr.wait(); // suspend experiment process - } - - // Called from Experiment-Controller class ("beyond Bochs"): - void unlockExperiment() - { - assert(m_Locked && - "[Signal::unlockExperiment]: unlockExperiment called twice without calling lockExperiment() in between."); - m_Locked = false; - m_semBochs.post(); // resume experiment (continue bochs simulation) - } - - // Called from Advice-Code ("within Bochs") to trigger event occurrence: - void signalEvent() - { - m_semContr.post(); // Signal event (to Experiment-Controller) - m_semBochs.wait(); // Wait upon handling to finish - } - - // Called from Experiment-Controller to allow simulation start: - void startSimulation() - { - m_semSimCtrl.post(); - } - - // Called from Bochs, directly after thread creation for Experiment-Controller: - // (This ensures that Bochs waits until the experiment has been set up in the - // Experiment-Controller.) - void waitForStartup() - { - m_semSimCtrl.wait(); - } -}; - -} // end-of-namespace: fi - -#endif /* __SIGNAL_HPP__ */ - diff --git a/deprecated/old-utils/SynchronizedExperimentDataQueue.cc b/deprecated/old-utils/SynchronizedExperimentDataQueue.cc deleted file mode 100644 index edea7276..00000000 --- a/deprecated/old-utils/SynchronizedExperimentDataQueue.cc +++ /dev/null @@ -1,25 +0,0 @@ -#include "SynchronizedExperimentDataQueue.hpp" - -// FIXME: This file is not used. Delete it either. - -namespace fi { - -void SynchronizedExperimentDataQueue::addData(ExperimentData* exp){ - // - m_sema_full.wait(); - ExperimentDataQueue::addData(exp); - m_sema_empty.post(); - // -} - - -ExperimentData* SynchronizedExperimentDataQueue::getData(){ - // - m_sema_empty.wait(); - return ExperimentDataQueue::getData(); - m_sema_full.post(); - // -} - - -}; diff --git a/deprecated/old-utils/SynchronizedExperimentDataQueue.hpp b/deprecated/old-utils/SynchronizedExperimentDataQueue.hpp deleted file mode 100644 index eaf46c40..00000000 --- a/deprecated/old-utils/SynchronizedExperimentDataQueue.hpp +++ /dev/null @@ -1,57 +0,0 @@ -/** - * \brief A queue for experiment data. - * - * - * \author Martin Hoffmann, Richard Hellwig - * - */ - -// FIXME: This file is not used. Delete it. - -#ifndef __SYNC_EXPERIMENT_DATA_QUEUE_H__ -#define __SYNC_EXPERIMENT_DATA_QUEUE_H__ - -#include "ExperimentDataQueue.hpp" -#include "Signal.hpp" - -namespace fi{ - -/** - * \class SynchronizedExperimentDataQueue - * Class which manage ExperimentData in a queue. - * Thread safe using semphores. - */ - class SynchronizedExperimentDataQueue : public ExperimentDataQueue - { - private: - /// There are maxSize elements in at a time - /// Or do we allow a really possibly huge queue? - Semaphore m_sema_full; - Semaphore m_sema_empty; - - public: - SynchronizedExperimentDataQueue(int maxSize = 1024) : m_sema_full(maxSize), m_sema_empty(0) {} - ~SynchronizedExperimentDataQueue() {} - - /** - * Adds ExperimentData to the queue. - * @param exp ExperimentData that is to be added to the queue. - */ - void addData(ExperimentData* exp); - /** - * Returns an item from the queue - * @return the next element of the queue - */ - ExperimentData* getData(); - /** - * Returns the number of elements in the queue - * @return the size of the queue - */ - size_t size() const { return m_queue.size(); }; - }; - -}; - -#endif //__EXPERIMENT_DATA_QUEUE_H__ - -