Commit 0d4b8472 authored by Felix Morgner's avatar Felix Morgner
Browse files

week12: add resources

parent 3df13379
# Exercise 11 - Mutexes and Atomics
# Exercise 12 - Exception Safety and Pimpl Idiom
In this exercise...
* ... you will implement a thread-safe container
* ... apply atomics to the Peterson mutex in C++
* ... analyze code with data races and race conditions
* ... you will analyze your `BoundedBuffer` regarding exception-safety
* ... you implement the Pimpl Idiom
# 1. TESTAT 3: `BoundedQueue` with Timed Operations
# 1. Exception Safety
In this exercise you will wrap your `BoundedBuffer` in a thread-safe `BoundedQueue`.
## Standard Container Safety
Please form groups of 1-3 students for testat hand-in:
* Send an email to [Thomas Corbat](mailto:thomas.corbat@hsr.ch)
* ***Subject***: `[CPlA-Testat-3] hsrname1 hsrname2 hsrname3`
* Content: `BoundedQueue.h`
* You will get feedback as soon as possible
* Hand-in deadline: Sunday 12. May 2019 23:59
Analyze the exception safety guarantees of `std::vector` on [cppreference](https://en.cppreference.com/w/cpp/container/vector).
## a. Interface of `BoundedQueue`
Your `BoundedQueue` shall provide the following functionality:
* `push(T)` - Both copy and move / or forwarding. This operation blocks if the `BoundedQueue` is full.
* `T pop()` - Always returns the popped value. This operation blocks if the `BoundedQueue`is empty.
* `bool try_push(T const &)` - Tries to put a `T` into the queue. If the queue is not full and put operation has been successful it returns `true`, otherwise it returns `false`.
* `bool try_pop(T&)` - Tries to pop a `T` from the queue. If the queue is not empty and the pop operation has been suffessful it returns `true` and the popped value is in the out parameter, otherwise it returns `false`.
* `size()`, `empty()` and `full()`
* copy/move operations
* `bool try_push_for(T const &, std::chrono::duration)` - The same as `try_push`, but if the operation would block longer than the given duration it returns `false` too. The operation is not performed then.
* `bool try_pop_for(T &, std::chrono::duration)` - The same as `try_pop`, but if the operation would block longer than the given duration it returns `false` too. The operation is not performed then.
In order to avoid duplicating the whole implementation of `BoundedBuffer` you should write `BoundedQueue` as a wrapper for `BoundedBuffer` and delegate the functionality of the queue to it.
* Use strategized locking for your `BoundedQueue`. The used mutex and condition variable types shall be template parameters. Use `std::mutex` and `std::condition_variable` as default arguments.
* Make sure that exceptions do not keep the mutex locked. Use an appropriate standard wrapper type.
## b. Theory Questions
* Why does it not make sense to use `front()` and `back()` member functions for a thread-safe container?
* Why is it difficult to provide iterators for a thread-safe container?
* Why is `BoundedQueue::pop()` returning a `T` by value compared to the `void` return type of `BoundedBuffer::pop()`.
## Exception Safety of `BoundedBuffer`
Analyze your `BoundedBuffer` implementation with regard to the exception safety guarantees we have discussed in the lecture.
* Which functions are `noexcept`?
* Which functions provide the strong guarantee?
* Which functions provide the basic guarantee?
* Which functions provide no guarantee?
## Guarantee Improvements
Try to implement every function in a way that it has at least the strong guarantee?
### Move Operations and `swap`
The move operations, i.e. move constructor and move assignment operations, usually rely on the `swap` member function. It would be desirable to have a `swap` member function that is unconditionally `noexcept`.
### Copy Operations
The copy operations, i.e. copy constructor and copy assignment operations, depend on the copyablilty of the element type. Test your buffer against the following requirements:
* The copy constructor is exception neutral and forwards exceptions thrown while copying the elements.
* Elements already copied have to be cleaned up properly.
* Copy assignment is exception neutral and forwards exceptions thrown while copying the elements.
* Elements already copied have to be cleaned up properly.
* If an exception occurs during copy assignment, the `this` object must not be modified! (Strong Guarantee)
* You can apply the copy-swap idiom to achieve this
# 2. Pimpl Idiom
In this exercise we use an adapted version of Felix Morgner's [Building Reusable Libraries](https://github.com/fmorgner/building-reusable-libraries/) examples. In the [template](./exercise_templates/w12_template_02_PimplUnicorn) CUTE project you find the `Unicorn` class, which is tested by the test cases in the `tests` directory. To demonstrate the benefit of the Pimpl Idiom we have created separate header and source files for every test case.
## Pimpl with `std::unique_ptr`
Adapt the `Unicorn` class to use the Pimpl Idiom. Hide all non-public members in the `UnicornImpl` class, which is local to the `Unicorn.cpp` file. Use a `std::unique_ptr` for the `pimpl` pointer.
* Which test cases cannot be compiled without adding explicit functionality to the `Unicorn` class after applying the Pimpl Idiom?
* Which special member functions' default implementation can be used to reenable their corresponding functionality?
* What are the advantages and disadvantages if you used an `std::shared_ptr` instead?
* You might have recognized that the `calculateAltitude()` member function has `int` as return type. Change the return type to `std::size_t` in the implementation with and without the Pimpl Unicorn. Can you spot a difference in the number of files that need to be compiled?
## Advanced: Pimpl Pointer (Optional)
Due to the requirement of the `std::unique_ptr` class template to be able to resolve the elements constructor at the point of declaration, unless an custom deleter is supplied, we need to dclare the destructor of `Unicorn`. However, it would also be possible to declare the `std::unique_ptr<class UnicornImpl, void(*)(class UnicornImpl *)>` with the explicit deleter function type as second template argument. This lifts the requirement of the destructor `~Unicorn` being known upfront.
* Create an alias template `PimplPointer<T>` that aliases `std::unique_ptr` for the given type and the deleter function, as mentioned above.
* Add a factory function `makeUniquePimpl()` that creates a `PimplPointer`. It takes any number of arguments and forwards them to the heap construction of the `T` element, which has to be stored in the `PimplPointer`. Additionally, as the second argument for the construction of the `PimplPointer`, a function has to be supplied for destroying the `T` object.
* Adapt `Unicorn` to use the `PimplPointer`.
* Which special member functions can now have their declaration removed?
* Did the size of a `Unicorn` change?
***Hints:***
* Heap allocation of `T` requires explicit call of `new`.
* For cleanup the `std::destroy_at` function can be used.
# 2. Peterson Mutex (Not Testat)
From the module Parallel Programming you should be familiar with the Peterson Mutex. If you need to recap it you can find it on the Skripte server [here](https://skripte.hsr.ch/Informatik/Fachbereich/Parallele_Programmierung/ParProg/Uebungen/09_Memory_Models_TESTAT2/).
Below you have the implementation ported to C++ using volatile. While this works in Java, it is incorrect in C++.
```cpp
struct PetersonMutexVolatile {
// acquire lock by thread 0
void thread0Lock() {
state0 = true;
turn = 1;
while (turn == 1 && state1);
}
void thread0Unlock() {
state0 = false;
}
// acquire lock by thread 1
void thread1Lock() {
state1 = true;
turn = 0;
while (turn == 0 && state0);
}
// release lock by thread 1
void thread1Unlock() {
state1 = false;
}
private:
volatile bool state0 { false };
volatile bool state1 { false };
volatile int turn { 0 };
};
```
* It is necessary to use atomics to make the implementation work in C++. Create a type PetersonMutexAtomics that works correctly.
* You might need to set the build option in Cevelop to Release in order to enable optimizations. Otherwise, potentially incorrect implementations might not fail.
# 3. Optional - CVU Student Critique (Not Testat)
In one of the past cvu magazines the following problem was posted:
Can you help the student and analyze her/his code and correct the bugs?
"I wanted to learn a bit about C++ threading to I tried writing a thread pool example. But it sometimes crashes - I've managed to get it down to a small example. Sometimes I get what I expected as output, for example:
```
Worker done
Worker done
Ending thread #2
Ending thread #0
Worker done
Ending thread #1
Worker done
Ending thread #3
Worker done
All done
```
But other times I get a failure, for example:
```
Worker done
Ending thread #0
Worker done
Awaiting thread #1
Worker done
W
<crash>
```
I'm not sure what to do next - can you help? It is sufficient to recognize the issues, you don't need to solve them.
```cpp
#include <algorithm>
using namespace std;
#include <array>
#include <chrono>
using namespace chrono;
#include <cstdlib>
#include <iostream>
#include <thread>
static const int POOL_SIZE = 4;
// Allow up to 4 active threads
array<thread, POOL_SIZE> pool;
// Example 'worker' -- would in practice
// perform some, potentially slow, calculation
void worker()
{
this_thread::sleep_for(
milliseconds(rand() % 1000));
cout << "Worker done\n";
}
// Launch the thread functoid 't' in a new
// thread, if there's room for one
template <typename T>
bool launch(T t)
{
auto it = find_if(pool.begin(), pool.end(),
[](thread const &thr)
{ return thr.get_id() == thread::id(); }
);
if (it == pool.end())
{
// everyone is busy
return false;
}
*it = thread([=]()
{
t();
thread self;
swap(*it, self);
self.detach();
cout << "Ending thread #"
<< (it - pool.begin()) << "\n";
});
return true;
}
int main()
{
while (launch(worker))
{}
// And run one in this thread
// as an example of what we do
// when the pool is full
worker();
for (auto & it : pool)
{
thread thread;
swap(thread, it);
if (thread.joinable())
{
cout << "Awaiting thread #"
<< (&it - &*pool.begin()) << "\n";
thread.join();
}
}
cout << "All done\n";
}
```
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
<storageModule moduleId="org.eclipse.cdt.core.settings">
<cconfiguration id="cdt.managedbuild.config.gnu.mingw.exe.debug.311395151">
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.mingw.exe.debug.311395151" moduleId="org.eclipse.cdt.core.settings" name="Debug">
<externalSettings/>
<extensions>
<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.MachO64" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.Cygwin_PE" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
</extensions>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.mingw.exe.debug.311395151" name="Debug" parent="cdt.managedbuild.config.gnu.mingw.exe.debug">
<folderInfo id="cdt.managedbuild.config.gnu.mingw.exe.debug.311395151." name="/" resourcePath="">
<toolChain id="cdt.managedbuild.toolchain.gnu.mingw.exe.debug.481238386" name="MinGW GCC" superClass="cdt.managedbuild.toolchain.gnu.mingw.exe.debug">
<targetPlatform binaryParser="org.eclipse.cdt.core.PE;org.eclipse.cdt.core.MachO64;org.eclipse.cdt.core.Cygwin_PE;org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="cdt.managedbuild.target.gnu.platform.mingw.exe.debug.1646611247" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.mingw.exe.debug"/>
<builder buildPath="${workspace_loc:/w12_solution_02_PimplUnicorn}/Debug" id="cdt.managedbuild.tool.gnu.builder.mingw.base.1848782096" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="CDT Internal Builder" superClass="cdt.managedbuild.tool.gnu.builder.mingw.base"/>
<tool id="cdt.managedbuild.tool.gnu.assembler.mingw.exe.debug.1524132954" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.exe.debug">
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.both.asm.option.include.paths.1520272575" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/cute}&quot;"/>
</option>
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.807385767" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
</tool>
<tool id="cdt.managedbuild.tool.gnu.archiver.mingw.base.1548855921" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.mingw.base"/>
<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.debug.1526421901" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.debug">
<option id="gnu.cpp.compiler.mingw.exe.debug.option.optimization.level.1320670963" name="Optimization Level" superClass="gnu.cpp.compiler.mingw.exe.debug.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
<option defaultValue="gnu.cpp.compiler.debugging.level.max" id="gnu.cpp.compiler.mingw.exe.debug.option.debugging.level.1405730984" name="Debug Level" superClass="gnu.cpp.compiler.mingw.exe.debug.option.debugging.level" useByScannerDiscovery="false" valueType="enumerated"/>
<option id="gnu.cpp.compiler.option.dialect.flags.1591750248" name="Other dialect flags" superClass="gnu.cpp.compiler.option.dialect.flags" useByScannerDiscovery="true" value="-std=c++1z" valueType="string"/>
<option id="gnu.cpp.compiler.option.other.other.1150454772" name="Other flags" superClass="gnu.cpp.compiler.option.other.other" useByScannerDiscovery="false" value="-c -fmessage-length=0 -Wno-attributes" valueType="string"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.include.paths.1559101056" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/cute}&quot;"/>
<listOptionValue builtIn="false" value="&quot;C:\MinGWs\MinGW-16\include&quot;"/>
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/w12_solution_02_PimplUnicorn}&quot;"/>
</option>
<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.582947818" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
</tool>
<tool id="cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug.745188205" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug">
<option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.mingw.exe.debug.option.optimization.level.75881905" name="Optimization Level" superClass="gnu.c.compiler.mingw.exe.debug.option.optimization.level" useByScannerDiscovery="false" valueType="enumerated"/>
<option defaultValue="gnu.c.debugging.level.max" id="gnu.c.compiler.mingw.exe.debug.option.debugging.level.1708198845" name="Debug Level" superClass="gnu.c.compiler.mingw.exe.debug.option.debugging.level" useByScannerDiscovery="false" valueType="enumerated"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.include.paths.973571903" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/cute}&quot;"/>
</option>
<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1441739899" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
</tool>
<tool id="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.debug.1756582063" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.debug"/>
<tool id="cdt.managedbuild.tool.gnu.cpp.linker.mingw.exe.debug.1981162436" name="MinGW C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.mingw.exe.debug">
<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1390070573" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
</inputType>
</tool>
</toolChain>
</folderInfo>
<sourceEntries>
<entry excluding="tests/TestCopyAssignUnicorn.cpp|tests/TestCopyConstructUnicorn.cpp|cute" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="cute"/>
</sourceEntries>
</configuration>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
</cconfiguration>
<cconfiguration id="cdt.managedbuild.config.gnu.mingw.exe.release.1861725392">
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.mingw.exe.release.1861725392" moduleId="org.eclipse.cdt.core.settings" name="Release">
<externalSettings/>
<extensions>
<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.MachO64" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.Cygwin_PE" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
</extensions>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.mingw.exe.release.1861725392" name="Release" parent="cdt.managedbuild.config.gnu.mingw.exe.release">
<folderInfo id="cdt.managedbuild.config.gnu.mingw.exe.release.1861725392." name="/" resourcePath="">
<toolChain id="cdt.managedbuild.toolchain.gnu.mingw.exe.release.905929677" name="MinGW GCC" superClass="cdt.managedbuild.toolchain.gnu.mingw.exe.release">
<targetPlatform binaryParser="org.eclipse.cdt.core.PE;org.eclipse.cdt.core.MachO64;org.eclipse.cdt.core.Cygwin_PE;org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF" id="cdt.managedbuild.target.gnu.platform.mingw.exe.release.690305564" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.mingw.exe.release"/>
<builder buildPath="${workspace_loc:/w12_solution_02_PimplUnicorn}/Release" id="cdt.managedbuild.tool.gnu.builder.mingw.base.769029112" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="CDT Internal Builder" superClass="cdt.managedbuild.tool.gnu.builder.mingw.base"/>
<tool id="cdt.managedbuild.tool.gnu.assembler.mingw.exe.release.370548532" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.exe.release">
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.both.asm.option.include.paths.403053432" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/cute}&quot;"/>
</option>
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.128517243" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
</tool>
<tool id="cdt.managedbuild.tool.gnu.archiver.mingw.base.833131565" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.mingw.base"/>
<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.release.1399119384" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.release">
<option id="gnu.cpp.compiler.mingw.exe.release.option.optimization.level.1793754223" name="Optimization Level" superClass="gnu.cpp.compiler.mingw.exe.release.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
<option defaultValue="gnu.cpp.compiler.debugging.level.none" id="gnu.cpp.compiler.mingw.exe.release.option.debugging.level.812059742" name="Debug Level" superClass="gnu.cpp.compiler.mingw.exe.release.option.debugging.level" useByScannerDiscovery="false" valueType="enumerated"/>
<option id="gnu.cpp.compiler.option.dialect.flags.1706040258" name="Other dialect flags" superClass="gnu.cpp.compiler.option.dialect.flags" useByScannerDiscovery="true" value="-std=c++1z" valueType="string"/>
<option id="gnu.cpp.compiler.option.other.other.671508654" name="Other flags" superClass="gnu.cpp.compiler.option.other.other" useByScannerDiscovery="false" value="-c -fmessage-length=0 -Wno-attributes" valueType="string"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.cpp.compiler.option.include.paths.68294941" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/cute}&quot;"/>
</option>
<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.195166720" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
</tool>
<tool id="cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.release.689293666" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.release">
<option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.mingw.exe.release.option.optimization.level.1131019670" name="Optimization Level" superClass="gnu.c.compiler.mingw.exe.release.option.optimization.level" useByScannerDiscovery="false" valueType="enumerated"/>
<option defaultValue="gnu.c.debugging.level.none" id="gnu.c.compiler.mingw.exe.release.option.debugging.level.1966005351" name="Debug Level" superClass="gnu.c.compiler.mingw.exe.release.option.debugging.level" useByScannerDiscovery="false" valueType="enumerated"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="gnu.c.compiler.option.include.paths.82947620" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/cute}&quot;"/>
</option>
<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1882934630" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
</tool>
<tool id="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.release.982059305" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.release"/>
<tool id="cdt.managedbuild.tool.gnu.cpp.linker.mingw.exe.release.955517314" name="MinGW C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.mingw.exe.release">
<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1257417091" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
</inputType>
</tool>
</toolChain>
</folderInfo>
<sourceEntries>
<entry excluding="cute" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="cute"/>
</sourceEntries>
</configuration>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
</cconfiguration>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<project id="w12_solution_02_PimplUnicorn.cdt.managedbuild.target.gnu.mingw.exe.1031429028" name="Executable" projectType="cdt.managedbuild.target.gnu.mingw.exe"/>
</storageModule>
<storageModule moduleId="scannerConfiguration">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.311395151;cdt.managedbuild.config.gnu.mingw.exe.debug.311395151.;cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.debug.1526421901;cdt.managedbuild.tool.gnu.cpp.compiler.input.582947818">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
</scannerConfigBuildInfo>
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.debug.311395151;cdt.managedbuild.config.gnu.mingw.exe.debug.311395151.;cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug.745188205;cdt.managedbuild.tool.gnu.c.compiler.input.1441739899">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
</scannerConfigBuildInfo>
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.release.1861725392;cdt.managedbuild.config.gnu.mingw.exe.release.1861725392.;cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.release.1399119384;cdt.managedbuild.tool.gnu.cpp.compiler.input.195166720">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
</scannerConfigBuildInfo>
<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.mingw.exe.release.1861725392;cdt.managedbuild.config.gnu.mingw.exe.release.1861725392.;cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.release.689293666;cdt.managedbuild.tool.gnu.c.compiler.input.1882934630">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
</scannerConfigBuildInfo>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
<storageModule moduleId="refreshScope"/>
</cproject>
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>w12_solution_02_PimplUnicorn</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
<triggers>clean,full,incremental,</triggers>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
<triggers>full,incremental,</triggers>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>ch.hsr.ifs.cute.ui.cutenature</nature>
<nature>org.eclipse.cdt.core.cnature</nature>
<nature>org.eclipse.cdt.core.ccnature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
</natures>
</projectDescription>
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>w11_solution_02_PimplUnicorn</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
<triggers>clean,full,incremental,</triggers>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
<triggers>full,incremental,</triggers>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>ch.hsr.ifs.cute.ui.cutenature</nature>
<nature>org.eclipse.cdt.core.cnature</nature>
<nature>org.eclipse.cdt.core.ccnature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
</natures>
</projectDescription>
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment