[rtems commit] tmtests/tmfine01: New test

Joel Sherrill joel.sherrill at oarcorp.com
Mon Mar 16 12:56:54 UTC 2015


This looks like an SMP test. What happens on a uniprocessor build?

On March 16, 2015 7:52:53 AM CDT, Sebastian Huber <sebh at rtems.org> wrote:
>Module:    rtems
>Branch:    master
>Commit:    dc5e5f44485b8f9709da767f79595d2fa8aff74d
>Changeset:
>http://git.rtems.org/rtems/commit/?id=dc5e5f44485b8f9709da767f79595d2fa8aff74d
>
>Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
>Date:      Mon Mar 16 13:52:19 2015 +0100
>
>tmtests/tmfine01: New test
>
>---
>
> testsuites/tmtests/Makefile.am           |    1 +
> testsuites/tmtests/configure.ac          |    1 +
> testsuites/tmtests/tmfine01/Makefile.am  |   19 +
> testsuites/tmtests/tmfine01/init.c       |  478 +++++++
> testsuites/tmtests/tmfine01/tmfine01.doc |   21 +
>testsuites/tmtests/tmfine01/tmfine01.scn | 2092
>++++++++++++++++++++++++++++++
> 6 files changed, 2612 insertions(+)
>
>diff --git a/testsuites/tmtests/Makefile.am
>b/testsuites/tmtests/Makefile.am
>index bab9e80..c1eb7b5 100644
>--- a/testsuites/tmtests/Makefile.am
>+++ b/testsuites/tmtests/Makefile.am
>@@ -4,6 +4,7 @@ _SUBDIRS = tmck tmoverhd tm01 tm02 tm03 tm04 tm05 tm06
>tm07 tm08 tm09 tm10 \
>tm11 tm12 tm13 tm14 tm15 tm16 tm17 tm18 tm19 tm20 tm21 tm22 tm23 tm24 \
>     tm25 tm26 tm27 tm28 tm29 tm30 tm31 tm32 tm33 tm34 tm35 tm36
> _SUBDIRS += tmcontext01
>+_SUBDIRS += tmfine01
>
> include $(top_srcdir)/../automake/test-subdirs.am
> include $(top_srcdir)/../automake/local.am
>diff --git a/testsuites/tmtests/configure.ac
>b/testsuites/tmtests/configure.ac
>index 3b33445..5c6138e 100644
>--- a/testsuites/tmtests/configure.ac
>+++ b/testsuites/tmtests/configure.ac
>@@ -27,6 +27,7 @@ AC_SUBST(OPERATION_COUNT)
>
> # Explicitly list all Makefiles here
> AC_CONFIG_FILES([Makefile
>+tmfine01/Makefile
> tmcontext01/Makefile
> tmck/Makefile
> tmoverhd/Makefile
>diff --git a/testsuites/tmtests/tmfine01/Makefile.am
>b/testsuites/tmtests/tmfine01/Makefile.am
>new file mode 100644
>index 0000000..d6db7c8
>--- /dev/null
>+++ b/testsuites/tmtests/tmfine01/Makefile.am
>@@ -0,0 +1,19 @@
>+rtems_tests_PROGRAMS = tmfine01
>+tmfine01_SOURCES = init.c
>+
>+dist_rtems_tests_DATA = tmfine01.scn tmfine01.doc
>+
>+include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP at .cfg
>+include $(top_srcdir)/../automake/compile.am
>+include $(top_srcdir)/../automake/leaf.am
>+
>+AM_CPPFLAGS += -I$(top_srcdir)/../support/include
>+
>+LINK_OBJS = $(tmfine01_OBJECTS)
>+LINK_LIBS = $(tmfine01_LDLIBS)
>+
>+tmfine01$(EXEEXT): $(tmfine01_OBJECTS) $(tmfine01_DEPENDENCIES)
>+       @rm -f tmfine01$(EXEEXT)
>+       $(make-exe)
>+
>+include $(top_srcdir)/../automake/local.am
>diff --git a/testsuites/tmtests/tmfine01/init.c
>b/testsuites/tmtests/tmfine01/init.c
>new file mode 100644
>index 0000000..ed5f429
>--- /dev/null
>+++ b/testsuites/tmtests/tmfine01/init.c
>@@ -0,0 +1,478 @@
>+/*
>+ * Copyright (c) 2015 embedded brains GmbH.  All rights reserved.
>+ *
>+ *  embedded brains GmbH
>+ *  Dornierstr. 4
>+ *  82178 Puchheim
>+ *  Germany
>+ *  <rtems at embedded-brains.de>
>+ *
>+ * The license and distribution terms for this file may be
>+ * found in the file LICENSE in this distribution or at
>+ * http://www.rtems.org/license/LICENSE.
>+ */
>+
>+#ifdef HAVE_CONFIG_H
>+  #include "config.h"
>+#endif
>+
>+#include "tmacros.h"
>+
>+#include <stdio.h>
>+#include <inttypes.h>
>+
>+#include <rtems/test.h>
>+
>+const char rtems_test_name[] = "TMFINE 1";
>+
>+#define CPU_COUNT 32
>+
>+#define MSG_COUNT 3
>+
>+typedef struct {
>+  uint32_t value;
>+} test_msg;
>+
>+typedef struct {
>+  rtems_test_parallel_context base;
>+  rtems_id master;
>+  rtems_id sema[CPU_COUNT];
>+  rtems_id mq[CPU_COUNT];
>+  uint32_t self_event_ops[CPU_COUNT][CPU_COUNT];
>+  uint32_t all_to_one_event_ops[CPU_COUNT][CPU_COUNT];
>+  uint32_t one_mutex_ops[CPU_COUNT][CPU_COUNT];
>+  uint32_t many_mutex_ops[CPU_COUNT][CPU_COUNT];
>+  uint32_t self_msg_ops[CPU_COUNT][CPU_COUNT];
>+  uint32_t many_to_one_msg_ops[CPU_COUNT][CPU_COUNT];
>+} test_context;
>+
>+static test_context test_instance;
>+
>+static rtems_interval test_duration(void)
>+{
>+  return rtems_clock_get_ticks_per_second();
>+}
>+
>+static rtems_interval test_init(
>+  rtems_test_parallel_context *base,
>+  void *arg,
>+  size_t active_workers
>+)
>+{
>+  return test_duration();
>+}
>+
>+static void test_fini(
>+  const char *name,
>+  uint32_t *counters,
>+  size_t active_workers
>+)
>+{
>+  size_t i;
>+
>+  printf("  <%s activeWorker=\"%zu\">\n", name, active_workers);
>+
>+  for (i = 0; i < active_workers; ++i) {
>+    printf(
>+      "    <Counter worker=\"%zu\">%" PRIu32 "</Counter>\n",
>+      i,
>+      counters[i]
>+    );
>+  }
>+
>+  printf("  </%s>\n", name);
>+}
>+
>+static void test_self_event_body(
>+  rtems_test_parallel_context *base,
>+  void *arg,
>+  size_t active_workers,
>+  size_t worker_index
>+)
>+{
>+  test_context *ctx = (test_context *) base;
>+  rtems_id id = rtems_task_self();
>+  uint32_t counter = 0;
>+
>+  while (!rtems_test_parallel_stop_job(&ctx->base)) {
>+    rtems_status_code sc;
>+    rtems_event_set out;
>+
>+    ++counter;
>+
>+    sc = rtems_event_send(id, RTEMS_EVENT_0);
>+    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
>+
>+    sc = rtems_event_receive(
>+      RTEMS_EVENT_0,
>+      RTEMS_WAIT | RTEMS_EVENT_ANY,
>+      RTEMS_NO_TIMEOUT,
>+      &out
>+    );
>+    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
>+  }
>+
>+  ctx->self_event_ops[active_workers - 1][worker_index] = counter;
>+}
>+
>+static void test_self_event_fini(
>+  rtems_test_parallel_context *base,
>+  void *arg,
>+  size_t active_workers
>+)
>+{
>+  test_context *ctx = (test_context *) base;
>+
>+  test_fini(
>+    "SelfEvent",
>+    &ctx->self_event_ops[active_workers - 1][0],
>+    active_workers
>+  );
>+}
>+
>+static void test_all_to_one_event_body(
>+  rtems_test_parallel_context *base,
>+  void *arg,
>+  size_t active_workers,
>+  size_t worker_index
>+)
>+{
>+  test_context *ctx = (test_context *) base;
>+  rtems_id id = rtems_task_self();
>+  bool is_master = rtems_test_parallel_is_master_worker(worker_index);
>+  uint32_t counter = 0;
>+
>+  while (!rtems_test_parallel_stop_job(&ctx->base)) {
>+    rtems_status_code sc;
>+
>+    ++counter;
>+
>+    sc = rtems_event_send(id, RTEMS_EVENT_0);
>+    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
>+
>+    if (is_master) {
>+      rtems_event_set out;
>+
>+      sc = rtems_event_receive(
>+        RTEMS_ALL_EVENTS,
>+        RTEMS_WAIT | RTEMS_EVENT_ANY,
>+        RTEMS_NO_TIMEOUT,
>+        &out
>+      );
>+      rtems_test_assert(sc == RTEMS_SUCCESSFUL);
>+    }
>+  }
>+
>+  ctx->all_to_one_event_ops[active_workers - 1][worker_index] =
>counter;
>+}
>+
>+static void test_all_to_one_event_fini(
>+  rtems_test_parallel_context *base,
>+  void *arg,
>+  size_t active_workers
>+)
>+{
>+  test_context *ctx = (test_context *) base;
>+
>+  test_fini(
>+    "AllToOneEvent",
>+    &ctx->all_to_one_event_ops[active_workers - 1][0],
>+    active_workers
>+  );
>+}
>+
>+static void test_one_mutex_body(
>+  rtems_test_parallel_context *base,
>+  void *arg,
>+  size_t active_workers,
>+  size_t worker_index
>+)
>+{
>+  test_context *ctx = (test_context *) base;
>+  rtems_id id = ctx->sema[0];
>+  uint32_t counter = 0;
>+
>+  while (!rtems_test_parallel_stop_job(&ctx->base)) {
>+    rtems_status_code sc;
>+
>+    ++counter;
>+
>+    sc = rtems_semaphore_obtain(id, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
>+    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
>+
>+    sc = rtems_semaphore_release(id);
>+    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
>+  }
>+
>+  ctx->one_mutex_ops[active_workers - 1][worker_index] = counter;
>+}
>+
>+static void test_one_mutex_fini(
>+  rtems_test_parallel_context *base,
>+  void *arg,
>+  size_t active_workers
>+)
>+{
>+  test_context *ctx = (test_context *) base;
>+
>+  test_fini(
>+    "OneMutex",
>+    &ctx->one_mutex_ops[active_workers - 1][0],
>+    active_workers
>+  );
>+}
>+
>+static void test_many_mutex_body(
>+  rtems_test_parallel_context *base,
>+  void *arg,
>+  size_t active_workers,
>+  size_t worker_index
>+)
>+{
>+  test_context *ctx = (test_context *) base;
>+  rtems_id id = ctx->sema[worker_index];
>+  uint32_t counter = 0;
>+
>+  while (!rtems_test_parallel_stop_job(&ctx->base)) {
>+    rtems_status_code sc;
>+
>+    ++counter;
>+
>+    sc = rtems_semaphore_obtain(id, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
>+    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
>+
>+    sc = rtems_semaphore_release(id);
>+    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
>+  }
>+
>+  ctx->many_mutex_ops[active_workers - 1][worker_index] = counter;
>+}
>+
>+static void test_many_mutex_fini(
>+  rtems_test_parallel_context *base,
>+  void *arg,
>+  size_t active_workers
>+)
>+{
>+  test_context *ctx = (test_context *) base;
>+
>+  test_fini(
>+    "ManyMutex",
>+    &ctx->many_mutex_ops[active_workers - 1][0],
>+    active_workers
>+  );
>+}
>+
>+static void test_self_msg_body(
>+  rtems_test_parallel_context *base,
>+  void *arg,
>+  size_t active_workers,
>+  size_t worker_index
>+)
>+{
>+  test_context *ctx = (test_context *) base;
>+  rtems_id id = ctx->mq[worker_index];
>+  uint32_t counter = 0;
>+
>+  while (!rtems_test_parallel_stop_job(&ctx->base)) {
>+    rtems_status_code sc;
>+    test_msg msg = { .value = 0 };
>+    size_t n;
>+
>+    ++counter;
>+
>+    sc = rtems_message_queue_send(id, &msg, sizeof(msg));
>+    rtems_test_assert(sc == RTEMS_SUCCESSFUL || sc == RTEMS_TOO_MANY);
>+
>+    n = sizeof(msg);
>+    sc = rtems_message_queue_receive(
>+      id,
>+      &msg,
>+      &n,
>+      RTEMS_WAIT,
>+      RTEMS_NO_TIMEOUT
>+    );
>+    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
>+    rtems_test_assert(n == sizeof(msg));
>+  }
>+
>+  ctx->self_msg_ops[active_workers - 1][worker_index] = counter;
>+}
>+
>+static void test_self_msg_fini(
>+  rtems_test_parallel_context *base,
>+  void *arg,
>+  size_t active_workers
>+)
>+{
>+  test_context *ctx = (test_context *) base;
>+
>+  test_fini(
>+    "SelfMsg",
>+    &ctx->self_msg_ops[active_workers - 1][0],
>+    active_workers
>+  );
>+}
>+
>+static void test_many_to_one_msg_body(
>+  rtems_test_parallel_context *base,
>+  void *arg,
>+  size_t active_workers,
>+  size_t worker_index
>+)
>+{
>+  test_context *ctx = (test_context *) base;
>+  rtems_id id = ctx->mq[0];
>+  bool is_master = rtems_test_parallel_is_master_worker(worker_index);
>+  uint32_t counter = 0;
>+
>+  while (!rtems_test_parallel_stop_job(&ctx->base)) {
>+    rtems_status_code sc;
>+    test_msg msg = { .value = 0 };
>+    size_t n;
>+
>+    ++counter;
>+
>+    sc = rtems_message_queue_send(id, &msg, sizeof(msg));
>+    rtems_test_assert(sc == RTEMS_SUCCESSFUL || sc == RTEMS_TOO_MANY);
>+
>+    if (is_master) {
>+      n = sizeof(msg);
>+      sc = rtems_message_queue_receive(
>+        id,
>+        &msg,
>+        &n,
>+        RTEMS_WAIT,
>+        RTEMS_NO_TIMEOUT
>+      );
>+      rtems_test_assert(sc == RTEMS_SUCCESSFUL);
>+      rtems_test_assert(n == sizeof(msg));
>+    }
>+  }
>+
>+  ctx->many_to_one_msg_ops[active_workers - 1][worker_index] =
>counter;
>+}
>+
>+static void test_many_to_one_msg_fini(
>+  rtems_test_parallel_context *base,
>+  void *arg,
>+  size_t active_workers
>+)
>+{
>+  test_context *ctx = (test_context *) base;
>+
>+  test_fini(
>+    "ManyToOneMsg",
>+    &ctx->many_to_one_msg_ops[active_workers - 1][0],
>+    active_workers
>+  );
>+}
>+
>+static const rtems_test_parallel_job test_jobs[] = {
>+  {
>+    .init = test_init,
>+    .body = test_self_event_body,
>+    .fini = test_self_event_fini,
>+    .cascade = true
>+  }, {
>+    .init = test_init,
>+    .body = test_all_to_one_event_body,
>+    .fini = test_all_to_one_event_fini,
>+    .cascade = true
>+  }, {
>+    .init = test_init,
>+    .body = test_one_mutex_body,
>+    .fini = test_one_mutex_fini,
>+    .cascade = true
>+  }, {
>+    .init = test_init,
>+    .body = test_many_mutex_body,
>+    .fini = test_many_mutex_fini,
>+    .cascade = true
>+  }, {
>+    .init = test_init,
>+    .body = test_self_msg_body,
>+    .fini = test_self_msg_fini,
>+    .cascade = true
>+  }, {
>+    .init = test_init,
>+    .body = test_many_to_one_msg_body,
>+    .fini = test_many_to_one_msg_fini,
>+    .cascade = true
>+  }
>+};
>+
>+static void Init(rtems_task_argument arg)
>+{
>+  test_context *ctx = &test_instance;
>+  const char *test = "TestTimeFine01";
>+  size_t i;
>+
>+  TEST_BEGIN();
>+
>+  ctx->master = rtems_task_self();
>+
>+  for (i = 0; i < CPU_COUNT; ++i) {
>+    rtems_status_code sc;
>+
>+    sc = rtems_semaphore_create(
>+      rtems_build_name('T', 'E', 'S', 'T'),
>+      1,
>+      RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY |
>RTEMS_PRIORITY,
>+      0,
>+      &ctx->sema[i]
>+    );
>+    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
>+
>+    sc = rtems_message_queue_create(
>+      rtems_build_name('T', 'E', 'S', 'T'),
>+      MSG_COUNT,
>+      sizeof(test_msg),
>+      RTEMS_DEFAULT_ATTRIBUTES,
>+      &ctx->mq[i]
>+    );
>+    rtems_test_assert(sc == RTEMS_SUCCESSFUL);
>+  }
>+
>+  printf("<%s>\n", test);
>+
>+  rtems_test_parallel(
>+    &ctx->base,
>+    1,
>+    &test_jobs[0],
>+    RTEMS_ARRAY_SIZE(test_jobs)
>+  );
>+
>+  printf("</%s>\n", test);
>+
>+  TEST_END();
>+  rtems_test_exit(0);
>+}
>+
>+#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
>+#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
>+
>+#define CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM
>+
>+#define CONFIGURE_MAXIMUM_TASKS CPU_COUNT
>+
>+#define CONFIGURE_MAXIMUM_TIMERS 1
>+
>+#define CONFIGURE_MAXIMUM_SEMAPHORES CPU_COUNT
>+
>+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES CPU_COUNT
>+
>+#define CONFIGURE_MESSAGE_BUFFER_MEMORY \
>+  CONFIGURE_MESSAGE_BUFFERS_FOR_QUEUE(MSG_COUNT, sizeof(test_msg))
>+
>+#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
>+
>+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
>+
>+#define CONFIGURE_SMP_APPLICATION
>+
>+#define CONFIGURE_SMP_MAXIMUM_PROCESSORS CPU_COUNT
>+
>+#define CONFIGURE_INIT
>+
>+#include <rtems/confdefs.h>
>diff --git a/testsuites/tmtests/tmfine01/tmfine01.doc
>b/testsuites/tmtests/tmfine01/tmfine01.doc
>new file mode 100644
>index 0000000..1bf39c6
>--- /dev/null
>+++ b/testsuites/tmtests/tmfine01/tmfine01.doc
>@@ -0,0 +1,21 @@
>+This file describes the directives and concepts tested by this test
>set.
>+
>+test set name: tmfine01
>+
>+directives:
>+
>+  - rtems_event_send()
>+  - rtems_event_receive()
>+  - rtems_semaphore_obtain()
>+  - rtems_semaphore_release()
>+  - rtems_message_queue_send()
>+  - rtems_message_queue_receive()
>+
>+concepts:
>+
>+  - Count event send and receive operations to self.
>+  - Count event send and receive operations from all tasks to one.
>+  - Count mutex obtain and release operations with a private mutex.
>+  - Count mutex obtain and release operations with a global mutex.
>+  - Count message send and receive operations with a private message
>queue.
>+  - Count message send and receive operations with a global message
>queue.
>diff --git a/testsuites/tmtests/tmfine01/tmfine01.scn
>b/testsuites/tmtests/tmfine01/tmfine01.scn
>new file mode 100644
>index 0000000..5b7ddba
>--- /dev/null
>+++ b/testsuites/tmtests/tmfine01/tmfine01.scn
>@@ -0,0 +1,2092 @@
>+*** BEGIN OF TEST TMFINE 1 ***
>+<TestTimeFine01>
>+  <SelfEvent activeWorker="1">
>+    <Counter worker="0">2439242</Counter>
>+  </SelfEvent>
>+  <SelfEvent activeWorker="2">
>+    <Counter worker="0">2434919</Counter>
>+    <Counter worker="1">2428545</Counter>
>+  </SelfEvent>
>+  <SelfEvent activeWorker="3">
>+    <Counter worker="0">2450125</Counter>
>+    <Counter worker="1">2397577</Counter>
>+    <Counter worker="2">3396553</Counter>
>+  </SelfEvent>
>+  <SelfEvent activeWorker="4">
>+    <Counter worker="0">2440893</Counter>
>+    <Counter worker="1">2377334</Counter>
>+    <Counter worker="2">3356199</Counter>
>+    <Counter worker="3">2412298</Counter>
>+  </SelfEvent>
>+  <SelfEvent activeWorker="5">
>+    <Counter worker="0">2431918</Counter>
>+    <Counter worker="1">2361036</Counter>
>+    <Counter worker="2">3307873</Counter>
>+    <Counter worker="3">2361111</Counter>
>+    <Counter worker="4">3308071</Counter>
>+  </SelfEvent>
>+  <SelfEvent activeWorker="6">
>+    <Counter worker="0">2447343</Counter>
>+    <Counter worker="1">2358781</Counter>
>+    <Counter worker="2">3312263</Counter>
>+    <Counter worker="3">2364497</Counter>
>+    <Counter worker="4">3323441</Counter>
>+    <Counter worker="5">2393829</Counter>
>+  </SelfEvent>
>+  <SelfEvent activeWorker="7">
>+    <Counter worker="0">2438184</Counter>
>+    <Counter worker="1">2341618</Counter>
>+    <Counter worker="2">3284048</Counter>
>+    <Counter worker="3">2344390</Counter>
>+    <Counter worker="4">3289008</Counter>
>+    <Counter worker="5">2341336</Counter>
>+    <Counter worker="6">3287729</Counter>
>+  </SelfEvent>
>+  <SelfEvent activeWorker="8">
>+    <Counter worker="0">2429033</Counter>
>+    <Counter worker="1">2317275</Counter>
>+    <Counter worker="2">3250911</Counter>
>+    <Counter worker="3">2322296</Counter>
>+    <Counter worker="4">3258434</Counter>
>+    <Counter worker="5">2316913</Counter>
>+    <Counter worker="6">3256091</Counter>
>+    <Counter worker="7">2345590</Counter>
>+  </SelfEvent>
>+  <SelfEvent activeWorker="9">
>+    <Counter worker="0">2444659</Counter>
>+    <Counter worker="1">2316064</Counter>
>+    <Counter worker="2">3249718</Counter>
>+    <Counter worker="3">2321055</Counter>
>+    <Counter worker="4">3255668</Counter>
>+    <Counter worker="5">2314191</Counter>
>+    <Counter worker="6">3253259</Counter>
>+    <Counter worker="7">2294458</Counter>
>+    <Counter worker="8">3261977</Counter>
>+  </SelfEvent>
>+  <SelfEvent activeWorker="10">
>+    <Counter worker="0">2435503</Counter>
>+    <Counter worker="1">2307485</Counter>
>+    <Counter worker="2">3237568</Counter>
>+    <Counter worker="3">2312408</Counter>
>+    <Counter worker="4">3243512</Counter>
>+    <Counter worker="5">2305652</Counter>
>+    <Counter worker="6">3241019</Counter>
>+    <Counter worker="7">2286440</Counter>
>+    <Counter worker="8">3248786</Counter>
>+    <Counter worker="9">3458482</Counter>
>+  </SelfEvent>
>+  <SelfEvent activeWorker="11">
>+    <Counter worker="0">2450590</Counter>
>+    <Counter worker="1">2321791</Counter>
>+    <Counter worker="2">3257786</Counter>
>+    <Counter worker="3">2326880</Counter>
>+    <Counter worker="4">3263812</Counter>
>+    <Counter worker="5">2320008</Counter>
>+    <Counter worker="6">3261324</Counter>
>+    <Counter worker="7">2300522</Counter>
>+    <Counter worker="8">3269161</Counter>
>+    <Counter worker="9">3359031</Counter>
>+    <Counter worker="10">2399300</Counter>
>+  </SelfEvent>
>+  <SelfEvent activeWorker="12">
>+    <Counter worker="0">2441277</Counter>
>+    <Counter worker="1">2312997</Counter>
>+    <Counter worker="2">3245449</Counter>
>+    <Counter worker="3">2318044</Counter>
>+    <Counter worker="4">3251478</Counter>
>+    <Counter worker="5">2311239</Counter>
>+    <Counter worker="6">3248935</Counter>
>+    <Counter worker="7">2291697</Counter>
>+    <Counter worker="8">3256744</Counter>
>+    <Counter worker="9">3356755</Counter>
>+    <Counter worker="10">2376798</Counter>
>+    <Counter worker="11">2410036</Counter>
>+  </SelfEvent>
>+  <SelfEvent activeWorker="13">
>+    <Counter worker="0">2432106</Counter>
>+    <Counter worker="1">2304202</Counter>
>+    <Counter worker="2">3233069</Counter>
>+    <Counter worker="3">2309208</Counter>
>+    <Counter worker="4">3239016</Counter>
>+    <Counter worker="5">2302445</Counter>
>+    <Counter worker="6">3236547</Counter>
>+    <Counter worker="7">2283302</Counter>
>+    <Counter worker="8">3244262</Counter>
>+    <Counter worker="9">3315548</Counter>
>+    <Counter worker="10">2361237</Counter>
>+    <Counter worker="11">2361293</Counter>
>+    <Counter worker="12">3315613</Counter>
>+  </SelfEvent>
>+  <SelfEvent activeWorker="14">
>+    <Counter worker="0">2447142</Counter>
>+    <Counter worker="1">2318609</Counter>
>+    <Counter worker="2">3253297</Counter>
>+    <Counter worker="3">2323619</Counter>
>+    <Counter worker="4">3259235</Counter>
>+    <Counter worker="5">2316796</Counter>
>+    <Counter worker="6">3256791</Counter>
>+    <Counter worker="7">2297409</Counter>
>+    <Counter worker="8">3264655</Counter>
>+    <Counter worker="9">3321434</Counter>
>+    <Counter worker="10">2357135</Counter>
>+    <Counter worker="11">2365225</Counter>
>+    <Counter worker="12">3328122</Counter>
>+    <Counter worker="13">2394746</Counter>
>+  </SelfEvent>
>+  <SelfEvent activeWorker="15">
>+    <Counter worker="0">2437900</Counter>
>+    <Counter worker="1">2309745</Counter>
>+    <Counter worker="2">3240816</Counter>
>+    <Counter worker="3">2314700</Counter>
>+    <Counter worker="4">3246815</Counter>
>+    <Counter worker="5">2307939</Counter>
>+    <Counter worker="6">3244335</Counter>
>+    <Counter worker="7">2288528</Counter>
>+    <Counter worker="8">3252163</Counter>
>+    <Counter worker="9">3289024</Counter>
>+    <Counter worker="10">2340349</Counter>
>+    <Counter worker="11">2344734</Counter>
>+    <Counter worker="12">3292260</Counter>
>+    <Counter worker="13">2342291</Counter>
>+    <Counter worker="14">3289734</Counter>
>+  </SelfEvent>
>+  <SelfEvent activeWorker="16">
>+    <Counter worker="0">2452934</Counter>
>+    <Counter worker="1">2324127</Counter>
>+    <Counter worker="2">3261061</Counter>
>+    <Counter worker="3">2329185</Counter>
>+    <Counter worker="4">3267123</Counter>
>+    <Counter worker="5">2322273</Counter>
>+    <Counter worker="6">3264567</Counter>
>+    <Counter worker="7">2302818</Counter>
>+    <Counter worker="8">3272466</Counter>
>+    <Counter worker="9">3292144</Counter>
>+    <Counter worker="10">2339664</Counter>
>+    <Counter worker="11">2347345</Counter>
>+    <Counter worker="12">3296732</Counter>
>+    <Counter worker="13">2343270</Counter>
>+    <Counter worker="14">3291900</Counter>
>+    <Counter worker="15">2369297</Counter>
>+  </SelfEvent>
>+  <SelfEvent activeWorker="17">
>+    <Counter worker="0">2443837</Counter>
>+    <Counter worker="1">2315316</Counter>
>+    <Counter worker="2">3248712</Counter>
>+    <Counter worker="3">2320304</Counter>
>+    <Counter worker="4">3254608</Counter>
>+    <Counter worker="5">2313449</Counter>
>+    <Counter worker="6">3252138</Counter>
>+    <Counter worker="7">2294058</Counter>
>+    <Counter worker="8">3259930</Counter>
>+    <Counter worker="9">3257466</Counter>
>+    <Counter worker="10">2313585</Counter>
>+    <Counter worker="11">2323428</Counter>
>+    <Counter worker="12">3262292</Counter>
>+    <Counter worker="13">2318016</Counter>
>+    <Counter worker="14">3256271</Counter>
>+    <Counter worker="15">2294261</Counter>
>+    <Counter worker="16">3263853</Counter>
>+  </SelfEvent>
>+  <SelfEvent activeWorker="18">
>+    <Counter worker="0">2409157</Counter>
>+    <Counter worker="1">2306402</Counter>
>+    <Counter worker="2">3236233</Counter>
>+    <Counter worker="3">2311467</Counter>
>+    <Counter worker="4">3242224</Counter>
>+    <Counter worker="5">2304599</Counter>
>+    <Counter worker="6">3239755</Counter>
>+    <Counter worker="7">2285337</Counter>
>+    <Counter worker="8">3247547</Counter>
>+    <Counter worker="9">3245036</Counter>
>+    <Counter worker="10">2304780</Counter>
>+    <Counter worker="11">2314538</Counter>
>+    <Counter worker="12">3249851</Counter>
>+    <Counter worker="13">2309182</Counter>
>+    <Counter worker="14">3243840</Counter>
>+    <Counter worker="15">2285742</Counter>
>+    <Counter worker="16">3250366</Counter>
>+    <Counter worker="17">3418604</Counter>
>+  </SelfEvent>
>+  <SelfEvent activeWorker="19">
>+    <Counter worker="0">2416041</Counter>
>+    <Counter worker="1">2320825</Counter>
>+    <Counter worker="2">3256450</Counter>
>+    <Counter worker="3">2325923</Counter>
>+    <Counter worker="4">3262472</Counter>
>+    <Counter worker="5">2319042</Counter>
>+    <Counter worker="6">3259985</Counter>
>+    <Counter worker="7">2299561</Counter>
>+    <Counter worker="8">3267789</Counter>
>+    <Counter worker="9">3265334</Counter>
>+    <Counter worker="10">2319171</Counter>
>+    <Counter worker="11">2329005</Counter>
>+    <Counter worker="12">3270136</Counter>
>+    <Counter worker="13">2323666</Counter>
>+    <Counter worker="14">3264217</Counter>
>+    <Counter worker="15">2300027</Counter>
>+    <Counter worker="16">3270762</Counter>
>+    <Counter worker="17">3357941</Counter>
>+    <Counter worker="18">2387118</Counter>
>+  </SelfEvent>
>+  <SelfEvent activeWorker="20">
>+    <Counter worker="0">2397524</Counter>
>+    <Counter worker="1">2312138</Counter>
>+    <Counter worker="2">3244108</Counter>
>+    <Counter worker="3">2317105</Counter>
>+    <Counter worker="4">3250112</Counter>
>+    <Counter worker="5">2310293</Counter>
>+    <Counter worker="6">3247627</Counter>
>+    <Counter worker="7">2290992</Counter>
>+    <Counter worker="8">3255397</Counter>
>+    <Counter worker="9">3252906</Counter>
>+    <Counter worker="10">2310305</Counter>
>+    <Counter worker="11">2320096</Counter>
>+    <Counter worker="12">3257660</Counter>
>+    <Counter worker="13">2314735</Counter>
>+    <Counter worker="14">3251716</Counter>
>+    <Counter worker="15">2291237</Counter>
>+    <Counter worker="16">3258287</Counter>
>+    <Counter worker="17">3313158</Counter>
>+    <Counter worker="18">2359786</Counter>
>+    <Counter worker="19">3389669</Counter>
>+  </SelfEvent>
>+  <SelfEvent activeWorker="21">
>+    <Counter worker="0">2382159</Counter>
>+    <Counter worker="1">2303120</Counter>
>+    <Counter worker="2">3231640</Counter>
>+    <Counter worker="3">2308207</Counter>
>+    <Counter worker="4">3237659</Counter>
>+    <Counter worker="5">2301352</Counter>
>+    <Counter worker="6">3235144</Counter>
>+    <Counter worker="7">2282053</Counter>
>+    <Counter worker="8">3243009</Counter>
>+    <Counter worker="9">3240435</Counter>
>+    <Counter worker="10">2301457</Counter>
>+    <Counter worker="11">2311253</Counter>
>+    <Counter worker="12">3245235</Counter>
>+    <Counter worker="13">2305890</Counter>
>+    <Counter worker="14">3239180</Counter>
>+    <Counter worker="15">2282503</Counter>
>+    <Counter worker="16">3245865</Counter>
>+    <Counter worker="17">3290485</Counter>
>+    <Counter worker="18">2344582</Counter>
>+    <Counter worker="19">3306875</Counter>
>+    <Counter worker="20">2351956</Counter>
>+  </SelfEvent>
>+  <SelfEvent activeWorker="22">
>+    <Counter worker="0">2386032</Counter>
>+    <Counter worker="1">2317614</Counter>
>+    <Counter worker="2">3251822</Counter>
>+    <Counter worker="3">2322596</Counter>
>+    <Counter worker="4">3257901</Counter>
>+    <Counter worker="5">2315748</Counter>
>+    <Counter worker="6">3255336</Counter>
>+    <Counter worker="7">2296302</Counter>
>+    <Counter worker="8">3263171</Counter>
>+    <Counter worker="9">3260758</Counter>
>+    <Counter worker="10">2315888</Counter>
>+    <Counter worker="11">2325681</Counter>
>+    <Counter worker="12">3265516</Counter>
>+    <Counter worker="13">2320325</Counter>
>+    <Counter worker="14">3259551</Counter>
>+    <Counter worker="15">2296755</Counter>
>+    <Counter worker="16">3266120</Counter>
>+    <Counter worker="17">3295460</Counter>
>+    <Counter worker="18">2348363</Counter>
>+    <Counter worker="19">3310445</Counter>
>+    <Counter worker="20">2357213</Counter>
>+    <Counter worker="21">2385562</Counter>
>+  </SelfEvent>
>+  <SelfEvent activeWorker="23">
>+    <Counter worker="0">2373352</Counter>
>+    <Counter worker="1">2308745</Counter>
>+    <Counter worker="2">3239474</Counter>
>+    <Counter worker="3">2313746</Counter>
>+    <Counter worker="4">3245461</Counter>
>+    <Counter worker="5">2306904</Counter>
>+    <Counter worker="6">3242982</Counter>
>+    <Counter worker="7">2287602</Counter>
>+    <Counter worker="8">3250752</Counter>
>+    <Counter worker="9">3248257</Counter>
>+    <Counter worker="10">2307030</Counter>
>+    <Counter worker="11">2316845</Counter>
>+    <Counter worker="12">3253073</Counter>
>+    <Counter worker="13">2311491</Counter>
>+    <Counter worker="14">3247144</Counter>
>+    <Counter worker="15">2288045</Counter>
>+    <Counter worker="16">3253659</Counter>
>+    <Counter worker="17">3263347</Counter>
>+    <Counter worker="18">2325333</Counter>
>+    <Counter worker="19">3275731</Counter>
>+    <Counter worker="20">2333369</Counter>
>+    <Counter worker="21">2326288</Counter>
>+    <Counter worker="22">3272382</Counter>
>+  </SelfEvent>
>+  <SelfEvent activeWorker="24">
>+    <Counter worker="0">2323859</Counter>
>+    <Counter worker="1">2323201</Counter>
>+    <Counter worker="2">3259747</Counter>
>+    <Counter worker="3">2328242</Counter>
>+    <Counter worker="4">3265771</Counter>
>+    <Counter worker="5">2321389</Counter>
>+    <Counter worker="6">3263306</Counter>
>+    <Counter worker="7">2301985</Counter>
>+    <Counter worker="8">3271074</Counter>
>+    <Counter worker="9">3268539</Counter>
>+    <Counter worker="10">2321391</Counter>
>+    <Counter worker="11">2331282</Counter>
>+    <Counter worker="12">3273360</Counter>
>+    <Counter worker="13">2325840</Counter>
>+    <Counter worker="14">3267364</Counter>
>+    <Counter worker="15">2302301</Counter>
>+    <Counter worker="16">3273913</Counter>
>+    <Counter worker="17">3261834</Counter>
>+    <Counter worker="18">2324542</Counter>
>+    <Counter worker="19">3272797</Counter>
>+    <Counter worker="20">2333061</Counter>
>+    <Counter worker="21">2325351</Counter>
>+    <Counter worker="22">3268567</Counter>
>+    <Counter worker="23">3251123</Counter>
>+  </SelfEvent>
>+  <AllToOneEvent activeWorker="1">
>+    <Counter worker="0">2454533</Counter>
>+  </AllToOneEvent>
>+  <AllToOneEvent activeWorker="2">
>+    <Counter worker="0">2444811</Counter>
>+    <Counter worker="1">4552873</Counter>
>+  </AllToOneEvent>
>+  <AllToOneEvent activeWorker="3">
>+    <Counter worker="0">2460307</Counter>
>+    <Counter worker="1">4507332</Counter>
>+    <Counter worker="2">6760988</Counter>
>+  </AllToOneEvent>
>+  <AllToOneEvent activeWorker="4">
>+    <Counter worker="0">2451147</Counter>
>+    <Counter worker="1">4433793</Counter>
>+    <Counter worker="2">6650657</Counter>
>+    <Counter worker="3">4545259</Counter>
>+  </AllToOneEvent>
>+  <AllToOneEvent activeWorker="5">
>+    <Counter worker="0">2441987</Counter>
>+    <Counter worker="1">4415771</Counter>
>+    <Counter worker="2">6623623</Counter>
>+    <Counter worker="3">4415780</Counter>
>+    <Counter worker="4">6623658</Counter>
>+  </AllToOneEvent>
>+  <AllToOneEvent activeWorker="6">
>+    <Counter worker="0">2457480</Counter>
>+    <Counter worker="1">4407822</Counter>
>+    <Counter worker="2">6601288</Counter>
>+    <Counter worker="3">4445059</Counter>
>+    <Counter worker="4">6621304</Counter>
>+    <Counter worker="5">4505768</Counter>
>+  </AllToOneEvent>
>+  <AllToOneEvent activeWorker="7">
>+    <Counter worker="0">2448321</Counter>
>+    <Counter worker="1">4384898</Counter>
>+    <Counter worker="2">6577307</Counter>
>+    <Counter worker="3">4384946</Counter>
>+    <Counter worker="4">6577337</Counter>
>+    <Counter worker="5">4384911</Counter>
>+    <Counter worker="6">6577325</Counter>
>+  </AllToOneEvent>
>+  <AllToOneEvent activeWorker="8">
>+    <Counter worker="0">2463815</Counter>
>+    <Counter worker="1">4384322</Counter>
>+    <Counter worker="2">6565540</Counter>
>+    <Counter worker="3">4418699</Counter>
>+    <Counter worker="4">6570694</Counter>
>+    <Counter worker="5">4396540</Counter>
>+    <Counter worker="6">6567240</Counter>
>+    <Counter worker="7">4514109</Counter>
>+  </AllToOneEvent>
>+  <AllToOneEvent activeWorker="9">
>+    <Counter worker="0">2454656</Counter>
>+    <Counte

--joel


More information about the devel mailing list