void system_broadcast(int overrule, char *msg) { User *u; void (*say)(User *, char *, ...); char buf[PRINT_BUF]; struct tm *tm; log_info(msg); if (overrule) say = Print; else say = Tell; for(u = AllUsers; u != NULL; u = u->next) { tm = user_time(u, (time_t)0UL); if ((u->flags & USR_12HRCLOCK) && tm->tm_hour > 12) tm->tm_hour -= 12; bufprintf(buf, sizeof(buf), "\n<beep><white>*** <yellow>System message received at %d:%02d <white>***<red>\n" "%s\n", tm->tm_hour, tm->tm_min, msg); if (u->curr_room != NULL && (u->curr_room->flags & ROOM_CHATROOM) && !(u->runtime_flags & RTF_BUSY)) chatroom_tell_user(u, buf); else say(u, buf); } }
int main(int argc, char *argv[]) { // add more testcases here // rememeber to update the array size and fisrt loop times int n[4] = { 15, 100, 1000, 10000 }; int k[4] = { 3, 10, 20, 40 }; int test_time = 1000; //printf("Enter times for doing tests: "); //scanf("%d", &test_time); printf("********************** TEST START **********************\n"); printf("--------------------------------------------------------\n"); printf("n k Min. Max. Avg. Runtime\n"); printf("--------------------------------------------------------\n"); // update the array size and fisrt loop times after adding new testcases for (int i = 0; i < 4; i++) { int total = 0; int best = 1000000; int worst = 0; //printf("Test case for <%d, %d> pair:\n", n[i], k[i]); start_timer(); // loop 1000 times with doalg(n, k) for(int j = 0; j < test_time; j++) { //int* res = doalg(n[i], k[i]); //int comparision = COMPARE( -1, k, res ); int comparision = doalg(n[i], k[i]); //printf("The comparison # = %d\n", comparision); if (best > comparision) { best = comparision; } if (worst < comparision) { worst = comparision; } total += comparision; } printf("%6d %6d %6d %6d %.3f %.3f\n", n[i], k[i], best, worst, (double)total/test_time, elapsed_time()); //printf("The average case of element comparisons: %.3f\n", (double) total / test_time); //printf("The best case of element comparisons: %d\n", best); //printf("The worst case of element comparisons: %d\n\n", worst); } printf("--------------------------------------------------------\n"); printf("The total runtime for whole program is: %.3f\n", user_time()); printf("--------------------------------------------------------\n"); printf("*********************** TEST END ***********************\n"); }
double elapsed_time () #endif { if (timer_set == FALSE) { return (ERROR_VALUE); } else { return (user_time () - old_time); } }
/* Note: date_str should be large enough (MAX_LINE will do) */ char *print_date(User *usr, time_t tt, char *date_str, int buflen) { if (date_str == NULL || buflen <= 0) return NULL; return lc_system->print_date(lc_system, user_time(usr, tt), (usr == NULL) ? 0 : usr->flags & USR_12HRCLOCK, date_str, buflen); }
start_timer () #endif { timer_set = TRUE; old_time = user_time (); }
int ACE_TMAIN (int argc_in, ACE_TCHAR* argv_in[]) { RPG_TRACE (ACE_TEXT ("::main")); // *PROCESS PROFILE* ACE_Profile_Timer process_profile; // start profile timer... process_profile.start (); // step1: initialize // // *PORTABILITY*: on Windows, init ACE... //#if defined (ACE_WIN32) || defined (ACE_WIN64) // if (ACE::init () == -1) // { // ACE_DEBUG ((LM_ERROR, // ACE_TEXT ("failed to ACE::init(): \"%m\", aborting\n"))); // return EXIT_FAILURE; // } // end IF //#endif // step1 init/validate configuration // step1a: process commandline arguments std::string configuration_path = RPG_Common_File_Tools::getConfigurationDataDirectory (ACE_TEXT_ALWAYS_CHAR (BASEDIR), true); #if defined (DEBUG_DEBUGGER) configuration_path = Common_File_Tools::getWorkingDirectory (); #endif // #ifdef DEBUG_DEBUGGER std::string configuration_file = configuration_path; configuration_file += ACE_DIRECTORY_SEPARATOR_CHAR_A; #if defined (DEBUG_DEBUGGER) configuration_file += ACE_TEXT_ALWAYS_CHAR ("protocol"); configuration_file += ACE_DIRECTORY_SEPARATOR_CHAR_A; #endif configuration_file += ACE_TEXT_ALWAYS_CHAR (IRC_CLIENT_CNF_DEF_INI_FILE); bool debug_parser = false; bool log_to_file = false; bool trace_information = false; bool print_version_and_exit = false; unsigned int num_thread_pool_threads = IRC_CLIENT_DEF_NUM_TP_THREADS; if (!do_processArguments (argc_in, argv_in, configuration_file, debug_parser, log_to_file, trace_information, print_version_and_exit, num_thread_pool_threads)) { // make 'em learn... do_printUsage (ACE::basename (argv_in[0])); // // *PORTABILITY*: on Windows, fini ACE... //#if defined (ACE_WIN32) || defined (ACE_WIN64) // if (ACE::fini () == -1) // ACE_DEBUG ((LM_ERROR, // ACE_TEXT ("failed to ACE::fini(): \"%m\", continuing\n"))); //#endif return EXIT_FAILURE; } // end IF // validate argument(s) if (!Common_File_Tools::isReadable (configuration_file)) { // make 'em learn... do_printUsage (ACE::basename (argv_in[0])); // // *PORTABILITY*: on Windows, fini ACE... //#if defined (ACE_WIN32) || defined (ACE_WIN64) // if (ACE::fini () == -1) // ACE_DEBUG ((LM_ERROR, // ACE_TEXT ("failed to ACE::fini(): \"%m\", continuing\n"))); //#endif return EXIT_FAILURE; } // end IF // initialize logging and/or tracing std::string log_file; if (log_to_file) log_file = RPG_Common_File_Tools::getLogFilename (ACE::basename (argv_in[0])); if (!Common_Tools::initializeLogging (ACE::basename (argv_in[0]), // program name log_file, // logfile false, // log to syslog ? false, // trace messages ? trace_information, // debug messages ? NULL)) // logger { ACE_DEBUG ((LM_ERROR, ACE_TEXT ("failed to Common_Tools::initializeLogging(), aborting\n"))); // // *PORTABILITY*: on Windows, need to fini ACE... //#if defined (ACE_WIN32) || defined (ACE_WIN64) // if (ACE::fini () == -1) // ACE_DEBUG ((LM_ERROR, // ACE_TEXT ("failed to ACE::fini(): \"%m\", continuing\n"))); //#endif return EXIT_FAILURE; } // end IF // handle specific program modes if (print_version_and_exit) { do_printVersion (ACE::basename (argv_in[0])); Common_Tools::finalizeLogging (); // // *PORTABILITY*: on Windows, fini ACE... //#if defined (ACE_WIN32) || defined (ACE_WIN64) // if (ACE::fini () == -1) // ACE_DEBUG ((LM_ERROR, // ACE_TEXT ("failed to ACE::fini(): \"%m\", continuing\n"))); //#endif return EXIT_SUCCESS; } // end IF // initialize configuration object Stream_AllocatorHeap heap_allocator; RPG_Net_Protocol_MessageAllocator message_allocator (RPG_NET_MAXIMUM_NUMBER_OF_INFLIGHT_MESSAGES, &heap_allocator); RPG_Net_Protocol_Module_IRCHandler_Module IRC_handler_module (std::string ("IRCHandler"), NULL); RPG_Net_Protocol_Module_IRCHandler* IRC_handler_impl = NULL; IRC_handler_impl = dynamic_cast<RPG_Net_Protocol_Module_IRCHandler*>(IRC_handler_module.writer ()); if (!IRC_handler_impl) { ACE_DEBUG ((LM_ERROR, ACE_TEXT ("dynamic_cast<RPG_Net_Protocol_Module_IRCHandler> failed, aborting\n"))); Common_Tools::finalizeLogging (); // // *PORTABILITY*: on Windows, fini ACE... //#if defined (ACE_WIN32) || defined (ACE_WIN64) // if (ACE::fini () == -1) // ACE_DEBUG ((LM_ERROR, // ACE_TEXT ("failed to ACE::fini(): \"%m\", continuing\n"))); //#endif return EXIT_FAILURE; } // end IF if (!IRC_handler_impl->initialize (&message_allocator, RPG_NET_PROTOCOL_BUFFER_SIZE, true, // auto-answer "ping" as a client ?... true)) // clients print ('.') dots for received "pings"... { ACE_DEBUG ((LM_ERROR, ACE_TEXT ("failed to initialize module: \"%s\", aborting\n"), ACE_TEXT (IRC_handler_module.name ()))); Common_Tools::finalizeLogging (); // // *PORTABILITY*: on Windows, fini ACE... //#if defined (ACE_WIN32) || defined (ACE_WIN64) // if (ACE::fini () == -1) // ACE_DEBUG ((LM_ERROR, // ACE_TEXT ("failed to ACE::fini(): \"%m\", continuing\n"))); //#endif return EXIT_FAILURE; } // end IF RPG_Net_Protocol_Configuration configuration; // ************ socket configuration data ************ configuration.socketConfiguration.bufferSize = RPG_NET_DEFAULT_SOCKET_RECEIVE_BUFFER_SIZE; // ************ stream configuration data **************** configuration.streamConfiguration.messageAllocator = &message_allocator; configuration.streamConfiguration.bufferSize = RPG_NET_PROTOCOL_BUFFER_SIZE; configuration.streamConfiguration.module = &IRC_handler_module; configuration.streamConfiguration.statisticReportingInterval = 0; // == off // ************ protocol configuration data ************** configuration.protocolConfiguration.streamConfiguration.crunchMessageBuffers = RPG_NET_PROTOCOL_DEF_CRUNCH_MESSAGES; configuration.protocolConfiguration.streamConfiguration.debugScanner = debug_parser; configuration.protocolConfiguration.streamConfiguration.debugParser = debug_parser; configuration.protocolConfiguration.clientPingInterval = 0; // servers only configuration.protocolConfiguration.loginOptions.nick = IRC_CLIENT_DEF_IRC_NICK; std::string hostname; Net_Common_Tools::retrieveLocalHostname (hostname); if (IRC_CLIENT_CNF_IRC_USERMSG_TRADITIONAL) { configuration.protocolConfiguration.loginOptions.user.hostname.discriminator = RPG_Net_Protocol_IRCLoginOptions::User::Hostname::STRING; configuration.protocolConfiguration.loginOptions.user.hostname.string = &hostname; } // end IF else { configuration.protocolConfiguration.loginOptions.user.hostname.discriminator = RPG_Net_Protocol_IRCLoginOptions::User::Hostname::BITMASK; // *NOTE*: hybrid-7.2.3 seems to have a bug: 4 --> +i configuration.protocolConfiguration.loginOptions.user.hostname.mode = IRC_CLIENT_DEF_IRC_USERMODE; } // end ELSE configuration.protocolConfiguration.loginOptions.user.servername = ACE_TEXT_ALWAYS_CHAR (RPG_NET_PROTOCOL_DEF_IRC_SERVERNAME); configuration.protocolConfiguration.loginOptions.channel = ACE_TEXT_ALWAYS_CHAR (IRC_CLIENT_DEF_IRC_CHANNEL); // populate user/realname Common_Tools::getCurrentUserName (configuration.protocolConfiguration.loginOptions.user.username, configuration.protocolConfiguration.loginOptions.user.realname); // step1db: parse config file (if any) std::string serverHostname = ACE_TEXT_ALWAYS_CHAR(IRC_CLIENT_DEF_SERVER_HOSTNAME); unsigned short serverPortNumber = IRC_CLIENT_DEF_SERVER_PORT; if (!configuration_file.empty ()) do_parseConfigurationFile (configuration_file, configuration.protocolConfiguration.loginOptions, serverHostname, serverPortNumber); ACE_High_Res_Timer timer; timer.start(); // step2: do actual work do_work (configuration, serverHostname, serverPortNumber, num_thread_pool_threads); // clean up IRC_handler_module.close (); timer.stop (); // debug info std::string working_time_string; ACE_Time_Value working_time; timer.elapsed_time (working_time); Common_Tools::period2String (working_time, working_time_string); ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("total working time (h:m:s.us): \"%s\"...\n"), ACE_TEXT (working_time_string.c_str ()))); // stop profile timer... process_profile.stop (); // only process profile left to do... ACE_Profile_Timer::ACE_Elapsed_Time elapsed_time; elapsed_time.real_time = 0.0; elapsed_time.user_time = 0.0; elapsed_time.system_time = 0.0; if (process_profile.elapsed_time (elapsed_time) == -1) { ACE_DEBUG ((LM_ERROR, ACE_TEXT ("failed to ACE_Profile_Timer::elapsed_time: \"%m\", aborting\n"))); Common_Tools::finalizeLogging (); // // *PORTABILITY*: on Windows, fini ACE... //#if defined (ACE_WIN32) || defined (ACE_WIN64) // if (ACE::fini () == -1) // ACE_DEBUG ((LM_ERROR, // ACE_TEXT ("failed to ACE::fini(): \"%m\", continuing\n"))); //#endif return EXIT_FAILURE; } // end IF ACE_Profile_Timer::Rusage elapsed_rusage; ACE_OS::memset (&elapsed_rusage, 0, sizeof (ACE_Profile_Timer::Rusage)); process_profile.elapsed_rusage(elapsed_rusage); ACE_Time_Value user_time(elapsed_rusage.ru_utime); ACE_Time_Value system_time(elapsed_rusage.ru_stime); std::string user_time_string; std::string system_time_string; Common_Tools::period2String (user_time, user_time_string); Common_Tools::period2String (system_time, system_time_string); // debug info #if !defined (ACE_WIN32) && !defined (ACE_WIN64) ACE_DEBUG((LM_DEBUG, ACE_TEXT(" --> Process Profile <--\nreal time = %A seconds\nuser time = %A seconds\nsystem time = %A seconds\n --> Resource Usage <--\nuser time used: %s\nsystem time used: %s\nmaximum resident set size = %d\nintegral shared memory size = %d\nintegral unshared data size = %d\nintegral unshared stack size = %d\npage reclaims = %d\npage faults = %d\nswaps = %d\nblock input operations = %d\nblock output operations = %d\nmessages sent = %d\nmessages received = %d\nsignals received = %d\nvoluntary context switches = %d\ninvoluntary context switches = %d\n"), elapsed_time.real_time, elapsed_time.user_time, elapsed_time.system_time, user_time_string.c_str(), system_time_string.c_str(), elapsed_rusage.ru_maxrss, elapsed_rusage.ru_ixrss, elapsed_rusage.ru_idrss, elapsed_rusage.ru_isrss, elapsed_rusage.ru_minflt, elapsed_rusage.ru_majflt, elapsed_rusage.ru_nswap, elapsed_rusage.ru_inblock, elapsed_rusage.ru_oublock, elapsed_rusage.ru_msgsnd, elapsed_rusage.ru_msgrcv, elapsed_rusage.ru_nsignals, elapsed_rusage.ru_nvcsw, elapsed_rusage.ru_nivcsw)); #else ACE_DEBUG ((LM_DEBUG, ACE_TEXT (" --> Process Profile <--\nreal time = %A seconds\nuser time = %A seconds\nsystem time = %A seconds\n --> Resource Usage <--\nuser time used: %s\nsystem time used: %s\n"), elapsed_time.real_time, elapsed_time.user_time, elapsed_time.system_time, user_time_string.c_str (), system_time_string.c_str ())); #endif Common_Tools::finalizeLogging (); // // *PORTABILITY*: on Windows, fini ACE... //#if defined (ACE_WIN32) || defined (ACE_WIN64) // if (ACE::fini () == -1) // ACE_DEBUG ((LM_ERROR, // ACE_TEXT ("failed to ACE::fini(): \"%m\", continuing\n"))); //#endif return EXIT_SUCCESS; } // end main