/* Release resources belonging to task @p. */ void domain_destroy(struct domain *d) { struct domain **pd; atomic_t old, new; BUG_ON(!d->is_dying); /* May be already destroyed, or get_domain() can race us. */ _atomic_set(old, 0); _atomic_set(new, DOMAIN_DESTROYED); old = atomic_compareandswap(old, new, &d->refcnt); if ( _atomic_read(old) != 0 ) return; /* Delete from task list and task hashtable. */ TRACE_1D(TRC_SCHED_DOM_REM, d->domain_id); spin_lock(&domlist_update_lock); pd = &domain_list; while ( *pd != d ) pd = &(*pd)->next_in_list; rcu_assign_pointer(*pd, d->next_in_list); pd = &domain_hash[DOMAIN_HASH(d->domain_id)]; while ( *pd != d ) pd = &(*pd)->next_in_hashbucket; rcu_assign_pointer(*pd, d->next_in_hashbucket); spin_unlock(&domlist_update_lock); /* Schedule RCU asynchronous completion of domain destroy. */ call_rcu(&d->rcu, complete_domain_destroy); }
status_t BTimeSource::GetTime(bigtime_t *performance_time, bigtime_t *real_time, float *drift) { PRINT(8, "CALLED BTimeSource::GetTime()\n"); if (fIsRealtime) { *performance_time = *real_time = system_time(); *drift = 1.0f; return B_OK; } // if (fBuf == 0) { // PRINT(1, "BTimeSource::GetTime: fBuf == 0, name %s, id %ld\n",Name(),ID()); // *performance_time = *real_time = system_time(); // *drift = 1.0f; // return B_OK; // } int32 index; index = _atomic_read(&fBuf->readindex); index &= (TS_INDEX_COUNT - 1); *real_time = fBuf->realtime[index]; *performance_time = fBuf->perftime[index]; *drift = fBuf->drift[index]; // if (*real_time == 0) { // *performance_time = *real_time = system_time(); // *drift = 1.0f; // return B_OK; // } // printf("BTimeSource::GetTime timesource %ld, index %ld, perf %16Ld, real %16Ld, drift %2.2f\n", ID(), index, *performance_time, *real_time, *drift); TRACE_TIMESOURCE("BTimeSource::GetTime timesource %" B_PRId32 ", perf %16" B_PRId64 ", real %16" B_PRId64 ", drift %2.2f\n", ID(), *performance_time, *real_time, *drift); return B_OK; }