static void createTransportAndClient( xmlrpc_env * const envP, const char * const transportName, const void * const transportparmsP, size_t const transportparmSize, int const flags, const char * const appname, const char * const appversion, xmlrpc_dialect const dialect, xmlrpc_client ** const clientPP) { const struct xmlrpc_client_transport_ops * transportOpsP; getTransportOps(envP, transportName, &transportOpsP); if (!envP->fault_occurred) { xmlrpc_client_transport * transportP; /* The following call is not thread-safe */ transportOpsP->create( envP, flags, appname, appversion, transportparmsP, transportparmSize, &transportP); if (!envP->fault_occurred) { bool const myTransportTrue = true; clientCreate(envP, myTransportTrue, transportOpsP, transportP, dialect, clientPP); if (envP->fault_occurred) transportOpsP->destroy(transportP); } } }
int main(int argc, char *argv[]) { // Arguments parser. ClientArguments arguments; if (clientArgumentsCreate(&arguments, argc, argv) == ERROR) { return ERROR; } Client client; if (clientCreate(&client) == ERROR) { return ERROR; } char *url = clientArgumentsURL(&arguments); short port = clientArgumentsPort(&arguments); if (clientConnect(&client, url, port) == ERROR) { return ERROR; } if (clientReceive(&client) == ERROR) { return ERROR; } clientArgumentsDestroy(&arguments); clientDestroy(&client); return ZERO; }
/** * FUNCTION NAME: stabilizationProtocol * * DESCRIPTION: This runs the stabilization protocol in case of Node joins and leaves * It ensures that there always 3 copies of all keys in the DHT at all times * The function does the following: * 1) Ensures that there are three "CORRECT" replicas of all the keys in spite of failures and joins * Note:- "CORRECT" replicas implies that every key is replicated in its two neighboring nodes in the ring */ void MP2Node::stabilizationProtocol() { /* * Implement this */ log->LOG(&memberNode->addr, "stabilizationProtocol"); for (auto it = ht->hashTable.begin(); it != ht->hashTable.end(); ++it) { clientCreate(it->first, it->second); } return; }
void xmlrpc_client_create(xmlrpc_env * const envP, int const flags, const char * const appname, const char * const appversion, const struct xmlrpc_clientparms * const clientparmsP, unsigned int const parmSize, xmlrpc_client ** const clientPP) { XMLRPC_ASSERT_ENV_OK(envP); XMLRPC_ASSERT_PTR_OK(clientPP); if (constSetupCount == 0) { xmlrpc_faultf(envP, "You have not called " "xmlrpc_client_setup_global_const()."); /* Impl note: We can't just call it now because it isn't thread-safe. */ } else { const char * transportName; struct xportParms transportparms; const struct xmlrpc_client_transport_ops * transportOpsP; xmlrpc_client_transport * transportP; xmlrpc_dialect dialect; xmlrpc_progress_fn * progressFn; getTransportInfo(envP, clientparmsP, parmSize, &transportName, &transportparms, &transportOpsP, &transportP); getDialectFromClientParms(clientparmsP, parmSize, &dialect); progressFn = parmSize >= XMLRPC_CPSIZE(progressFn) ? clientparmsP->progressFn : NULL; if (!envP->fault_occurred) { if (transportName) createTransportAndClient(envP, transportName, transportparms.parmsP, transportparms.size, flags, appname, appversion, dialect, progressFn, clientPP); else { bool myTransportFalse = false; clientCreate(envP, myTransportFalse, transportOpsP, transportP, dialect, progressFn, clientPP); } } } }