/* * DeadLockCheckRecurse -- recursively search for valid orderings * * curConstraints[] holds the current set of constraints being considered * by an outer level of recursion. Add to this each possible solution * constraint for any cycle detected at this level. * * Returns TRUE if no solution exists. Returns FALSE if a deadlock-free * state is attainable, in which case waitOrders[] shows the required * rearrangements of lock wait queues (if any). */ static bool DeadLockCheckRecurse(PGPROC *proc) { int nEdges; int oldPossibleConstraints; bool savedList; int i; nEdges = TestConfiguration(proc); if (nEdges < 0) return true; /* hard deadlock --- no solution */ if (nEdges == 0) return false; /* good configuration found */ if (nCurConstraints >= maxCurConstraints) return true; /* out of room for active constraints? */ oldPossibleConstraints = nPossibleConstraints; if (nPossibleConstraints + nEdges + MaxBackends <= maxPossibleConstraints) { /* We can save the edge list in possibleConstraints[] */ nPossibleConstraints += nEdges; savedList = true; } else { /* Not room; will need to regenerate the edges on-the-fly */ savedList = false; } /* * Try each available soft edge as an addition to the configuration. */ for (i = 0; i < nEdges; i++) { if (!savedList && i > 0) { /* Regenerate the list of possible added constraints */ if (nEdges != TestConfiguration(proc)) elog(FATAL, "inconsistent results during deadlock check"); } curConstraints[nCurConstraints] = possibleConstraints[oldPossibleConstraints + i]; nCurConstraints++; if (!DeadLockCheckRecurse(proc)) return false; /* found a valid solution! */ /* give up on that added constraint, try again */ nCurConstraints--; } nPossibleConstraints = oldPossibleConstraints; return true; /* no solution found */ }
int main(void) { PaError err = paNoError; WireConfig_t CONFIG; WireConfig_t *config = &CONFIG; int configIndex = 0;; err = Pa_Initialize(); if( err != paNoError ) goto error; printf("Please connect audio signal to input and listen for it on output!\n"); printf("input format = %lu\n", INPUT_FORMAT ); printf("output format = %lu\n", OUTPUT_FORMAT ); printf("input device ID = %d\n", INPUT_DEVICE ); printf("output device ID = %d\n", OUTPUT_DEVICE ); if( INPUT_FORMAT == OUTPUT_FORMAT ) { gInOutScaler = 1.0; } else if( (INPUT_FORMAT == paInt16) && (OUTPUT_FORMAT == paFloat32) ) { gInOutScaler = 1.0/32768.0; } else if( (INPUT_FORMAT == paFloat32) && (OUTPUT_FORMAT == paInt16) ) { gInOutScaler = 32768.0; } for( config->isInputInterleaved = 0; config->isInputInterleaved < 2; config->isInputInterleaved++ ) { for( config->isOutputInterleaved = 0; config->isOutputInterleaved < 2; config->isOutputInterleaved++ ) { for( config->numInputChannels = 1; config->numInputChannels < 3; config->numInputChannels++ ) { for( config->numOutputChannels = 1; config->numOutputChannels < 3; config->numOutputChannels++ ) { /* If framesPerCallback = 0, assertion fails in file pa_common/pa_process.c, line 1413: EX. */ for( config->framesPerCallback = 64; config->framesPerCallback < 129; config->framesPerCallback += 64 ) { printf("-----------------------------------------------\n" ); printf("Configuration #%d\n", configIndex++ ); err = TestConfiguration( config ); /* Give user a chance to bail out. */ if( err == 1 ) { err = paNoError; goto done; } else if( err != paNoError ) goto error; } } } } } done: Pa_Terminate(); printf("Full duplex sound test complete.\n"); fflush(stdout); printf("Hit ENTER to quit.\n"); fflush(stdout); getchar(); return 0; error: Pa_Terminate(); fprintf( stderr, "An error occured while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); printf("Hit ENTER to quit.\n"); fflush(stdout); getchar(); return -1; }