From bda14f8185b60fe9c8a1087d2d50272d367c0c46 Mon Sep 17 00:00:00 2001
From: Bjoern Esswein <bjoern.esswein@gmail.com>
Date: Sun, 16 Feb 2020 14:43:20 +0100
Subject: [PATCH] fixed sem.c jbuffer.c

---
 jbuffer.c |  9 +++++----
 sem.c     | 30 ++++++++++++++++--------------
 2 files changed, 21 insertions(+), 18 deletions(-)

diff --git a/jbuffer.c b/jbuffer.c
index 758db3d..3951b21 100644
--- a/jbuffer.c
+++ b/jbuffer.c
@@ -8,12 +8,14 @@ struct BNDBUF
     int size;
     int insertpos; // next insert pos
     SEM *freeSpaceSem; // count of free slots
-    _Atomic int extractpos; // next extract pos
+    int extractpos; // next extract pos
     SEM *usedSpaceSem; // count of used slots
 };
 
 BNDBUF *bbCreate(size_t size) {
-    BNDBUF *bb = malloc(sizeof(BNDBUF));
+    if(size > __INT_MAX__) return NULL;//to big
+
+    BNDBUF *bb = calloc(1, sizeof(BNDBUF));//initialize everithing with NULL
     if(bb == NULL) return NULL;//malloc failed
 
     bb->buff = malloc(size * sizeof(int));
@@ -21,7 +23,6 @@ BNDBUF *bbCreate(size_t size) {
         bbDestroy(bb);
         return NULL;
     }
-    //TODO: handle size too big
     bb->size = (int) size;
 
     //init SEMs
@@ -44,7 +45,7 @@ BNDBUF *bbCreate(size_t size) {
 
 void bbDestroy(BNDBUF *bb) {
     if(bb == NULL) return;
-    free(bb->buff);
+    free(bb->buff);//each does noting if NULL
     semDestroy(bb->freeSpaceSem);
     semDestroy(bb->usedSpaceSem);
     free(bb);
diff --git a/sem.c b/sem.c
index c5dd85e..29b7bf0 100644
--- a/sem.c
+++ b/sem.c
@@ -13,9 +13,20 @@ struct SEM
 SEM *semCreate(int initVal) {
     SEM *sem = malloc(sizeof(SEM));
     if(sem == NULL) return NULL;// malloc failed
-
-    pthread_mutex_init(&sem->m, NULL);// no errors
-    pthread_cond_init(&sem->c, NULL);// no errors
+    int err=0;
+    err = pthread_mutex_init(&sem->m, NULL);
+    if(err) {
+        free(sem);
+        errno = err;
+        return NULL;
+    }
+    err = pthread_cond_init(&sem->c, NULL);
+    if (err) {
+        pthread_mutex_destroy(&sem->m);
+        free(sem);
+        errno = err;
+        return NULL;
+    }
 
     sem->value = initVal;
     return sem;
@@ -24,17 +35,8 @@ SEM *semCreate(int initVal) {
 void semDestroy(SEM *sem) {
     if(sem == NULL) return;
     
-    errno = 0;
-    errno = pthread_cond_destroy(&sem->c);
-    if(errno != 0) {
-        return;
-    }
-
-    errno = pthread_mutex_destroy(&sem->m);
-    if(errno != 0) {
-        return;
-    }
-
+    pthread_cond_destroy(&sem->c);//ignore returned errors
+    pthread_mutex_destroy(&sem->m);//ignore returned errors
     free(sem);
 }
 
-- 
GitLab