int32_t rte_service_run_iter_on_app_lcore(uint32_t id, uint32_t serialize_mt_unsafe) { /* run service on calling core, using all-ones as the service mask */ if (!service_valid(id)) return -EINVAL; struct core_state *cs = &lcore_states[rte_lcore_id()]; struct rte_service_spec_impl *s = &rte_services[id]; /* Atomically add this core to the mapped cores first, then examine if * we can run the service. This avoids a race condition between * checking the value, and atomically adding to the mapped count. */ if (serialize_mt_unsafe) rte_atomic32_inc(&s->num_mapped_cores); if (service_mt_safe(s) == 0 && rte_atomic32_read(&s->num_mapped_cores) > 1) { if (serialize_mt_unsafe) rte_atomic32_dec(&s->num_mapped_cores); return -EBUSY; } int ret = service_run(id, cs, UINT64_MAX); if (serialize_mt_unsafe) rte_atomic32_dec(&s->num_mapped_cores); return ret; }
int main(int argc, char **argv) { const char *command; if (argv[1] == NULL) { srv_print_services(); return 0; } command = argv[1]; printf("Starting service: %s\n", command); return service_run(command, &argv[1]); }
VOID WINAPI service_main(DWORD argc, LPSTR *argv) { DWORD err = 0; if (!(sshStatusHandle = RegisterServiceCtrlHandler(SVCNAME, service_ctrl))) return; ssStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; ssStatus.dwServiceSpecificExitCode = 0; if (send_status(SERVICE_START_PENDING, NO_ERROR, 1000, 1020)) err = service_run(); send_status(SERVICE_STOPPED, err, 0, err ? 1030 : 30); } /* service_main */
static int32_t rte_service_runner_func(void *arg) { RTE_SET_USED(arg); uint32_t i; const int lcore = rte_lcore_id(); struct core_state *cs = &lcore_states[lcore]; while (lcore_states[lcore].runstate == RUNSTATE_RUNNING) { const uint64_t service_mask = cs->service_mask; for (i = 0; i < RTE_SERVICE_NUM_MAX; i++) { /* return value ignored as no change to code flow */ service_run(i, cs, service_mask); } rte_smp_rmb(); } lcore_config[lcore].state = WAIT; return 0; }
int main(int argc, char **argv) { int i; int help = 0; int version = 0; int check_config = 0; int install = 0; int uninstall = 0; int console = 0; int log_to_file = 0; int debug = 0; int rc; for (i = 1; i < argc; ++i) { if (strcmp(argv[i], "--help") == 0) { help = 1; } else if (strcmp(argv[i], "--version") == 0) { version = 1; } else if (strcmp(argv[i], "--check-config") == 0) { check_config = 1; } else if (strcmp(argv[i], "--install") == 0) { install = 1; } else if (strcmp(argv[i], "--uninstall") == 0) { uninstall = 1; } else if (strcmp(argv[i], "--console") == 0) { console = 1; } else if (strcmp(argv[i], "--log-to-file") == 0) { log_to_file = 1; } else if (strcmp(argv[i], "--debug") == 0) { debug = 1; } else { fprintf(stderr, "Unknown option '%s'\n\n", argv[i]); print_usage(); return EXIT_FAILURE; } } if (help) { print_usage(); return EXIT_SUCCESS; } if (version) { printf("%s\n", VERSION_STRING); return EXIT_SUCCESS; } if (GetModuleFileName(NULL, _config_filename, sizeof(_config_filename)) == 0) { rc = ERRNO_WINAPI_OFFSET + GetLastError(); fprintf(stderr, "Could not get module file name: %s (%d)\n", get_errno_name(rc), rc); return EXIT_FAILURE; } i = strlen(_config_filename); if (i < 4) { fprintf(stderr, "Module file name '%s' is too short", _config_filename); return EXIT_FAILURE; } strcpy(_config_filename + i - 3, "ini"); if (check_config) { return config_check(_config_filename) < 0 ? EXIT_FAILURE : EXIT_SUCCESS; } if (install && uninstall) { fprintf(stderr, "Invalid option combination\n"); print_usage(); return EXIT_FAILURE; } if (install) { if (service_install(log_to_file, debug) < 0) { return EXIT_FAILURE; } } else if (uninstall) { if (service_uninstall() < 0) { return EXIT_FAILURE; } } else { printf("Starting...\n"); config_init(_config_filename); log_init(); if (console) { _run_as_service = 0; _pause_before_exit = started_by_explorer(); return generic_main(log_to_file, debug); } else { return service_run(log_to_file, debug); } } return EXIT_SUCCESS; }
int main(int argc, char **argv) { int i; bool help = false; bool version = false; bool check_config = false; bool install = false; bool uninstall = false; bool console = false; bool log_to_file = false; bool debug = false; bool libusb_debug = false; int rc; fixes_init(); for (i = 1; i < argc; ++i) { if (strcmp(argv[i], "--help") == 0) { help = true; } else if (strcmp(argv[i], "--version") == 0) { version = true; } else if (strcmp(argv[i], "--check-config") == 0) { check_config = true; } else if (strcmp(argv[i], "--install") == 0) { install = true; } else if (strcmp(argv[i], "--uninstall") == 0) { uninstall = true; } else if (strcmp(argv[i], "--console") == 0) { console = true; } else if (strcmp(argv[i], "--log-to-file") == 0) { log_to_file = true; } else if (strcmp(argv[i], "--debug") == 0) { debug = true; } else if (strcmp(argv[i], "--libusb-debug") == 0) { libusb_debug = true; } else { fprintf(stderr, "Unknown option '%s'\n\n", argv[i]); print_usage(); return EXIT_FAILURE; } } if (help) { print_usage(); return EXIT_SUCCESS; } if (version) { print_version(); return EXIT_SUCCESS; } if (GetModuleFileName(NULL, _config_filename, sizeof(_config_filename)) == 0) { rc = ERRNO_WINAPI_OFFSET + GetLastError(); fprintf(stderr, "Could not get module file name: %s (%d)\n", get_errno_name(rc), rc); return EXIT_FAILURE; } i = strlen(_config_filename); if (i < 4) { fprintf(stderr, "Module file name '%s' is too short", _config_filename); return EXIT_FAILURE; } _config_filename[i - 3] = '\0'; string_append(_config_filename, "ini", sizeof(_config_filename)); if (check_config) { rc = config_check(_config_filename); if (started_by_explorer(false)) { printf("\nPress any key to exit...\n"); getch(); } return rc < 0 ? EXIT_FAILURE : EXIT_SUCCESS; } if (install && uninstall) { fprintf(stderr, "Invalid option combination\n"); print_usage(); return EXIT_FAILURE; } if (install) { if (service_install(log_to_file, debug) < 0) { return EXIT_FAILURE; } } else if (uninstall) { if (service_uninstall() < 0) { return EXIT_FAILURE; } } else { printf("Starting...\n"); config_init(_config_filename); log_init(); if (console) { _run_as_service = false; _pause_before_exit = started_by_explorer(true); return generic_main(log_to_file, debug, libusb_debug); } else { return service_run(log_to_file, debug, libusb_debug); } } return EXIT_SUCCESS; }
int main(int argc, char *argv[]) { int *listensock = NULL; int listensock_count = 0; int listensock_index = 0; struct mqtt3_config config; char buf[1024]; int i, j; FILE *pid; int listener_max; int rc; char err[256]; #ifdef WIN32 SYSTEMTIME st; #else struct timeval tv; #endif #if defined(WIN32) || defined(__CYGWIN__) if(argc == 2){ if(!strcmp(argv[1], "run")){ service_run(); return 0; }else if(!strcmp(argv[1], "install")){ service_install(); return 0; }else if(!strcmp(argv[1], "uninstall")){ service_uninstall(); return 0; } } #endif #ifdef WIN32 GetSystemTime(&st); srand(st.wSecond + st.wMilliseconds); #else gettimeofday(&tv, NULL); srand(tv.tv_sec + tv.tv_usec); #endif memset(&int_db, 0, sizeof(struct mosquitto_db)); _mosquitto_net_init(); mqtt3_config_init(&config); rc = mqtt3_config_parse_args(&config, argc, argv); if(rc != MOSQ_ERR_SUCCESS) return rc; int_db.config = &config; if(config.daemon){ #ifndef WIN32 switch(fork()){ case 0: break; case -1: strerror_r(errno, err, 256); _mosquitto_log_printf(NULL, MOSQ_LOG_ERR, "Error in fork: %s", err); return 1; default: return MOSQ_ERR_SUCCESS; } #else _mosquitto_log_printf(NULL, MOSQ_LOG_WARNING, "Warning: Can't start in daemon mode in Windows."); #endif } if(config.daemon && config.pid_file){ pid = _mosquitto_fopen(config.pid_file, "wt"); if(pid){ fprintf(pid, "%d", getpid()); fclose(pid); }else{ _mosquitto_log_printf(NULL, MOSQ_LOG_ERR, "Error: Unable to write pid file."); return 1; } } rc = drop_privileges(&config); if(rc != MOSQ_ERR_SUCCESS) return rc; rc = mqtt3_db_open(&config, &int_db); if(rc != MOSQ_ERR_SUCCESS){ _mosquitto_log_printf(NULL, MOSQ_LOG_ERR, "Error: Couldn't open database."); return rc; } /* Initialise logging only after initialising the database in case we're * logging to topics */ mqtt3_log_init(config.log_type, config.log_dest); _mosquitto_log_printf(NULL, MOSQ_LOG_INFO, "mosquitto version %s (build date %s) starting", VERSION, TIMESTAMP); if(config.config_file){ _mosquitto_log_printf(NULL, MOSQ_LOG_INFO, "Config loaded from %s.", config.config_file); }else{ _mosquitto_log_printf(NULL, MOSQ_LOG_INFO, "Using default config."); } rc = mosquitto_security_module_init(&int_db); if(rc) return rc; rc = mosquitto_security_init(&int_db, false); if(rc) return rc; #ifdef WITH_SYS_TREE if(config.sys_interval > 0){ /* Set static $SYS messages */ snprintf(buf, 1024, "mosquitto version %s", VERSION); mqtt3_db_messages_easy_queue(&int_db, NULL, "$SYS/broker/version", 2, strlen(buf), buf, 1); snprintf(buf, 1024, "%s", TIMESTAMP); mqtt3_db_messages_easy_queue(&int_db, NULL, "$SYS/broker/timestamp", 2, strlen(buf), buf, 1); #ifdef CHANGESET snprintf(buf, 1024, "%s", CHANGESET); mqtt3_db_messages_easy_queue(&int_db, NULL, "$SYS/broker/changeset", 2, strlen(buf), buf, 1); #endif } #endif listener_max = -1; listensock_index = 0; for(i=0; i<config.listener_count; i++){ if(mqtt3_socket_listen(&config.listeners[i])){ _mosquitto_free(int_db.contexts); mqtt3_db_close(&int_db); if(config.pid_file){ remove(config.pid_file); } return 1; } listensock_count += config.listeners[i].sock_count; listensock = _mosquitto_realloc(listensock, sizeof(int)*listensock_count); if(!listensock){ _mosquitto_free(int_db.contexts); mqtt3_db_close(&int_db); if(config.pid_file){ remove(config.pid_file); } return 1; } for(j=0; j<config.listeners[i].sock_count; j++){ if(config.listeners[i].socks[j] == INVALID_SOCKET){ _mosquitto_free(int_db.contexts); mqtt3_db_close(&int_db); if(config.pid_file){ remove(config.pid_file); } return 1; } listensock[listensock_index] = config.listeners[i].socks[j]; if(listensock[listensock_index] > listener_max){ listener_max = listensock[listensock_index]; } listensock_index++; } } signal(SIGINT, handle_sigint); signal(SIGTERM, handle_sigint); #ifdef SIGHUP signal(SIGHUP, handle_sighup); #endif #ifndef WIN32 signal(SIGUSR1, handle_sigusr1); signal(SIGUSR2, handle_sigusr2); signal(SIGPIPE, SIG_IGN); #endif #ifdef WITH_BRIDGE for(i=0; i<config.bridge_count; i++){ if(mqtt3_bridge_new(&int_db, &(config.bridges[i]))){ _mosquitto_log_printf(NULL, MOSQ_LOG_WARNING, "Warning: Unable to connect to bridge %s.", config.bridges[i].name); } } #endif run = 1; rc = mosquitto_main_loop(&int_db, listensock, listensock_count, listener_max); _mosquitto_log_printf(NULL, MOSQ_LOG_INFO, "mosquitto version %s terminating", VERSION); mqtt3_log_close(); #ifdef WITH_PERSISTENCE if(config.persistence){ mqtt3_db_backup(&int_db, true, true); } #endif for(i=0; i<int_db.context_count; i++){ if(int_db.contexts[i]){ mqtt3_context_cleanup(&int_db, int_db.contexts[i], true); } } _mosquitto_free(int_db.contexts); int_db.contexts = NULL; mqtt3_db_close(&int_db); if(listensock){ for(i=0; i<listensock_count; i++){ if(listensock[i] != INVALID_SOCKET){ #ifndef WIN32 close(listensock[i]); #else closesocket(listensock[i]); #endif } } _mosquitto_free(listensock); } mosquitto_security_module_cleanup(&int_db); if(config.pid_file){ remove(config.pid_file); } _mosquitto_net_cleanup(); mqtt3_config_cleanup(int_db.config); return rc; }