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); }