diff --git a/.gitignore b/.gitignore index 259148f..6f09d05 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,7 @@ *.exe *.out *.app + +# Build Folders +bin/ +obj/ diff --git a/README.md b/README.md index 2490130..47499c3 100644 --- a/README.md +++ b/README.md @@ -12,3 +12,11 @@ This was originally formulated in 1965 by Edsger Dijkstra as a student exam exer ## Solution +### Waiting State + - The philosopher enters into a waiting state when neighbors are eating + - When its neighbors are done, go for the forks + - Its neighbors can't enter into the waiting state if there is a neighbor already waiting + +## Tests + +Tests are done using googletests diff --git a/code/README.md b/code/README.md new file mode 100644 index 0000000..787935f --- /dev/null +++ b/code/README.md @@ -0,0 +1,14 @@ +# Dining Philosopher Implementation + +## Build +`make all` +## Execution +Run the executable: + +`./bin/dining-philosopher` +## Build Test +`make test` +## Run Tests +Run the executable: + +`./bin/unittest` diff --git a/code/makefile b/code/makefile new file mode 100644 index 0000000..a64da3d --- /dev/null +++ b/code/makefile @@ -0,0 +1,87 @@ +.DEFAULT_GOAL := all + + +# Include directories +INCDIR := \ + -I$(FUSED_GTEST_DIR) \ + -I$(FUSED_GTEST_DIR)/src \ + + +SRCDIR=src +BINDIR=bin +OBJDIR=obj +LIBDIR=lib +TSTDIR=unittest + +CC=gcc +CXX=g++ +CFLAGS =-I$(SRCDIR) $(INCDIR) +CXXFLAGS =-I$(SRCDIR) $(INCDIR) +LDFLAGS =-L$(LIBDIR) +LDLIBS = -lrt +TSTLIBS = -lrt -lgtest -lgtest_main -pthread -lcrypto -lssl -lgcrypt -lgpg-error + +OUTFILE=dining-philosopher +TESTFILE=unittest + +CODEFILES := $(shell find $(SRCDIR) -type f -not -path "$(TSTDIR)/*") +CFILES := $(filter %.c,$(CODEFILES)) +CPPFILES := $(filter %.cpp,$(CODEFILES)) +SRCFILES := $(CFILES) $(CPPFILES) +HDRFILES := $(filter %.h,$(CODEFILES)) +OBJFILES := $(subst $(SRCDIR), $(OBJDIR),$(CPPFILES:%.cpp=%.o) $(CFILES:%.c=%.o)) + +EXCFILE := main.* +TESTCODEFILES := $(shell find $(SRCDIR) -type f -not -name "$(EXCFILE)") +TESTCODEFILES += $(shell find $(TSTDIR) -type f ) +TESTCFILES := $(filter %.c,$(TESTCODEFILES)) +TESTCPPFILES := $(filter %.cpp,$(TESTCODEFILES)) +TESTOBJFILES := $(subst $(TSTDIR)/, $(OBJDIR)/, $(subst $(SRCDIR)/, $(OBJDIR)/,$(TESTCPPFILES:%.cpp=%.o) $(TESTCFILES:%.c=%.o))) + +$(OBJDIR)/%.o: $(SRCDIR)/%.c $(HDRFILES) + mkdir -p $(dir $@) + $(CC) -c -o $@ $< $(CFLAGS) +$(OBJDIR)/%.o: $(TSTDIR)/%.c $(HDRFILES) + mkdir -p $(dir $@) + $(CC) -c -o $@ $< $(CFLAGS) + +$(OBJDIR)/%.o: $(SRCDIR)/%.cpp $(HDRFILES) + mkdir -p $(dir $@) + $(CXX) -c -o $@ $< $(CXXFLAGS) + +$(OBJDIR)/%.o: $(TSTDIR)/%.cpp $(HDRFILES) + mkdir -p $(dir $@) + $(CXX) -c -o $@ $< $(CXXFLAGS) + +$(OUTFILE): $(OBJFILES) + mkdir -p $(BINDIR) + $(CXX) -o $(BINDIR)/$@ $^ $(CXXFLAGS) $(LDFLAGS) $(LDLIBS) + +$(TESTFILE): $(TESTOBJFILES) + echo $(TESTOBJFILES) + mkdir -p $(BINDIR) + $(CXX) -o $(BINDIR)/$@ $^ $(CXXFLAGS) $(LDFLAGS) $(TSTLIBS) + +# $(OUTFILE): $(OBJFILES) +# mkdir -p $(BINDIR) +# ar rc $(BINDIR)/$@ $^ +# ranlib $(BINDIR)/$@ + +debug: CXXFLAGS += -DDEBUG -O0 -ggdb3 +debug: CFLAGS += -DDEBUG -O0 -ggdb3 +debug: $(OUTFILE) + +test: CXXFLAGS += -DDEBUG -O0 -ggdb3 +test: CFLAGS += -DDEBUG -O0 -ggdb3 +test: $(TESTFILE) + +rebuild: clean $(OUTFILE) + +.PHONY: all clean test + +all: $(OUTFILE) + +clean: + rm -rf $(OBJDIR)/* + rm -rf $(BINDIR)/* + \ No newline at end of file diff --git a/code/src/main.cpp b/code/src/main.cpp new file mode 100644 index 0000000..3551fbb --- /dev/null +++ b/code/src/main.cpp @@ -0,0 +1,6 @@ +#include "waiting-state/philosopher.h" + +int main() +{ + return 0; +} \ No newline at end of file diff --git a/code/src/waiting-state/philosopher.cpp b/code/src/waiting-state/philosopher.cpp new file mode 100644 index 0000000..da2d0e0 --- /dev/null +++ b/code/src/waiting-state/philosopher.cpp @@ -0,0 +1,25 @@ +#include "philosopher.h" + +using namespace WaitingPhilosopher; + +Philosopher::Philosopher() +{ + +} + +bool Philosopher::checkNeighbor() +{ + bool neighborBusy = true; + + return neighborBusy; +} + +void Philosopher::wait() +{ + +} + +void Philosopher::eat() +{ + +} \ No newline at end of file diff --git a/code/src/waiting-state/philosopher.h b/code/src/waiting-state/philosopher.h new file mode 100644 index 0000000..0001545 --- /dev/null +++ b/code/src/waiting-state/philosopher.h @@ -0,0 +1,27 @@ +#ifndef PHILOSOPHER_H_ +#define PHILOSOPHER_H_ + +// #ifdef __cplusplus +// extern "C" { +// #endif +#include + +namespace WaitingPhilosopher +{ + class Philosopher + { + public: + Philosopher(); + bool checkNeighbor(); + void wait(); + void eat(); + protected: + bool waitingState = true; + + + }; +} + +#endif /* PHILOSOPHER_H_ */ + +// EOF \ No newline at end of file diff --git a/code/unittest/test-waiting-state.cpp b/code/unittest/test-waiting-state.cpp new file mode 100644 index 0000000..b65cfac --- /dev/null +++ b/code/unittest/test-waiting-state.cpp @@ -0,0 +1,40 @@ +#include "gtest/gtest.h" +#include +#include "waiting-state/philosopher.h" + +using namespace WaitingPhilosopher; +using namespace std; + +class WaitingPhilosopherTest : public testing::Test +{ + public: + + void SetUp() override { } + void TearDown() override { } + + // Per-test-suite set-up. + // Called before the first test in this test suite. + // Can be omitted if not needed. + static void SetUpTestSuite() + { + + } + + // Per-test-suite tear-down. + // Called after the last test in this test suite. + // Can be omitted if not needed. + static void TearDownTestSuite() + { + + } +}; + + +TEST_F(WaitingPhilosopherTest, evenPhilosophers) +{ + Philosopher nietzche; + ASSERT_TRUE(nietzche.checkNeighbor()); + + +} + diff --git a/code/unittest/testmain.cpp b/code/unittest/testmain.cpp new file mode 100644 index 0000000..dadb1a1 --- /dev/null +++ b/code/unittest/testmain.cpp @@ -0,0 +1,10 @@ +#include +#include "gtest/gtest.h" + +using namespace std; + +GTEST_API_ int main(int argc, char **argv) +{ + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} \ No newline at end of file