diff --git a/omvs_main.c b/omvs_main.c index 090d281..fe3fac1 100644 --- a/omvs_main.c +++ b/omvs_main.c @@ -41,12 +41,53 @@ typedef struct _OMVSScanner { } OMVSScanner; static gint _omvs_start_scan(OMVSScanner *scanner); +static gpointer _omvs_start_scan_job(gpointer data); + +static gpointer _omvs_start_scan_job(gpointer data) { + OMVSScanner *scanner; + gint i; + + scanner = (OMVSScanner *)data; + + for (i = 0; i < scanner->num_ipaddrs; i++) { + g_print("%p %08x\n", (void *)g_thread_self(), scanner->ipaddrs[i].addr); + } + + return NULL; +} static gint _omvs_start_scan(OMVSScanner *scanner) { gint i; - for (i = 0; i < scanner->num_ipaddrs; i++) { - g_print("%08x\n", scanner->ipaddrs[i].addr); + gint num_ipaddrs_for_each_thread; + OMVSScanner *scanners; + GThread **jobs; + + num_ipaddrs_for_each_thread = scanner->num_ipaddrs / _omvs_jobs; + if (num_ipaddrs_for_each_thread == 0) { + num_ipaddrs_for_each_thread = 1; + _omvs_jobs = scanner->num_ipaddrs; } + + scanners = g_malloc0(_omvs_jobs * sizeof(OMVSScanner)); + jobs = g_malloc0(_omvs_jobs * sizeof(GThread *)); + + for (i = 0; i < _omvs_jobs; i++) { + scanners[i].ipaddrs = &scanner->ipaddrs[i * num_ipaddrs_for_each_thread]; + scanners[i].num_ipaddrs = num_ipaddrs_for_each_thread; + } + scanners[_omvs_jobs - 1].num_ipaddrs += (scanner->num_ipaddrs % _omvs_jobs); + + for (i = 0; i < _omvs_jobs; i++) { + jobs[i] = g_thread_new(NULL, _omvs_start_scan_job, &scanners[i]); + } + + for (i = 0; i < _omvs_jobs; i++) { + g_thread_join(jobs[i]); + } + + g_free(jobs); + g_free(scanners); + return 0; }