diff --git a/jbuffer.c b/jbuffer.c
index 758db3dcd2e52d71303a13290d9cb54e9a5bbe58..3951b2104ed80c6e07d7477f1bd757ac97da22a8 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 c5dd85e8a14aff19d2a915eac209ac673f628ce0..29b7bf0e38dba25e05251fbf008070767e101d7d 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);
 }