/* IBFDNSSDService enumerate (in long interfaceIndex, in PRBool domainType, in IBFDNSSDEnumerateListener listener); */ NS_IMETHODIMP CBFDNSSDService::Enumerate(PRInt32 interfaceIndex, PRBool domainType, IBFDNSSDEnumerateListener *listener, IBFDNSSDService **_retval) { CBFDNSSDService * service = NULL; DNSServiceErrorType dnsErr = 0; nsresult err = 0; *_retval = NULL; try { service = new CBFDNSSDService( listener ); } catch ( ... ) { service = NULL; } if ( service == NULL ) { err = NS_ERROR_FAILURE; goto exit; } service->m_enuDomainType = domainType; dnsErr = DNSServiceEnumerateDomains( &service->m_sdRef, domainType ? kDNSServiceFlagsBrowseDomains : kDNSServiceFlagsRegistrationDomains, interfaceIndex, ( DNSServiceDomainEnumReply ) EnumerateReply, service ); if ( dnsErr != kDNSServiceErr_NoError ) { err = NS_ERROR_FAILURE; goto exit; } if ( ( service->m_fileDesc = PR_ImportTCPSocket( DNSServiceRefSockFD( service->m_sdRef ) ) ) == NULL ) { err = NS_ERROR_FAILURE; goto exit; } if ( ( service->m_threadPool = PR_CreateThreadPool( 1, 1, 8192 ) ) == NULL ) { err = NS_ERROR_FAILURE; goto exit; } err = service->SetupNotifications(); if ( err != NS_OK) { goto exit; } listener->AddRef(); service->AddRef(); *_retval = service; err = NS_OK; exit: if ( err && service ) { delete service; service = NULL; } return err; }
int main(int argc, char **argv) { PRInt32 initial_threads = DEFAULT_INITIAL_THREADS; PRInt32 max_threads = DEFAULT_MAX_THREADS; PRInt32 stacksize = DEFAULT_STACKSIZE; PRThreadPool *tp = NULL; PRStatus rv; PRJob *jobp; /* * -d debug mode */ PLOptStatus os; PLOptState *opt; program_name = argv[0]; opt = PL_CreateOptState(argc, argv, "d"); while (PL_OPT_EOL != (os = PL_GetNextOpt(opt))) { if (PL_OPT_BAD == os) continue; switch (opt->option) { case 'd': /* debug mode */ _debug_on = 1; break; default: break; } } PL_DestroyOptState(opt); PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0); PR_STDIO_INIT(); PR_SetConcurrency(4); tp = PR_CreateThreadPool(initial_threads, max_threads, stacksize); if (NULL == tp) { printf("PR_CreateThreadPool failed\n"); failed_already=1; goto done; } jobp = PR_QueueJob(tp, TCP_Server, tp, PR_TRUE); rv = PR_JoinJob(jobp); PR_ASSERT(PR_SUCCESS == rv); DPRINTF(("%s: calling PR_JoinThreadPool\n", program_name)); rv = PR_JoinThreadPool(tp); PR_ASSERT(PR_SUCCESS == rv); DPRINTF(("%s: returning from PR_JoinThreadPool\n", program_name)); done: PR_Cleanup(); if (failed_already) return 1; else return 0; }
CDNSSDService::CDNSSDService() : m_master( 1 ), m_threadPool( NULL ), m_mainRef( NULL ), m_subRef( NULL ), m_listener( NULL ), m_fileDesc( NULL ), m_job( NULL ) { nsresult err; if ( DNSServiceCreateConnection( &m_mainRef ) != kDNSServiceErr_NoError ) { err = NS_ERROR_FAILURE; goto exit; } if ( ( m_fileDesc = PR_ImportTCPSocket( DNSServiceRefSockFD( m_mainRef ) ) ) == NULL ) { err = NS_ERROR_FAILURE; goto exit; } if ( ( m_threadPool = PR_CreateThreadPool( 1, 1, 8192 ) ) == NULL ) { err = NS_ERROR_FAILURE; goto exit; } err = SetupNotifications(); exit: if ( err != NS_OK ) { Cleanup(); } }