void DaoState_Delete( DaoState *self ) { DaoGC_DecRC( self->state ); DaoGC_DecRC( (DaoValue*)self->lock ); DaoGC_DecRC( (DaoValue*)self->defmtx ); DaoGC_DecRC( (DaoValue*)self->demands ); DaoCstruct_Free( (DaoCstruct*)self ); dao_free( self ); }
void DaoQueue_Delete( DaoQueue *self ) { QueueItem *item; while( self->tail != NULL ){ item = self->tail; self->tail = item->previous; DaoGC_DecRC( item->value ); dao_free( item ); } DaoGC_DecRC( (DaoValue*)self->mtx ); DaoGC_DecRC( (DaoValue*)self->pushvar ); DaoGC_DecRC( (DaoValue*)self->popvar ); DaoCstruct_Free( (DaoCstruct*)self ); dao_free( self ); }
static void DaoQueue_Pop( DaoProcess *proc, DaoValue *p[], int N ) { DaoQueue *self = (DaoQueue*)DaoValue_CastCstruct( p[0], NULL ); QueueItem *item = NULL; DaoMutex_Lock( self->mtx ); while( !self->size ) DaoCondVar_Wait( self->popvar, self->mtx ); item = self->head; self->head = item->next; if( !self->head ) self->tail = NULL; else self->head->previous = NULL; if( self->capacity && self->size == self->capacity ) DaoCondVar_Signal( self->pushvar ); self->size--; DaoMutex_Unlock( self->mtx ); DaoProcess_PutValue( proc, item->value ); DaoGC_DecRC( item->value ); dao_free( item ); }
static void DaoQueue_TryPush( DaoProcess *proc, DaoValue *p[], int N ) { DaoQueue *self = (DaoQueue*)DaoValue_CastCstruct( p[0], NULL ); QueueItem *item = (QueueItem*)dao_malloc( sizeof(QueueItem) ); float timeout = DaoValue_TryGetFloat( p[2] ); int pushable = 0, timed = 0; item->value = NULL; DaoValue_Copy( p[1], &item->value ); item->next = NULL; DaoMutex_Lock( self->mtx ); if( timeout == 0 ) pushable = ( !self->capacity || self->size < self->capacity ); else if( timeout < 0 ){ while( self->capacity && self->size == self->capacity ) DaoCondVar_Wait( self->pushvar, self->mtx ); pushable = 1; } else{ while( !timed && self->capacity && self->size == self->capacity ) timed = DaoCondVar_TimedWait( self->pushvar, self->mtx, timeout ); pushable = !timed; } if( pushable ){ item->previous = self->tail; if( self->tail ) self->tail->next = item; else{ self->head = item; DaoCondVar_Signal( self->popvar ); } self->tail = item; self->size++; } DaoMutex_Unlock( self->mtx ); if( !pushable ){ DaoGC_DecRC( item->value ); dao_free( item ); } DaoProcess_PutInteger( proc, pushable ); }
static void DaoQueue_TryPop( DaoProcess *proc, DaoValue *p[], int N ) { DaoQueue *self = (DaoQueue*)DaoValue_CastCstruct( p[0], NULL ); QueueItem *item = NULL; float timeout = DaoValue_TryGetFloat( p[1] ); int popable = 0, timed = 0; DaoMutex_Lock( self->mtx ); if( timeout == 0 ) popable = self->size; else if( timeout < 0 ){ while( !self->size ) DaoCondVar_Wait( self->popvar, self->mtx ); popable = 1; } else{ while( !timed && !self->size ) timed = DaoCondVar_TimedWait( self->popvar, self->mtx, timeout ); popable = !timed; } if( popable ){ item = self->head; self->head = item->next; if( !self->head ) self->tail = NULL; else self->head->previous = NULL; if( self->capacity && self->size == self->capacity ) DaoCondVar_Signal( self->pushvar ); self->size--; } DaoMutex_Unlock( self->mtx ); DaoProcess_PutValue( proc, item? item->value : dao_none_value ); if( item ){ DaoGC_DecRC( item->value ); dao_free( item ); } }
void DaoxGlyph_Delete( DaoxGlyph *self ) { DaoCstruct_Free( (DaoCstruct*) self ); DaoGC_DecRC( (DaoValue*) self->shape ); dao_free( self ); }