From 23ec642313fd18c6e003c0ec63dc4570c8217c4c Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Tue, 16 Dec 2008 16:11:48 +0000 Subject: [PATCH 01/17] Wifi internal architecture diagram --- doc/WifiArchitecture.dia | Bin 0 -> 2639 bytes doc/WifiArchitecture.png | Bin 0 -> 51830 bytes src/devices/wifi/wifi.h | 3 +++ 3 files changed, 3 insertions(+) create mode 100644 doc/WifiArchitecture.dia create mode 100644 doc/WifiArchitecture.png diff --git a/doc/WifiArchitecture.dia b/doc/WifiArchitecture.dia new file mode 100644 index 0000000000000000000000000000000000000000..0377692401eb33f3800da19c9b099c30409f5fb7 GIT binary patch literal 2639 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 literal 0 HcmV?d00001 diff --git a/doc/WifiArchitecture.png b/doc/WifiArchitecture.png new file mode 100644 index 0000000000000000000000000000000000000000..9070a138268486566d45a4e79aa60c9bfb6ad678 GIT binary patch literal 51830 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�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 literal 0 HcmV?d00001 diff --git a/src/devices/wifi/wifi.h b/src/devices/wifi/wifi.h index 3ced79bf5..38df2a3a4 100644 --- a/src/devices/wifi/wifi.h +++ b/src/devices/wifi/wifi.h @@ -105,4 +105,7 @@ * Finally, we provide access to the per-remote-station SLRC couter that * indications the number of retransmissions of data. Changes to this * counter are traced using the ns3::WifiRemoteStation::m_slrc source. + * + * \subsection wifil2stack Layer 2 Stack Overview + * \image html WifiArchitecture.png "Overview of the Wifi L2 sublayers traversed for transmitting and receiving a packet" */ From 55930dc4fe54a6cbe315bc576640cdb46f5aa9ba Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" <gjc@inescporto.pt> Date: Fri, 23 Jan 2009 15:18:03 +0000 Subject: [PATCH 02/17] Add a dashed box around DcaTxop and MacRxMiddle in the wifi architecture figure; closes #447. --- doc/WifiArchitecture.dia | Bin 2639 -> 2716 bytes doc/WifiArchitecture.png | Bin 51830 -> 53934 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/WifiArchitecture.dia b/doc/WifiArchitecture.dia index 0377692401eb33f3800da19c9b099c30409f5fb7..71deb6830ebb0cb95f9bcad9d0e2abb422655530 100644 GIT binary patch literal 2716 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 W`3LqlOYq|L)&Bq$`-`9pod5vpiZ%TJ literal 2639 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 diff --git a/doc/WifiArchitecture.png b/doc/WifiArchitecture.png index 9070a138268486566d45a4e79aa60c9bfb6ad678..3bed78bcef23b17cf1010620aae9f84deb3ac492 100644 GIT binary patch delta 35004 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 X&FdL&cgeq#u4?Ke8;djM^EdqmxBH%z delta 32883 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 From b2c212c23975b1c67fcd1571b839ae0f6905ec38 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" <gjc@inescporto.pt> Date: Sat, 24 Jan 2009 12:25:52 +0000 Subject: [PATCH 03/17] Run regression tests as WAF tasks, plus simplify how unit tests are declared. Closes #480. --- regression.py | 306 +++++++++--------- regression/tests/test-csma-bridge.py | 18 +- regression/tests/test-csma-broadcast.py | 8 - regression/tests/test-csma-multicast.py | 9 - regression/tests/test-csma-one-subnet.py | 8 - regression/tests/test-csma-packet-socket.py | 9 - regression/tests/test-csma-ping.py | 8 - regression/tests/test-csma-raw-ip-socket.py | 8 - regression/tests/test-csma-star.py | 8 - .../tests/test-dynamic-global-routing.py | 8 - .../tests/test-global-routing-slash32.py | 8 - regression/tests/test-ns2-mob.py | 15 +- regression/tests/test-realtime-udp-echo.py | 8 - regression/tests/test-second.py | 8 - regression/tests/test-simple-error-model.py | 9 - .../tests/test-simple-global-routing.py | 9 - .../tests/test-simple-point-to-point-olsr.py | 9 - .../tests/test-static-routing-slash32.py | 8 - regression/tests/test-tcp-large-transfer.py | 9 - regression/tests/test-tcp-nsc-lfn.py | 41 +-- regression/tests/test-third.py | 8 - regression/tests/test-udp-echo.py | 8 - regression/tests/test-wifi-wired-bridging.py | 8 +- wscript | 21 +- 24 files changed, 204 insertions(+), 355 deletions(-) diff --git a/regression.py b/regression.py index 037c8d96e..273943f38 100644 --- a/regression.py +++ b/regression.py @@ -9,6 +9,7 @@ import urllib import Build import Options import Utils +import Task # local modules import wutils @@ -21,106 +22,6 @@ def dev_null(): return open("/dev/null", "w") -### Regression testing -class Regression(object): - def __init__(self, testdir, reference_traces): - self.testdir = testdir - self.reference_traces = reference_traces - self.env = Build.bld.env - - def run_test(self, verbose, generate, testName, arguments=[], pyscript=None, refTestName=None): - """ - @param verbose: enable verbose execution - - @param generate: generate new traces instead of comparing with the reference - - @param testName: name of the test - - @arguments: list of extra parameters to pass to the program to be tested - - @pyscript: if not None, the test is written in Python and this - parameter contains the path to the python script, relative to - the project root dir - - @param refTestName: if not None, this is the name of the directory under refDirName - that contains the reference traces. Otherwise "refDirname/testName + .ref" is used. - - """ - if not isinstance(arguments, list): - raise TypeError - - if refTestName is None: - refTestDirName = os.path.join(self.reference_traces, (testName + ".ref")) - else: - refTestDirName = os.path.join(self.reference_traces, refTestName) - - if not os.path.exists(self.reference_traces): - print"No reference trace repository" - return 1 - - if generate: - if not os.path.exists(refTestDirName): - print "creating new " + refTestDirName - os.mkdir(refTestDirName) - - if pyscript is None: - tmpl = "%s" - for arg in arguments: - tmpl = tmpl + " " + arg - wutils.run_program(testName, tmpl, cwd=refTestDirName) - else: - argv = [self.env['PYTHON'], os.path.join(Options.cwd_launch, *os.path.split(pyscript))] + arguments - wutils.run_argv(argv, cwd=refTestDirName) - print "Remember to commit " + refTestDirName - return 0 - else: - if not os.path.exists(refTestDirName): - print "Cannot locate reference traces in " + refTestDirName - return 1 - - if refTestName is None: - traceDirName = testName + ".ref" - else: - traceDirName = refTestName - traceDirName = os.path.join('regression', 'traces', traceDirName) - - try: - shutil.rmtree(traceDirName) - except OSError: - pass - os.mkdir(traceDirName) - - if pyscript is None: - wutils.run_program(testName, - command_template=wutils.get_command_template(*arguments), - cwd=traceDirName) - else: - argv = [self.env['PYTHON'], os.path.join('..', '..', '..', *os.path.split(pyscript))] + arguments - wutils.run_argv(argv, cwd=traceDirName) - - if verbose: - #diffCmd = "diff traces " + refTestDirName + " | head" - diffCmd = subprocess.Popen([self.env['DIFF'], traceDirName, refTestDirName], - stdout=subprocess.PIPE) - headCmd = subprocess.Popen("head", stdin=diffCmd.stdout) - rc2 = headCmd.wait() - diffCmd.stdout.close() - rc1 = diffCmd.wait() - rc = rc1 or rc2 - else: - rc = subprocess.Popen([self.env['DIFF'], traceDirName, refTestDirName], stdout=dev_null()).wait() - if rc: - print "----------" - print "Traces differ in test: test-" + testName - print "Reference traces in directory: regression/" + refTestDirName - print "Traces in directory: traces" - print "Rerun regression test as: " + \ - "\"./waf --regression --regression-tests=test-" + testName + "\"" - print "Then do \"diff -u regression/" + refTestDirName + " regression/" + traceDirName +\ - "\" for details" - print "----------" - return rc - def _find_tests(testdir): """Return a list of test modules in the test directory @@ -136,7 +37,161 @@ def _find_tests(testdir): tests.sort() return tests -def run_regression(reference_traces): + +class regression_test_task(Task.TaskBase): + after = 'cc cxx cc_link cxx_link' + color = 'BLUE' + + def __init__(self, env, test_name, test_scripts_dir, build_traces_dir, reference_traces): + super(regression_test_task, self).__init__() + self.env = env + self.test_name = test_name + self.test_scripts_dir = test_scripts_dir + self.build_traces_dir = build_traces_dir + self.reference_traces_dir = reference_traces + + def __str__(self): + return 'regression-test (%s)\n' % self.test_name + + def run(self): + """Run a single test""" + sys.path.insert(0, self.test_scripts_dir) + try: + mod = __import__(self.test_name, globals(), locals(), []) + finally: + sys.path.remove(self.test_scripts_dir) + + assert self.test_name.startswith('test-') + short_name = self.test_name[len('test-'):] + + trace_dir_name = getattr(mod, "trace_dir_name", None) + if trace_dir_name is None: + trace_dir_name = "%s.ref" % short_name + trace_output_path = os.path.join(self.build_traces_dir, trace_dir_name) + reference_traces_path = os.path.join(self.reference_traces_dir, trace_dir_name) + + if hasattr(mod, 'get_arguments'): + arguments = mod.get_arguments(self.env, '..') + else: + arguments = getattr(mod, "arguments", []) + + pyscript = getattr(mod, "pyscript", None) + if pyscript: + is_pyscript = True + program = pyscript + else: + is_pyscript = False + program = getattr(mod, "program", short_name) + + if hasattr(mod, 'may_run'): + reason_cannot_run = mod.may_run(self.env) + else: + reason_cannot_run = None + if reason_cannot_run: + print "SKIP %s (%s)" % (self.test_name, reason_cannot_run) + self.result = None + return 0 + + if Options.options.regression_generate: + # clean the target dir + shutil.rmtree(reference_traces_path, ignore_errors=True) + os.makedirs(reference_traces_path) + result = self.run_reference_generate(reference_traces_path, program, arguments, is_pyscript) + if result == 0: + print "GENERATE " + self.test_name + else: + print "GENERATE FAIL " + self.test_name + else: + # clean the target dir + shutil.rmtree(trace_output_path, ignore_errors=True) + os.makedirs(trace_output_path) + # run it + result = self.run_reference_test(reference_traces_path, trace_output_path, program, arguments, is_pyscript) + if result == 0: + print "PASS " + self.test_name + else: + print "FAIL " + self.test_name + self.result = result + return 0 + + def run_reference_test(self, reference_traces_path, trace_output_path, program, arguments, is_pyscript): + if not os.path.exists(reference_traces_path): + print "Cannot locate reference traces in " + reference_traces_path + return 1 + + if is_pyscript: + script = os.path.abspath(os.path.join('..', *os.path.split(program))) + argv = [self.env['PYTHON'], script] + arguments + wutils.run_argv(argv, cwd=trace_output_path) + else: + wutils.run_program(program, + command_template=wutils.get_command_template(*arguments), + cwd=trace_output_path) + + if Options.options.verbose: + #diffCmd = "diff traces " + refTestDirName + " | head" + diffCmd = subprocess.Popen([self.env['DIFF'], trace_output_path, reference_traces_path], + stdout=subprocess.PIPE) + headCmd = subprocess.Popen("head", stdin=diffCmd.stdout) + rc2 = headCmd.wait() + diffCmd.stdout.close() + rc1 = diffCmd.wait() + rc = rc1 or rc2 + else: + rc = subprocess.Popen([self.env['DIFF'], trace_output_path, reference_traces_path], stdout=dev_null()).wait() + if rc: + print "----------" + print "Traces differ in test: ", self.test_name + print "Reference traces in directory: " + reference_traces_path + print "Traces in directory: " + trace_output_path + print "Run the following command for details:" + print "\tdiff -u %s %s" % (reference_traces_path, trace_output_path) + print "----------" + return rc + + + def run_reference_generate(self, trace_output_path, program, arguments, is_pyscript): + if is_pyscript: + script = os.path.abspath(os.path.join('..', *os.path.split(program))) + argv = [self.env['PYTHON'], script] + arguments + retval = wutils.run_argv(argv, cwd=trace_output_path) + else: + retval = wutils.run_program(program, + command_template=wutils.get_command_template(*arguments), + cwd=trace_output_path) + return retval + + +class regression_test_collector_task(Task.TaskBase): + after = 'regression_test_task' + color = 'BLUE' + + def __init__(self, test_tasks): + super(regression_test_collector_task, self).__init__() + self.test_tasks = test_tasks + + def __str__(self): + return 'regression-test-collector\n' + + def run(self): + failed_tests = [test for test in self.test_tasks if test.result is not None and test.result != 0] + skipped_tests = [test for test in self.test_tasks if test.result is None] + print "Regression testing summary:" + if skipped_tests: + print "SKIP: %i of %i tests have been skipped (%s)" % ( + len(skipped_tests), len(self.test_tasks), + ', '.join([test.test_name for test in skipped_tests])) + if failed_tests: + print "FAIL: %i of %i tests have failed (%s)" % ( + len(failed_tests), len(self.test_tasks), + ', '.join([test.test_name for test in failed_tests])) + return 1 + else: + print "PASS: %i of %i tests passed" % (len(self.test_tasks) - len(skipped_tests), + len(self.test_tasks)) + return 0 + +def run_regression(bld, reference_traces): """Execute regression tests. Called with cwd set to the 'regression' subdir of ns-3. @param reference_traces: reference traces directory. @@ -148,57 +203,18 @@ def run_regression(reference_traces): print "Tests directory does not exist" sys.exit(3) - sys.path.append(testdir) - sys.modules['tracediff'] = Regression(testdir, reference_traces) - if Options.options.regression_tests: tests = Options.options.regression_tests.split(',') else: tests = _find_tests(testdir) - print "========== Running Regression Tests ==========" - env = Build.bld.env - if not os.path.exists(reference_traces): print "Reference traces directory (%s) does not exist" % reference_traces return 3 - bad = [] - + test_scripts_dir = bld.path.find_dir('regression/tests').abspath() + build_traces_dir = bld.path.find_or_declare('regression/traces').abspath(bld.env) + tasks = [] for test in tests: - try: - result = _run_regression_test(test) - if result == 0: - if Options.options.regression_generate: - print "GENERATE " + test - else: - print "PASS " + test - else: - bad.append(test) - print "FAIL " + test - except NotImplementedError: - print "SKIP " + test - - return (len(bad) > 0) - - -def _run_regression_test(test): - """Run a single test. - - Arguments: - test -- the name of the test - """ - traces_dir = os.path.join("regression", "traces") - if os.path.exists(traces_dir): - files = os.listdir(traces_dir) - for file in files: - if file == '.' or file == '..': - continue - shutil.rmtree(os.path.join("traces", file), ignore_errors=True) - else: - os.mkdir(traces_dir) - - mod = __import__(test, globals(), locals(), []) - return mod.run(verbose=(Options.options.verbose > 0), - generate=Options.options.regression_generate) - + tasks.append(regression_test_task(bld.env, test, test_scripts_dir, build_traces_dir, reference_traces)) + regression_test_collector_task(tasks) diff --git a/regression/tests/test-csma-bridge.py b/regression/tests/test-csma-bridge.py index 67a1b4475..e0905d33e 100644 --- a/regression/tests/test-csma-bridge.py +++ b/regression/tests/test-csma-bridge.py @@ -2,15 +2,13 @@ """Generic trace-comparison-type regression test.""" -import os -import sys -import tracediff +import os.path -def run(verbose, generate): - """Execute a test.""" - if tracediff.env['ENABLE_PYTHON_BINDINGS']: - return tracediff.run_test(verbose, generate, - "csma-bridge", pyscript=os.path.join('examples', 'csma-bridge.py')) +def may_run(env): + """Returns 0 when it can run, return non-zero or string (reason) when it cannot run""" + if env['ENABLE_PYTHON_BINDINGS']: + return 0 else: - print >> sys.stderr, "Skipping csma-bridge: Python bindings not available." - raise NotImplementedError + return "Python bindings not available." + +pyscript = os.path.join('examples', 'csma-bridge.py') diff --git a/regression/tests/test-csma-broadcast.py b/regression/tests/test-csma-broadcast.py index b34d136dc..4c77bc125 100644 --- a/regression/tests/test-csma-broadcast.py +++ b/regression/tests/test-csma-broadcast.py @@ -2,11 +2,3 @@ """Generic trace-comparison-type regression test.""" -import os -import shutil -import tracediff - -def run(verbose, generate): - """Execute a test.""" - - return tracediff.run_test(verbose, generate, "csma-broadcast") diff --git a/regression/tests/test-csma-multicast.py b/regression/tests/test-csma-multicast.py index c128f273b..b8afea9f8 100644 --- a/regression/tests/test-csma-multicast.py +++ b/regression/tests/test-csma-multicast.py @@ -1,12 +1,3 @@ #! /usr/bin/env python """Generic trace-comparison-type regression test.""" - -import os -import shutil -import tracediff - -def run(verbose, generate): - """Execute a test.""" - - return tracediff.run_test(verbose, generate, "csma-multicast") diff --git a/regression/tests/test-csma-one-subnet.py b/regression/tests/test-csma-one-subnet.py index b5d4645fc..4c77bc125 100644 --- a/regression/tests/test-csma-one-subnet.py +++ b/regression/tests/test-csma-one-subnet.py @@ -2,11 +2,3 @@ """Generic trace-comparison-type regression test.""" -import os -import shutil -import tracediff - -def run(verbose, generate): - """Execute a test.""" - - return tracediff.run_test(verbose, generate, "csma-one-subnet") diff --git a/regression/tests/test-csma-packet-socket.py b/regression/tests/test-csma-packet-socket.py index ca71d7b9d..4c77bc125 100644 --- a/regression/tests/test-csma-packet-socket.py +++ b/regression/tests/test-csma-packet-socket.py @@ -2,12 +2,3 @@ """Generic trace-comparison-type regression test.""" -import os -import shutil -import tracediff - -def run(verbose, generate): - """Execute a test.""" - - return tracediff.run_test(verbose, generate, - "csma-packet-socket") diff --git a/regression/tests/test-csma-ping.py b/regression/tests/test-csma-ping.py index 4cae6945f..4c77bc125 100644 --- a/regression/tests/test-csma-ping.py +++ b/regression/tests/test-csma-ping.py @@ -2,11 +2,3 @@ """Generic trace-comparison-type regression test.""" -import os -import shutil -import tracediff - -def run(verbose, generate): - """Execute a test.""" - - return tracediff.run_test(verbose, generate, "csma-ping") diff --git a/regression/tests/test-csma-raw-ip-socket.py b/regression/tests/test-csma-raw-ip-socket.py index 3c45b023d..4c77bc125 100644 --- a/regression/tests/test-csma-raw-ip-socket.py +++ b/regression/tests/test-csma-raw-ip-socket.py @@ -2,11 +2,3 @@ """Generic trace-comparison-type regression test.""" -import os -import shutil -import tracediff - -def run(verbose, generate): - """Execute a test.""" - - return tracediff.run_test(verbose, generate, "csma-raw-ip-socket") diff --git a/regression/tests/test-csma-star.py b/regression/tests/test-csma-star.py index 4e39f0443..4c77bc125 100644 --- a/regression/tests/test-csma-star.py +++ b/regression/tests/test-csma-star.py @@ -2,11 +2,3 @@ """Generic trace-comparison-type regression test.""" -import os -import shutil -import tracediff - -def run(verbose, generate): - """Execute a test.""" - - return tracediff.run_test(verbose, generate, "csma-star") diff --git a/regression/tests/test-dynamic-global-routing.py b/regression/tests/test-dynamic-global-routing.py index 9a7ff13a3..4c77bc125 100644 --- a/regression/tests/test-dynamic-global-routing.py +++ b/regression/tests/test-dynamic-global-routing.py @@ -2,11 +2,3 @@ """Generic trace-comparison-type regression test.""" -import os -import shutil -import tracediff - -def run(verbose, generate): - """Execute a test.""" - - return tracediff.run_test(verbose, generate, "dynamic-global-routing") diff --git a/regression/tests/test-global-routing-slash32.py b/regression/tests/test-global-routing-slash32.py index bf613b6e1..4c77bc125 100644 --- a/regression/tests/test-global-routing-slash32.py +++ b/regression/tests/test-global-routing-slash32.py @@ -2,11 +2,3 @@ """Generic trace-comparison-type regression test.""" -import os -import shutil -import tracediff - -def run(verbose, generate): - """Execute a test.""" - - return tracediff.run_test(verbose, generate, "global-routing-slash32") diff --git a/regression/tests/test-ns2-mob.py b/regression/tests/test-ns2-mob.py index 6f5503590..7ed54ce01 100644 --- a/regression/tests/test-ns2-mob.py +++ b/regression/tests/test-ns2-mob.py @@ -2,11 +2,12 @@ """Generic trace-comparison-type regression test.""" -import os -import shutil -import tracediff +import os.path -def run(verbose, generate): - """Execute a test.""" - arguments = ["../../../samples/ns2-mob.tr", "out.tr"] - return tracediff.run_test(verbose, generate, "main-ns2-mob", arguments=arguments) +program = "main-ns2-mob" + +def get_arguments(env, top_dir): + ns2_tracefile = os.path.abspath(os.path.join(top_dir, "samples", "ns2-mob.tr")) + return [ns2_tracefile, "out.tr"] + +trace_dir_name = "main-ns2-mob.ref" diff --git a/regression/tests/test-realtime-udp-echo.py b/regression/tests/test-realtime-udp-echo.py index b1344cdad..4c77bc125 100644 --- a/regression/tests/test-realtime-udp-echo.py +++ b/regression/tests/test-realtime-udp-echo.py @@ -2,11 +2,3 @@ """Generic trace-comparison-type regression test.""" -import os -import shutil -import tracediff - -def run(verbose, generate): - """Execute a test.""" - - return tracediff.run_test(verbose, generate, "realtime-udp-echo") diff --git a/regression/tests/test-second.py b/regression/tests/test-second.py index 56dd9b5e5..4c77bc125 100644 --- a/regression/tests/test-second.py +++ b/regression/tests/test-second.py @@ -2,11 +2,3 @@ """Generic trace-comparison-type regression test.""" -import os -import shutil -import tracediff - -def run(verbose, generate): - """Execute a test.""" - - return tracediff.run_test(verbose, generate, "second") diff --git a/regression/tests/test-simple-error-model.py b/regression/tests/test-simple-error-model.py index 6a9dece25..4c77bc125 100644 --- a/regression/tests/test-simple-error-model.py +++ b/regression/tests/test-simple-error-model.py @@ -2,12 +2,3 @@ """Generic trace-comparison-type regression test.""" -import os -import shutil -import tracediff - -def run(verbose, generate): - """Execute a test.""" - - return tracediff.run_test(verbose, generate, - "simple-error-model") diff --git a/regression/tests/test-simple-global-routing.py b/regression/tests/test-simple-global-routing.py index 271fb8f85..4c77bc125 100644 --- a/regression/tests/test-simple-global-routing.py +++ b/regression/tests/test-simple-global-routing.py @@ -2,12 +2,3 @@ """Generic trace-comparison-type regression test.""" -import os -import shutil -import tracediff - -def run(verbose, generate): - """Execute a test.""" - - return tracediff.run_test(verbose, generate, - "simple-global-routing") diff --git a/regression/tests/test-simple-point-to-point-olsr.py b/regression/tests/test-simple-point-to-point-olsr.py index b581b876f..4c77bc125 100644 --- a/regression/tests/test-simple-point-to-point-olsr.py +++ b/regression/tests/test-simple-point-to-point-olsr.py @@ -2,12 +2,3 @@ """Generic trace-comparison-type regression test.""" -import os -import shutil -import tracediff - -def run(verbose, generate): - """Execute a test.""" - - return tracediff.run_test(verbose, generate, - "simple-point-to-point-olsr") diff --git a/regression/tests/test-static-routing-slash32.py b/regression/tests/test-static-routing-slash32.py index 6ac8550cc..4c77bc125 100644 --- a/regression/tests/test-static-routing-slash32.py +++ b/regression/tests/test-static-routing-slash32.py @@ -2,11 +2,3 @@ """Generic trace-comparison-type regression test.""" -import os -import shutil -import tracediff - -def run(verbose, generate): - """Execute a test.""" - - return tracediff.run_test(verbose, generate, "static-routing-slash32") diff --git a/regression/tests/test-tcp-large-transfer.py b/regression/tests/test-tcp-large-transfer.py index 3078fa69d..4c77bc125 100644 --- a/regression/tests/test-tcp-large-transfer.py +++ b/regression/tests/test-tcp-large-transfer.py @@ -2,12 +2,3 @@ """Generic trace-comparison-type regression test.""" -import os -import shutil -import tracediff - -def run(verbose, generate): - """Execute a test.""" - - return tracediff.run_test(verbose, generate, - "tcp-large-transfer") diff --git a/regression/tests/test-tcp-nsc-lfn.py b/regression/tests/test-tcp-nsc-lfn.py index bff77dfd0..b58d4b227 100644 --- a/regression/tests/test-tcp-nsc-lfn.py +++ b/regression/tests/test-tcp-nsc-lfn.py @@ -2,32 +2,25 @@ """Trace-comparison-type regression test for the Network Simulation Cradle.""" -import os -import shutil -import sys -import tracediff import platform -def run(verbose, generate): - """Run a Network Simulation Cradle test involving two TCP streams.""" - - if not tracediff.env['ENABLE_NSC']: - print >>sys.stderr, "Skipping tcp-nsc-lfn: NSC not available." - raise NotImplementedError - - testName = "tcp-nsc-lfn" - arguments = ["--ns3::OnOffApplication::DataRate=40000", "--runtime=20"] - platform_bits = platform.architecture()[0] - - if platform_bits == "64bit": - traceDirName = testName + "_64bit.ref" - elif platform_bits == "32bit": - traceDirName = testName + "_32bit.ref" +def may_run(env): + if not env['NSC_ENABLED']: + return "NSC not available" else: - # Something unexpected. How should we signal an error here? Rasing a - # string might not be the best idea? - raise "Unknown architecture, not 64 or 32 bit?" + return 0 + + +platform_bits = platform.architecture()[0] +if platform_bits == "64bit": + trace_dir_name = "tcp-nsc-lfn_64bit.ref" +elif platform_bits == "32bit": + trace_dir_name = "tcp-nsc-lfn_32bit.ref" +else: + raise AssertionError("Unknown architecture, not 64 or 32 bit?") +del platform_bits + +arguments = ["--ns3::OnOffApplication::DataRate=40000", "--runtime=20"] + - return tracediff.run_test(verbose, generate, - testName, arguments=arguments, refTestName=traceDirName) diff --git a/regression/tests/test-third.py b/regression/tests/test-third.py index 582e8b44a..4c77bc125 100644 --- a/regression/tests/test-third.py +++ b/regression/tests/test-third.py @@ -2,11 +2,3 @@ """Generic trace-comparison-type regression test.""" -import os -import shutil -import tracediff - -def run(verbose, generate): - """Execute a test.""" - - return tracediff.run_test(verbose, generate, "third") diff --git a/regression/tests/test-udp-echo.py b/regression/tests/test-udp-echo.py index 6fe71055a..4c77bc125 100644 --- a/regression/tests/test-udp-echo.py +++ b/regression/tests/test-udp-echo.py @@ -2,11 +2,3 @@ """Generic trace-comparison-type regression test.""" -import os -import shutil -import tracediff - -def run(verbose, generate): - """Execute a test.""" - #print tracediff.env - return tracediff.run_test(verbose, generate, "udp-echo") diff --git a/regression/tests/test-wifi-wired-bridging.py b/regression/tests/test-wifi-wired-bridging.py index 9ff8ae0e5..263c2c892 100644 --- a/regression/tests/test-wifi-wired-bridging.py +++ b/regression/tests/test-wifi-wired-bridging.py @@ -2,11 +2,5 @@ """Compare that Wifi-Wired Bridging generates correct traces.""" -import os -import shutil -import tracediff +arguments = ["--SendIp=0"] -def run(verbose, generate): - """Execute a test.""" - - return tracediff.run_test(verbose, generate, "wifi-wired-bridging", ["--SendIp=0"]) diff --git a/wscript b/wscript index 6197d4304..9c659cf38 100644 --- a/wscript +++ b/wscript @@ -415,6 +415,15 @@ def build(bld): if not Options.options.compile_targets: Options.options.compile_targets = os.path.basename(program_name) + if Options.options.regression or Options.options.regression_generate: + if not env['DIFF']: + raise Utils.WafError("Cannot run regression tests: the 'diff' program is not installed.") + + regression_traces = env['REGRESSION_TRACES'] + if not regression_traces: + raise Utils.WafError("Cannot run regression tests: reference traces directory not given" + " (--with-regression-traces configure option)") + regression.run_regression(bld, regression_traces) def get_command_template(*arguments): @@ -435,18 +444,6 @@ def shutdown(): if Options.commands['check']: _run_waf_check() - if Options.options.regression or Options.options.regression_generate: - if not env['DIFF']: - raise Utils.WafError("Cannot run regression tests: the 'diff' program is not installed.") - - regression_traces = env['REGRESSION_TRACES'] - if not regression_traces: - raise Utils.WafError("Cannot run regression tests: reference traces directory not given" - " (--with-regression-traces configure option)") - retval = regression.run_regression(regression_traces) - if retval: - sys.exit(retval) - if Options.options.lcov_report: lcov_report() From 2e2fd95111bc49db221bd412054fe6e085069f86 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" <gjc@inescporto.pt> Date: Sat, 24 Jan 2009 12:52:58 +0000 Subject: [PATCH 04/17] Try to guess the location of the reference traces, when --with-regression-traces is not given (#478) --- wscript | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/wscript b/wscript index 9c659cf38..883f540b3 100644 --- a/wscript +++ b/wscript @@ -42,6 +42,14 @@ APPNAME = 'ns' wutils.VERSION = VERSION wutils.APPNAME = APPNAME +# +# The last part of the path name to use to find the regression traces. The +# path will be APPNAME + '-' + VERSION + REGRESSION_SUFFIX, e.g., +# ns-3-dev-ref-traces +# +REGRESSION_SUFFIX = "-ref-traces" + + # these variables are mandatory ('/' are converted automatically) srcdir = '.' blddir = 'build' @@ -193,8 +201,19 @@ def configure(conf): variant_env = conf.env.copy() variant_name = Options.options.build_profile + # Check for the location of regression reference traces if Options.options.regression_traces is not None: - variant_env['REGRESSION_TRACES'] = os.path.abspath(Options.options.regression_traces) + if os.path.isdir(Options.options.regression_traces): + conf.check_message("regression traces location", '', True, ("%s (given)" % Options.options.regression_traces)) + variant_env['REGRESSION_TRACES'] = os.path.abspath(Options.options.regression_traces) + else: + traces = os.path.join('..', "%s-%s%s" % (APPNAME, VERSION, REGRESSION_SUFFIX)) + if os.path.isdir(traces): + conf.check_message("regression reference traces", '', True, ("%s (guessed)" % traces)) + variant_env['REGRESSION_TRACES'] = os.path.abspath(traces) + del traces + if not variant_env['REGRESSION_TRACES']: + conf.check_message("regression reference traces", '', False) if Options.options.enable_gcov: variant_name += '-gcov' From 92b5bc73096ae647eac36fa40f14042b2c56ba5b Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" <gjc@inescporto.pt> Date: Sat, 24 Jan 2009 15:28:54 +0000 Subject: [PATCH 05/17] Try to guess pybindgen location (more #478) --- bindings/python/wscript | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/bindings/python/wscript b/bindings/python/wscript index 69825e2b6..403cbca07 100644 --- a/bindings/python/wscript +++ b/bindings/python/wscript @@ -70,12 +70,21 @@ def configure(conf): conf.report_optional_feature("python", "Python Bindings", False, str(ex)) return - ## Check for pybindgen + # Check for the location of pybindgen + if Options.options.with_pybindgen is not None: + if os.path.isdir(Options.options.with_pybindgen): + conf.check_message("pybindgen location", '', True, ("%s (given)" % Options.options.with_pybindgen)) + conf.env['WITH_PYBINDGEN'] = os.path.abspath(Options.options.with_pybindgen) + else: + pybindgen_dir = os.path.join('..', "pybindgen") + if os.path.isdir(pybindgen_dir): + conf.check_message("pybindgen location", '', True, ("%s (guessed)" % pybindgen_dir)) + conf.env['WITH_PYBINDGEN'] = os.path.abspath(pybindgen_dir) + del pybindgen_dir + if not conf.env['WITH_PYBINDGEN']: + conf.check_message("pybindgen location", '', False) - no_net = False - if Options.options.with_pybindgen: - conf.env['WITH_PYBINDGEN'] = os.path.abspath(Options.options.with_pybindgen) - no_net = True + # Check for pybindgen set_pybindgen_pythonpath(conf.env) @@ -100,10 +109,9 @@ def configure(conf): Logs.warn("pybindgen (found %s) is too old (need %s)" % (pybindgen_version_str, '.'.join([str(x) for x in REQUIRED_PYBINDGEN_VERSION]))) - if no_net or not fetch_pybindgen(conf): - conf.report_optional_feature("python", "Python Bindings", False, - "PyBindGen too old and newer version could not be retrieved") - return + conf.report_optional_feature("python", "Python Bindings", False, + "PyBindGen too old and newer version could not be retrieved") + return ## If all has gone well, we finally enable the Python bindings conf.env['ENABLE_PYTHON_BINDINGS'] = True From 5e8275ba013804b207a32d5fbf0a64add6bafa95 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" <gjc@inescporto.pt> Date: Sat, 24 Jan 2009 15:38:20 +0000 Subject: [PATCH 06/17] Try to guess NSC location (finally closes #478) --- src/internet-stack/wscript | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/internet-stack/wscript b/src/internet-stack/wscript index 9f2ef127f..b2989d18e 100644 --- a/src/internet-stack/wscript +++ b/src/internet-stack/wscript @@ -29,16 +29,22 @@ def configure(conf): # conf.check_tool('flex bison') # conf.check(lib='fl', mandatory=True) - if not Options.options.with_nsc: - conf.report_optional_feature("nsc", "Network Simulation Cradle", False, - "--with-nsc configure option not given") - return - - #check_nsc_buildutils() + # Check for the location of NSC if Options.options.with_nsc: - if not os.path.isdir(Options.options.with_nsc): - raise Utils.WafError("--with-nsc nsc path %r does not exist" % Options.options.with_nsc) - conf.env['WITH_NSC'] = Options.options.with_nsc + if os.path.isdir(Options.options.with_nsc): + conf.check_message("NSC location", '', True, ("%s (given)" % Options.options.with_nsc)) + conf.env['WITH_NSC'] = os.path.abspath(Options.options.with_nsc) + else: + nsc_dir = os.path.join('..', "nsc") + if os.path.isdir(nsc_dir): + conf.check_message("NSC location", '', True, ("%s (guessed)" % nsc_dir)) + conf.env['WITH_NSC'] = os.path.abspath(nsc_dir) + del nsc_dir + if not conf.env['WITH_NSC']: + conf.check_message("NSC location", '', False) + conf.report_optional_feature("nsc", "Network Simulation Cradle", False, + "NSC not found (see option --with-nsc)") + return arch = os.uname()[4] ok = False From 3cc5929ab6e8359d233db9b832d9abaf1375446f Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" <gjc@inescporto.pt> Date: Sat, 24 Jan 2009 15:51:09 +0000 Subject: [PATCH 07/17] (from Tom Henderson) make valgrind return an error exit code when problems are detected. Closes #449. --- wscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wscript b/wscript index 883f540b3..0f58a7e2f 100644 --- a/wscript +++ b/wscript @@ -449,7 +449,7 @@ def get_command_template(*arguments): if Options.options.valgrind: if Options.options.command_template: raise Utils.WafError("Options --command-template and --valgrind are conflicting") - cmd = "valgrind --leak-check=full %s" + cmd = "valgrind --leak-check=full --error-exitcode=1 %s" else: cmd = Options.options.command_template or '%s' for arg in arguments: From ca8a6c03df8effcaea2445c412b5ec83006d1ee2 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" <gjc@inescporto.pt> Date: Sat, 24 Jan 2009 18:09:29 +0000 Subject: [PATCH 08/17] Bug #323: waf --valgrind doesn't check for valgrind first --- regression.py | 4 ++-- wscript | 20 +++++--------------- wutils.py | 6 ++++-- 3 files changed, 11 insertions(+), 19 deletions(-) diff --git a/regression.py b/regression.py index 273943f38..d92683af1 100644 --- a/regression.py +++ b/regression.py @@ -125,7 +125,7 @@ class regression_test_task(Task.TaskBase): wutils.run_argv(argv, cwd=trace_output_path) else: wutils.run_program(program, - command_template=wutils.get_command_template(*arguments), + command_template=wutils.get_command_template(self.env, arguments), cwd=trace_output_path) if Options.options.verbose: @@ -157,7 +157,7 @@ class regression_test_task(Task.TaskBase): retval = wutils.run_argv(argv, cwd=trace_output_path) else: retval = wutils.run_program(program, - command_template=wutils.get_command_template(*arguments), + command_template=wutils.get_command_template(self.env, arguments), cwd=trace_output_path) return retval diff --git a/wscript b/wscript index 0f58a7e2f..2c372ef1b 100644 --- a/wscript +++ b/wscript @@ -261,6 +261,8 @@ def configure(conf): # we cannot pull regression traces without mercurial conf.find_program('hg', var='MERCURIAL') + conf.find_program('valgrind', var='VALGRIND') + # Write a summary of optional features status print "---- Summary of optional NS-3 features:" for (name, caption, was_enabled, reason_not_enabled) in conf.env['NS3_OPTIONAL_FEATURES']: @@ -426,7 +428,7 @@ def build(bld): if Options.options.run: # Check that the requested program name is valid - program_name, dummy_program_argv = wutils.get_run_program(Options.options.run, get_command_template()) + program_name, dummy_program_argv = wutils.get_run_program(Options.options.run, wutils.get_command_template(env)) # When --run'ing a program, tell WAF to only build that program, # nothing more; this greatly speeds up compilation when all you @@ -445,18 +447,6 @@ def build(bld): regression.run_regression(bld, regression_traces) -def get_command_template(*arguments): - if Options.options.valgrind: - if Options.options.command_template: - raise Utils.WafError("Options --command-template and --valgrind are conflicting") - cmd = "valgrind --leak-check=full --error-exitcode=1 %s" - else: - cmd = Options.options.command_template or '%s' - for arg in arguments: - cmd = cmd + " " + arg - return cmd - - def shutdown(): env = Build.bld.env @@ -467,7 +457,7 @@ def shutdown(): lcov_report() if Options.options.run: - wutils.run_program(Options.options.run, get_command_template()) + wutils.run_program(Options.options.run, wutils.get_command_template(env)) raise SystemExit(0) if Options.options.pyrun: @@ -492,7 +482,7 @@ def _run_waf_check(): out.close() print "-- Running NS-3 C++ core unit tests..." - wutils.run_program('run-tests', get_command_template()) + wutils.run_program('run-tests', wutils.get_command_template(env)) if env['ENABLE_PYTHON_BINDINGS']: print "-- Running NS-3 Python bindings unit tests..." diff --git a/wutils.py b/wutils.py index 9cebb2a5d..4e29cfd07 100644 --- a/wutils.py +++ b/wutils.py @@ -26,11 +26,13 @@ TRACEBALL_SUFFIX = ".tar.bz2" -def get_command_template(*arguments): +def get_command_template(env, arguments=()): if Options.options.valgrind: if Options.options.command_template: raise Utils.WafError("Options --command-template and --valgrind are conflicting") - cmd = "valgrind --leak-check=full %s" + if not env['VALGRIND']: + raise Utils.WafError("valgrind is not installed") + cmd = env['VALGRIND'] + " --leak-check=full --error-exitcode=1 %s" else: cmd = Options.options.command_template or '%s' for arg in arguments: From a88ba4fd5b7785efc773850803ebcbf19229c3f0 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" <gjc@inescporto.pt> Date: Sat, 24 Jan 2009 18:47:47 +0000 Subject: [PATCH 09/17] librt is need not for threading primitives but for the real time scheduler --- src/core/wscript | 3 --- src/simulator/wscript | 15 +++++++++++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/core/wscript b/src/core/wscript index 8d76057fe..879a4c997 100644 --- a/src/core/wscript +++ b/src/core/wscript @@ -9,8 +9,6 @@ def configure(conf): conf.check(header_name='signal.h', define_name='HAVE_SIGNAL_H') - conf.check(lib='rt', uselib='RT', define_name='HAVE_RT') - conf.env['ENABLE_THREADING'] = conf.check(header_name='pthread.h', define_name='HAVE_PTHREAD_H') conf.report_optional_feature("Threading", "Threading Primitives", @@ -54,7 +52,6 @@ def build(bld): 'config.cc', 'callback.cc', ] - core.uselib = 'RT' headers = bld.new_task_gen('ns3header') headers.module = 'core' diff --git a/src/simulator/wscript b/src/simulator/wscript index 1824bd486..e4ae5c0b8 100644 --- a/src/simulator/wscript +++ b/src/simulator/wscript @@ -33,9 +33,14 @@ def configure(conf): conf.write_config_header('ns3/simulator-config.h') - conf.report_optional_feature("RealTime", "Real Time Simulator", - conf.env['ENABLE_THREADING'], - "threading not enabled") + if not conf.check(lib='rt', uselib='RT', define_name='HAVE_RT'): + conf.report_optional_feature("RealTime", "Real Time Simulator", + False, "librt is not available") + else: + conf.report_optional_feature("RealTime", "Real Time Simulator", + conf.env['ENABLE_THREADING'], + "threading not enabled") + conf.env["ENABLE_REAL_TIME"] = conf.env['ENABLE_THREADING'] def build(bld): @@ -101,7 +106,7 @@ def build(bld): 'cairo-wideint-private.h', ]) - if env['ENABLE_THREADING']: + if env['ENABLE_REAL_TIME']: headers.source.extend([ 'realtime-simulator-impl.h', 'wall-clock-synchronizer.h', @@ -110,4 +115,6 @@ def build(bld): 'realtime-simulator-impl.cc', 'wall-clock-synchronizer.cc', ]) + sim.uselib = 'RT' + From d4f67a66db79e97df901af56bf97550cbe51b227 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" <gjc@inescporto.pt> Date: Sat, 24 Jan 2009 19:25:33 +0000 Subject: [PATCH 10/17] Detect pthread support by compiling a test program with the -pthread switch, not just check for the header file. --- src/core/wscript | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/core/wscript b/src/core/wscript index 879a4c997..b12cb9311 100644 --- a/src/core/wscript +++ b/src/core/wscript @@ -9,7 +9,30 @@ def configure(conf): conf.check(header_name='signal.h', define_name='HAVE_SIGNAL_H') - conf.env['ENABLE_THREADING'] = conf.check(header_name='pthread.h', define_name='HAVE_PTHREAD_H') + # Check for POSIX threads + test_env = conf.env.copy() + test_env.append_value('LINKFLAGS', '-pthread') + test_env.append_value('CXXFLAGS', '-pthread') + test_env.append_value('CCFLAGS', '-pthread') + fragment = """ +#include <pthread.h> +int main () +{ + pthread_mutex_t m; + pthread_mutex_init (&m, NULL); + return 0; +} + """ + have_pthread = conf.check(header_name='pthread.h', define_name='HAVE_PTHREAD_H', + env=test_env, fragment=fragment, + errmsg='Could not find pthread support (build/config.log for details)', + mandatory=False) + if have_pthread: + conf.env['CXXFLAGS_PTHREAD'] = '-pthread' + conf.env['CCFLAGS_PTHREAD'] = '-pthread' + conf.env['LINKFLAGS_PTHREAD'] = '-pthread' + + conf.env['ENABLE_THREADING'] = have_pthread conf.report_optional_feature("Threading", "Threading Primitives", conf.env['ENABLE_THREADING'], @@ -112,6 +135,7 @@ def build(bld): 'unix-system-mutex.cc', 'unix-system-condition.cc', ]) + core.uselib = 'PTHREAD' headers.source.extend([ 'system-mutex.h', 'system-thread.h', From 90a0977871eef89c37b1f472df8c74a5213d0b4a Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" <gjc@inescporto.pt> Date: Sun, 25 Jan 2009 14:48:47 +0000 Subject: [PATCH 11/17] EmuNetDevice also depends on the availibility of threading support --- src/devices/emu/wscript | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/devices/emu/wscript b/src/devices/emu/wscript index 8400d1288..53761d516 100644 --- a/src/devices/emu/wscript +++ b/src/devices/emu/wscript @@ -1,11 +1,16 @@ ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- def configure(conf): - conf.env['ENABLE_EMU'] = conf.check(header_name='linux/if_ether.h', - define_name='HAVE_IF_ETHER_H') - conf.report_optional_feature("EmuNetDevice", "Emulated Net Device", - conf.env['ENABLE_EMU'], - "<linux/if_ether.h> include not detected") + if conf.env['ENABLE_THREADING']: + conf.env['ENABLE_EMU'] = conf.check(header_name='linux/if_ether.h', + define_name='HAVE_IF_ETHER_H') + conf.report_optional_feature("EmuNetDevice", "Emulated Net Device", + conf.env['ENABLE_EMU'], + "<linux/if_ether.h> include not detected") + else: + conf.report_optional_feature("EmuNetDevice", "Emulated Net Device", + False, + "needs threading support which is not available") def build(bld): module = bld.create_ns3_module('emu', ['node']) From 51e6ac361758adc0bd588be2be519e0a8c0258c4 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" <gjc@inescporto.pt> Date: Sun, 25 Jan 2009 14:52:09 +0000 Subject: [PATCH 12/17] Fix 'no newline at the end of file' compilation error in the pthread test --- src/core/wscript | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/wscript b/src/core/wscript index b12cb9311..0ddc32a2e 100644 --- a/src/core/wscript +++ b/src/core/wscript @@ -14,7 +14,7 @@ def configure(conf): test_env.append_value('LINKFLAGS', '-pthread') test_env.append_value('CXXFLAGS', '-pthread') test_env.append_value('CCFLAGS', '-pthread') - fragment = """ + fragment = r""" #include <pthread.h> int main () { @@ -22,7 +22,7 @@ int main () pthread_mutex_init (&m, NULL); return 0; } - """ +""" have_pthread = conf.check(header_name='pthread.h', define_name='HAVE_PTHREAD_H', env=test_env, fragment=fragment, errmsg='Could not find pthread support (build/config.log for details)', From d7cf4f24628f01a8eb6b355d661d48a6f4e77f59 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" <gjc@inescporto.pt> Date: Sun, 25 Jan 2009 15:39:36 +0000 Subject: [PATCH 13/17] Don't use the flag -pthread on darwin to avoid warning message --- src/core/wscript | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/core/wscript b/src/core/wscript index 0ddc32a2e..990101824 100644 --- a/src/core/wscript +++ b/src/core/wscript @@ -1,6 +1,6 @@ ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- import sys - +import Options def configure(conf): if conf.check(header_name='stdlib.h'): @@ -11,9 +11,10 @@ def configure(conf): # Check for POSIX threads test_env = conf.env.copy() - test_env.append_value('LINKFLAGS', '-pthread') - test_env.append_value('CXXFLAGS', '-pthread') - test_env.append_value('CCFLAGS', '-pthread') + if Options.platform != 'darwin': + test_env.append_value('LINKFLAGS', '-pthread') + test_env.append_value('CXXFLAGS', '-pthread') + test_env.append_value('CCFLAGS', '-pthread') fragment = r""" #include <pthread.h> int main () @@ -28,9 +29,11 @@ int main () errmsg='Could not find pthread support (build/config.log for details)', mandatory=False) if have_pthread: - conf.env['CXXFLAGS_PTHREAD'] = '-pthread' - conf.env['CCFLAGS_PTHREAD'] = '-pthread' - conf.env['LINKFLAGS_PTHREAD'] = '-pthread' + # darwin accepts -pthread but prints a warning saying it is ignored + if Options.platform != 'darwin': + conf.env['CXXFLAGS_PTHREAD'] = '-pthread' + conf.env['CCFLAGS_PTHREAD'] = '-pthread' + conf.env['LINKFLAGS_PTHREAD'] = '-pthread' conf.env['ENABLE_THREADING'] = have_pthread From e300331c6ac886d5cfb8daf639deab22ecac995d Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" <gjc@inescporto.pt> Date: Sun, 25 Jan 2009 15:44:55 +0000 Subject: [PATCH 14/17] samples/main-test-sync also depends on the realtime optional feature --- samples/wscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/wscript b/samples/wscript index 5286f56c9..deba5598e 100644 --- a/samples/wscript +++ b/samples/wscript @@ -19,7 +19,7 @@ def build(bld): obj = bld.create_ns3_program('main-test') obj.source = 'main-test.cc' - if bld.env['ENABLE_THREADING']: + if bld.env['ENABLE_THREADING'] and bld.env["ENABLE_REAL_TIME"]: obj = bld.create_ns3_program('main-test-sync') obj.source = 'main-test-sync.cc' From a77eb54bcc7abfbac85f56575c5a039c70dac96d Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" <gjc@inescporto.pt> Date: Sun, 25 Jan 2009 21:57:24 +0000 Subject: [PATCH 15/17] Workaround WAF issue 325 for generating module header files --- src/wscript | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/wscript b/src/wscript index df774e0e8..d91e6b8cc 100644 --- a/src/wscript +++ b/src/wscript @@ -9,10 +9,7 @@ import TaskGen import Task import Options import Build -#import Action -#import Common -#import Object -#import Params +from Utils import md5 all_modules = ( @@ -177,6 +174,21 @@ class gen_ns3_module_header_task(Task.Task): outfile.close() return 0 + def sig_explicit_deps(self): + m = md5() + m.update('\n'.join([node.abspath(self.env) for node in self.inputs])) + return m.digest() + + def unique_id(self): + try: + return self.uid + except AttributeError: + "this is not a real hot zone, but we want to avoid surprizes here" + m = md5() + m.update("ns-3-module-header-%s" % self.module) + self.uid = m.digest() + return self.uid + class ns3moduleheader_taskgen(TaskGen.task_gen): """ From eaa8e9880ee30c9e3591c356a53624e911d1b919 Mon Sep 17 00:00:00 2001 From: Tom Henderson <tomh@tomh.org> Date: Mon, 26 Jan 2009 13:41:54 -0800 Subject: [PATCH 16/17] add wifi-architecture figure to manual --- doc/manual/Makefile | 4 +++- doc/manual/wifi.texi | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/doc/manual/Makefile b/doc/manual/Makefile index 7dc11ceef..6775f1f7a 100644 --- a/doc/manual/Makefile +++ b/doc/manual/Makefile @@ -7,6 +7,7 @@ CSS = --css-include=manual.css SPLIT = --split section FIGURES = figures +DOC_FIGURES = .. VPATH = $(FIGURES) IMAGES_EPS = \ @@ -18,7 +19,8 @@ IMAGES_EPS = \ $(FIGURES)/sockets-overview.eps \ $(FIGURES)/testbed.eps \ $(FIGURES)/emulated-channel.eps \ - $(FIGURES)/snir.eps + $(FIGURES)/snir.eps \ + $(DOC_FIGURES)/WifiArchitecture.eps IMAGES_PNG = ${IMAGES_EPS:.eps=.png} IMAGES_PDF = ${IMAGES_EPS:.eps=.pdf} diff --git a/doc/manual/wifi.texi b/doc/manual/wifi.texi index cd200f4d1..29f1e451e 100644 --- a/doc/manual/wifi.texi +++ b/doc/manual/wifi.texi @@ -83,6 +83,11 @@ is no model for cross-channel interference or coupling. The source code for the Wifi NetDevice lives in the directory @code{src/devices/wifi}. +@float Figure,fig:WifiArchitecture +@caption{Wifi NetDevice architecture.} +@image{../WifiArchitecture,5in} +@end float + @node Using the WifiNetDevice @section Using the WifiNetDevice From a9edcf4928051042980c12210aec833fb805f390 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" <gjc@inescporto.pt> Date: Tue, 27 Jan 2009 14:18:55 +0000 Subject: [PATCH 17/17] Make sure to call ns3.Simulator.Destroy() before python exit to avoid segmentation faults on program exit. --- bindings/python/ns3/__init__.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bindings/python/ns3/__init__.py b/bindings/python/ns3/__init__.py index 943a01575..cd1f9ec82 100644 --- a/bindings/python/ns3/__init__.py +++ b/bindings/python/ns3/__init__.py @@ -1,4 +1,7 @@ from _ns3 import * +import atexit +atexit.register(Simulator.Destroy) +del atexit