Hi Chris -

Overall, this should help more than hurt, but it's probably not a big
deal either way.  One aspect of this change was to move functionality
out of the specific 2LSs and into uthreads, which can only help - such
as if its something that the gdb stub needed.  There's also a few more
synchronization primitives that might help.  Also, since join and
detach are now handled at the uthread level, it'll be easier to know
when a thread is 'done' without requiring any other 2LS hooks.  

I guess we'll see.  =)

Barret


On 2017-04-29 at  1:50 'Christopher Koch' via Akaros wrote:
> Hey Barret,
> 
> Sometime soon I was planning on getting gdb merged (with fixes and
> responses to code review a long time ago etc). How different do you think
> gdb will have to be with this?
> 
> Chris
> 
> On Fri, Apr 28, 2017, 13:19 Barret Rhoden <[email protected]> wrote:
> 
> > Hi -
> >
> > On 2017-03-14 at 15:40 Barret Rhoden <[email protected]> wrote:  
> > > So concretely, I'm currently planning:  
> >
> > [ a bunch of things ]
> >  
> > > Anyway, that's my current plan.  I imagine it'll change as I dig in
> > > more.  The minimum that we need to do is gcc's gthr.h interface, so I
> > > might hold off on the pthread stuff until we get a better feel for
> > > specific library code that is trying to use the pthread's API.  
> >
> > That is pretty much done for now, and pretty close to the original plan.
> > As expected, I also broke up part of pthread code and made it
> > 2LS-independent, but there's still a bit more to do.
> >
> > I also got involved in glibc's locking and threading.  The short
> > version is that our port of glibc has two different types of locks.
> > The libc_lock and _IO_lock are mutexes.  The malloc lock is a
> > spinlock.  Vcore context (including interprocess signal handlers) can
> > use malloc/free, but not anything that could block.
> >
> > Ultimately, this fixes a bunch of toolchain bugs with C++ code as well
> > as intermittent problems/panics with blocking while holding locks.  We
> > also have implementations of a bunch of sync primitives that we either
> > ignored (e.g. timed CVs, recursive mutexes) or faked (pthread RW locks
> > were just mutexes).
> >
> > Hopefully I didn't break anyone's code.  We'll see.  You'll need to
> > rebuild the world.
> >
> > A couple other notes, mostly for Gan:
> > - benchutil/alarm.h is now parlib/alarm.h.
> > - vmm task thread functions now return void *, like a pthread would.
> > - if vcore context attempts to grab a mutex (which *could* block), it
> >   will panic.
> > - panics and asserts spit out a backtrace on the monitor/console.
> > - vcore context code *can* call fprintf, but only for stdout or stderr,
> >   where we'll macro-magic the call to a write() to FD 1 or 2.  you'll
> >   need to #include <parlib/stdio.h> for this.
> >
> > Check out the commits for more info.
> >
> > Barret
> >
> >
> > The following changes since commit
> > 41ab54b78d870d46cdbc6100e9a96dcf64b82fae:
> >
> >   Mark 'user' as PHONY in the top-level Makefile (2017-04-25 15:27:41
> > -0400)
> >
> > are available in the git repository at:
> >
> >   [email protected]:brho/akaros.git uth
> >
> > for you to fetch changes up to 1f6e281e8bb5343138f7b21b4d63a2b092cda283:
> >
> >   pthreads: Remove sched_policy and sched_priority (2017-04-28 16:00:53
> > -0400)
> >
> > ----------------------------------------------------------------
> > View this online at:
> > https://github.com/brho/akaros/compare/41ab54b78d87...1f6e281e8bb5
> >
> > ----------------------------------------------------------------
> > Barret Rhoden (57):
> >       parlib: Use 'const' in the set_dtls() interface
> >       parlib: Add trylock to uthread mutexes
> >       parlib: Add recursive uthread mutexes
> >       parlib: Add a helper for multi-threaded-ness
> >       ndblib: Remove dependency on pthreads
> >       Remove kernel-specific parts of ros/common.h (XCC)
> >       parlib: Move init_once_racy() to parlib (XCC)
> >       Convert run_once() to parlib_run_once() (XCC)
> >       parlib: Use cpu_relax_vc() in parlib_run_once() (XCC)
> >       parlib: Add synchronization objects
> >       parlib: Always use the default mutex/cv interface
> >       parlib: Change opaque mutex/cv types to be structs
> >       parlib: Add static initializers for mutexes / CVs
> >       parlib: Add a test for recursive mutexes
> >       parlib: Implement uthread mutexes with semaphores
> >       parlib: sem/mtx/cv: Add init() and destroy()
> >       parlib: Add uth_cond_var_wait_recurse()
> >       benchutil: Clarify unset_alarm()'s semantics
> >       parlib: Move alarm/timer functions from benchutil
> >       vmm: Remove references to pthreads
> >       parlib: Add an alarm helper
> >       parlib: Add 'timed' functions for sems/mtxs/cvs
> >       parlib: Implement join/detach() for all uthreads
> >       vmm: Make all task functions return void *
> >       parlib: Add uthread_create()
> >       parlib: Add uthread_sched_yield()
> >       Implement sched_yield() with uthread_sched_yield() (XCC)
> >       pthread: Implement POSIX semaphores with uth sems
> >       futex: Make futexes independent of pthreads
> >       parlib: UTH_EXT_BLK_JUSTICE -> _MISC
> >       parlib: Add uthread_self()
> >       Add the 'akaros' threading model to gcc (XCC)
> >       Use patches for existing toolchain files (XCC)
> >       parlib: Allow cpu_relax_vc() calls from uthreads
> >       parlib: Add cpu_relax_any()
> >       Add a shared_ptr sanity check
> >       parlib: Add reader-writer sleeping locks
> >       parlib: Trim some header includes
> >       Remove old tests and mhello
> >       parlib: Make sync objects static (XCC)
> >       Use weak __thread declarations in parlib-compat (XCC)
> >       Fix a couple warnings in glibc (XCC)
> >       parlib: Catch illegal block attempts
> >       parlib: Catch broken uses of notif_disabled_depth
> >       parlib: Set line buffering for stdout
> >       parlib: Improve panic() and assert()
> >       Have all asserts call parlib's assert (XCC)
> >       parlib: Make parlib printfs safe
> >       Overhaul glibc locking (XCC)
> >       parlib: Add a rwlock test
> >       parlib: Make uth mutex/CV initializers C++ safe
> >       pthread: Reimplement mutexes, CVs, and RW locks (XCC)
> >       parlib: Tease out uth_sync_t from has_blocked()
> >       parlib: Add __uth_sync_swap and __uth_sync_is_empty
> >       parlib: Add a thread_bulk_runnable() 2LS op
> >       pthread: Make pthread barriers 2LS-independent
> >       pthreads: Remove sched_policy and sched_priority
> >
> >  kern/arch/x86/trap.c                               |     7 +-
> >  kern/include/common.h                              |    56 +
> >  kern/include/ros/common.h                          |    42 -
> >  tests/alarm.c                                      |     2 +-
> >  tests/childfdmap.c                                 |     2 +-
> >  tests/cpp_streams.cc                               |     9 +
> >  tests/evq_block.c                                  |     2 +-
> >  tests/getifaddrs.c                                 |     2 +-
> >  tests/hello.c                                      |     2 +-
> >  tests/listen1.c                                    |     2 +-
> >  tests/lock_test.c                                  |     1 +
> >  tests/mcp_halt.c                                   |    66 -
> >  tests/mhello.c                                     |   179 -
> >  tests/microb_test.c                                |     1 +
> >  tests/old/appender.c                               |    40 -
> >  tests/old/arsc_mt.c                                |    52 -
> >  tests/old/arsc_test.c                              |    44 -
> >  tests/old/badsegment.c                             |    14 -
> >  tests/old/breakpoint.c                             |    10 -
> >  tests/old/buggyhello.c                             |    11 -
> >  tests/old/condvar_test.c                           |   154 -
> >  tests/old/divzero.c                                |    12 -
> >  tests/old/dtls_test.c                              |    62 -
> >  tests/old/eth_audio.c                              |   137 -
> >  tests/old/evilhello.c                              |    13 -
> >  tests/old/faultread.c                              |    10 -
> >  tests/old/faultreadkernel.c                        |    10 -
> >  tests/old/faultwrite.c                             |     8 -
> >  tests/old/faultwritekernel.c                       |     9 -
> >  tests/old/fork.c                                   |    21 -
> >  tests/old/fp_test.c                                |    15 -
> >  tests/old/fpperf.cc                                |   108 -
> >  tests/old/hart_test.c                              |     6 -
> >  tests/old/idle.c                                   |    23 -
> >  tests/old/manycore_test.c                          |    32 -
> >  tests/old/mproctests.c                             |   161 -
> >  tests/old/msr_cycling_vcores.c                     |    58 -
> >  tests/old/msr_dumb_while.c                         |    33 -
> >  tests/old/msr_get_cores.c                          |   114 -
> >  tests/old/msr_get_singlecore.c                     |   110 -
> >  tests/old/msr_nice_while.c                         |    39 -
> >  tests/old/msr_single_while.c                       |    10 -
> >  tests/old/null.c                                   |     6 -
> >  tests/old/proctests.c                              |    32 -
> >  tests/old/raise.c                                  |    77 -
> >  tests/old/slab.c                                   |    38 -
> >  tests/old/softint.c                                |    16 -
> >  tests/old/spawn.c                                  |    58 -
> >  tests/old/syscall.c                                |   132 -
> >  tests/old/syscall_speed.c                          |    18 -
> >  tests/old/tcp_test.c                               |   108 -
> >  tests/old/test_mmap_ipc.c                          |    43 -
> >  tests/old/test_ucq.c                               |    62 -
> >  tests/old/testbss.c                                |    29 -
> >  tests/old/tlstest.c                                |    15 -
> >  tests/old/tsc_spitter.c                            |     9 -
> >  tests/old/udp_test.c                               |   103 -
> >  tests/old/vvadd.c                                  |    26 -
> >  tests/ping.c                                       |     3 +-
> >  tests/pthread_barrier_test.c                       |     2 +-
> >  tests/pthread_test.c                               |    13 +
> >  tests/timerfd.c                                    |     2 +-
> >  tests/vmm/vmrunkernel.c                            |     3 +-
> >  tests/xmm.c                                        |     2 +-
> >  tools/apps/ipconfig/ipv6.c                         |     3 +-
> >  tools/apps/ipconfig/main.c                         |     2 +-
> >  tools/compilers/gcc-glibc/Makefile                 |    22 +-
> >  .../gcc-glibc/gcc-4.9.2-akaros/config.sub          |  1793 -
> >  .../gcc-glibc/gcc-4.9.2-akaros/gcc/config.gcc      |  4273 -
> >  .../gcc-glibc/gcc-4.9.2-akaros/libgcc/config.host  |  1286 -
> >  .../gcc-4.9.2-akaros/libgcc/config/gthr-akaros.h   |   228 +
> >  .../gcc-glibc/gcc-4.9.2-akaros/libgcc/crtstuff.c   |   765 -
> >  .../gcc-4.9.2-akaros/libgomp/configure.tgt         |   150 -
> >  .../gcc-4.9.2-akaros/libstdc++-v3/configure        | 82676
> > -------------------
> >  .../gcc-4.9.2-akaros/libstdc++-v3/configure.host   |   370 -
> >  .../gcc-4.9.2-akaros/libstdc++-v3/crossconfig.m4   |   288 -
> >  tools/compilers/gcc-glibc/gcc-4.9.2-existing.patch |   435 +
> >  .../gcc-glibc/glibc-2.19-akaros/Makeconfig         |  1093 -
> >  .../compilers/gcc-glibc/glibc-2.19-akaros/abi-tags |    34 -
> >  .../gcc-glibc/glibc-2.19-akaros/configure          |  8863 --
> >  .../gcc-glibc/glibc-2.19-akaros/configure.ac       |  2192 -
> >  .../gcc-glibc/glibc-2.19-akaros/elf/Makefile       |  1150 -
> >  .../gcc-glibc/glibc-2.19-akaros/include/alloca.h   |    81 -
> >  .../gcc-glibc/glibc-2.19-akaros/include/errno.h    |    52 -
> >  .../glibc-2.19-akaros/include/libc-symbols.h       |   837 -
> >  .../glibc-2.19-akaros/nptl/shlib-versions          |     8 -
> >  .../gcc-glibc/glibc-2.19-akaros/rt/Makefile        |    75 -
> >  .../gcc-glibc/glibc-2.19-akaros/scripts/config.sub |  1793 -
> >  .../gcc-glibc/glibc-2.19-akaros/shlib-versions     |   112 -
> >  .../glibc-2.19-akaros/stdio-common/vfprintf.c      |  2384 -
> >  .../gcc-glibc/glibc-2.19-akaros/sunrpc/netname.c   |   179 -
> >  .../glibc-2.19-akaros/sysdeps/akaros/Versions      |    23 +
> >  .../sysdeps/akaros/bits/libc-lock.h                |   410 +-
> >  .../sysdeps/akaros/bits/stdio-lock.h               |    71 +-
> >  .../sysdeps/akaros/malloc-machine.h                |    17 +-
> >  .../glibc-2.19-akaros/sysdeps/akaros/mmap.c        |     2 +-
> >  .../sysdeps/akaros/parlib-compat.c                 |   193 +-
> >  .../glibc-2.19-akaros/sysdeps/akaros/sbrk.c        |    14 +-
> >  .../glibc-2.19-akaros/sysdeps/akaros/sched_yield.c |    11 +-
> >  .../glibc-2.19-akaros/sysdeps/akaros/socket.c      |    12 +-
> >  .../glibc-2.19-akaros/sysdeps/i386/configure       |   244 -
> >  .../glibc-2.19-akaros/sysdeps/i386/configure.ac    |    93 -
> >  .../glibc-2.19-akaros/sysdeps/i386/tlsdesc.sym     |    17 -
> >  .../glibc-2.19-akaros/sysdeps/x86_64/tlsdesc.sym   |    17 -
> >  .../compilers/gcc-glibc/glibc-2.19-existing.patch  |   497 +
> >  tools/dev-util/perf/akaros.c                       |     7 +-
> >  user/iplib/epoll.c                                 |    10 +-
> >  user/iplib/select.c                                |    10 +-
> >  user/ndblib/fcallfmt.c                             |     1 -
> >  user/ndblib/include/ndblib/ndb.h                   |     1 +
> >  user/{benchutil => parlib}/alarm.c                 |    14 +-
> >  user/parlib/asynccall.c                            |     2 +
> >  user/parlib/ceq.c                                  |     2 +-
> >  user/parlib/debug.c                                |    20 +-
> >  user/parlib/dtls.c                                 |    12 +-
> >  user/parlib/event.c                                |     5 +
> >  .../benchutil => parlib/include/parlib}/alarm.h    |    13 +-
> >  user/parlib/include/parlib/assert.h                |     5 -
> >  user/parlib/include/parlib/common.h                |     2 -
> >  user/parlib/include/parlib/dtls.h                  |     2 +-
> >  user/parlib/include/parlib/parlib.h                |    57 +-
> >  .../benchutil => parlib/include/parlib}/pvcalarm.h |     2 +-
> >  user/parlib/include/parlib/ros_debug.h             |    20 +-
> >  user/parlib/include/parlib/slab.h                  |     1 -
> >  user/parlib/include/parlib/stdio.h                 |    55 +
> >  user/parlib/include/parlib/uthread.h               |   226 +-
> >  user/parlib/include/parlib/vcore.h                 |    11 +-
> >  .../include/parlib}/vcore_tick.h                   |     0
> >  user/parlib/mutex.c                                |   832 +-
> >  user/parlib/panic.c                                |    62 +-
> >  user/parlib/parlib.c                               |     1 +
> >  user/{benchutil => parlib}/pvcalarm.c              |    15 +-
> >  user/parlib/signal.c                               |     1 +
> >  user/parlib/slab.c                                 |    10 +-
> >  user/parlib/syscall.c                              |     7 +-
> >  user/parlib/thread0_sched.c                        |    99 +-
> >  user/parlib/ucq.c                                  |     3 +-
> >  user/parlib/uthread.c                              |   396 +-
> >  user/parlib/vcore.c                                |    27 +-
> >  user/{benchutil => parlib}/vcore_tick.c            |     4 +-
> >  user/parlib/x86/vcore.c                            |     2 +-
> >  user/pthread/futex.c                               |    23 +-
> >  user/pthread/profalarm.c                           |     2 +-
> >  user/pthread/pthread.c                             |   639 +-
> >  user/pthread/pthread.h                             |   108 +-
> >  user/pthread/semaphore.c                           |   172 +-
> >  user/pthread/semaphore.h                           |    42 +-
> >  user/utest/alarm.c                                 |     2 +-
> >  user/utest/cv.c                                    |   267 +-
> >  user/utest/pvcalarm.c                              |     3 +-
> >  user/vmm/apic.c                                    |     1 -
> >  user/vmm/decode.c                                  |     1 -
> >  user/vmm/include/vmm/sched.h                       |     8 +-
> >  user/vmm/include/vmm/virtio.h                      |     2 +-
> >  user/vmm/include/vmm/virtio_blk.h                  |     2 +-
> >  user/vmm/include/vmm/virtio_lguest_console.h       |     4 +-
> >  user/vmm/include/vmm/virtio_net.h                  |     4 +-
> >  user/vmm/include/vmm/vmm.h                         |     1 +
> >  user/vmm/io.c                                      |     1 -
> >  user/vmm/ioapic.c                                  |     1 -
> >  user/vmm/memory.c                                  |     1 +
> >  user/vmm/nat.c                                     |    10 +-
> >  user/vmm/sched.c                                   |    74 +-
> >  user/vmm/virtio_blk.c                              |     3 +-
> >  user/vmm/virtio_lguest_console.c                   |     7 +-
> >  user/vmm/virtio_net.c                              |     6 +-
> >  user/vmm/vmx.c                                     |     1 -
> >  user/vmm/vmxmsr.c                                  |     1 -
> >  168 files changed, 3938 insertions(+), 114636 deletions(-)
> >  delete mode 100644 tests/mcp_halt.c
> >  delete mode 100644 tests/mhello.c
> >  delete mode 100644 tests/old/appender.c
> >  delete mode 100644 tests/old/arsc_mt.c
> >  delete mode 100644 tests/old/arsc_test.c
> >  delete mode 100644 tests/old/badsegment.c
> >  delete mode 100644 tests/old/breakpoint.c
> >  delete mode 100644 tests/old/buggyhello.c
> >  delete mode 100644 tests/old/condvar_test.c
> >  delete mode 100644 tests/old/divzero.c
> >  delete mode 100644 tests/old/dtls_test.c
> >  delete mode 100644 tests/old/eth_audio.c
> >  delete mode 100644 tests/old/evilhello.c
> >  delete mode 100644 tests/old/faultread.c
> >  delete mode 100644 tests/old/faultreadkernel.c
> >  delete mode 100644 tests/old/faultwrite.c
> >  delete mode 100644 tests/old/faultwritekernel.c
> >  delete mode 100644 tests/old/fork.c
> >  delete mode 100644 tests/old/fp_test.c
> >  delete mode 100644 tests/old/fpperf.cc
> >  delete mode 100644 tests/old/hart_test.c
> >  delete mode 100644 tests/old/idle.c
> >  delete mode 100644 tests/old/manycore_test.c
> >  delete mode 100644 tests/old/mproctests.c
> >  delete mode 100644 tests/old/msr_cycling_vcores.c
> >  delete mode 100644 tests/old/msr_dumb_while.c
> >  delete mode 100644 tests/old/msr_get_cores.c
> >  delete mode 100644 tests/old/msr_get_singlecore.c
> >  delete mode 100644 tests/old/msr_nice_while.c
> >  delete mode 100644 tests/old/msr_single_while.c
> >  delete mode 100644 tests/old/null.c
> >  delete mode 100644 tests/old/proctests.c
> >  delete mode 100644 tests/old/raise.c
> >  delete mode 100644 tests/old/slab.c
> >  delete mode 100644 tests/old/softint.c
> >  delete mode 100644 tests/old/spawn.c
> >  delete mode 100644 tests/old/syscall.c
> >  delete mode 100644 tests/old/syscall_speed.c
> >  delete mode 100644 tests/old/tcp_test.c
> >  delete mode 100644 tests/old/test_mmap_ipc.c
> >  delete mode 100644 tests/old/test_ucq.c
> >  delete mode 100644 tests/old/testbss.c
> >  delete mode 100644 tests/old/tlstest.c
> >  delete mode 100644 tests/old/tsc_spitter.c
> >  delete mode 100644 tests/old/udp_test.c
> >  delete mode 100644 tests/old/vvadd.c
> >  delete mode 100755 tools/compilers/gcc-glibc/gcc-4.9.2-akaros/config.sub
> >  delete mode 100644
> > tools/compilers/gcc-glibc/gcc-4.9.2-akaros/gcc/config.gcc
> >  delete mode 100644
> > tools/compilers/gcc-glibc/gcc-4.9.2-akaros/libgcc/config.host
> >  create mode 100644
> > tools/compilers/gcc-glibc/gcc-4.9.2-akaros/libgcc/config/gthr-akaros.h
> >  delete mode 100644
> > tools/compilers/gcc-glibc/gcc-4.9.2-akaros/libgcc/crtstuff.c
> >  delete mode 100644
> > tools/compilers/gcc-glibc/gcc-4.9.2-akaros/libgomp/configure.tgt
> >  delete mode 100755
> > tools/compilers/gcc-glibc/gcc-4.9.2-akaros/libstdc++-v3/configure
> >  delete mode 100644
> > tools/compilers/gcc-glibc/gcc-4.9.2-akaros/libstdc++-v3/configure.host
> >  delete mode 100644
> > tools/compilers/gcc-glibc/gcc-4.9.2-akaros/libstdc++-v3/crossconfig.m4
> >  create mode 100644 tools/compilers/gcc-glibc/gcc-4.9.2-existing.patch
> >  delete mode 100644 tools/compilers/gcc-glibc/glibc-2.19-akaros/Makeconfig
> >  delete mode 100644 tools/compilers/gcc-glibc/glibc-2.19-akaros/abi-tags
> >  delete mode 100755 tools/compilers/gcc-glibc/glibc-2.19-akaros/configure
> >  delete mode 100644 tools/compilers/gcc-glibc/glibc-2.19-akaros/
> > configure.ac
> >  delete mode 100644
> > tools/compilers/gcc-glibc/glibc-2.19-akaros/elf/Makefile
> >  delete mode 100644
> > tools/compilers/gcc-glibc/glibc-2.19-akaros/include/alloca.h
> >  delete mode 100644
> > tools/compilers/gcc-glibc/glibc-2.19-akaros/include/errno.h
> >  delete mode 100644
> > tools/compilers/gcc-glibc/glibc-2.19-akaros/include/libc-symbols.h
> >  delete mode 100644
> > tools/compilers/gcc-glibc/glibc-2.19-akaros/nptl/shlib-versions
> >  delete mode 100644 tools/compilers/gcc-glibc/glibc-2.19-akaros/rt/Makefile
> >  delete mode 100755
> > tools/compilers/gcc-glibc/glibc-2.19-akaros/scripts/config.sub
> >  delete mode 100644
> > tools/compilers/gcc-glibc/glibc-2.19-akaros/shlib-versions
> >  delete mode 100644
> > tools/compilers/gcc-glibc/glibc-2.19-akaros/stdio-common/vfprintf.c
> >  delete mode 100644
> > tools/compilers/gcc-glibc/glibc-2.19-akaros/sunrpc/netname.c
> >  delete mode 100644
> > tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/i386/configure
> >  delete mode 100644
> > tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/i386/configure.ac
> >  delete mode 100644
> > tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/i386/tlsdesc.sym
> >  delete mode 100644
> > tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/x86_64/tlsdesc.sym
> >  create mode 100644 tools/compilers/gcc-glibc/glibc-2.19-existing.patch
> >  rename user/{benchutil => parlib}/alarm.c (98%)
> >  rename user/{benchutil/include/benchutil =>
> > parlib/include/parlib}/alarm.h (91%)
> >  rename user/{benchutil/include/benchutil =>
> > parlib/include/parlib}/pvcalarm.h (99%)
> >  rename user/{benchutil/include/benchutil =>
> > parlib/include/parlib}/vcore_tick.h (100%)
> >  rename user/{benchutil => parlib}/pvcalarm.c (97%)
> >  rename user/{benchutil => parlib}/vcore_tick.c (98%)
> >
> > --
> > You received this message because you are subscribed to the Google Groups
> > "Akaros" group.
> > To unsubscribe from this group and stop receiving emails from it, send an
> > email to [email protected].
> > To post to this group, send email to [email protected].
> > For more options, visit https://groups.google.com/d/optout.
> >  

-- 
You received this message because you are subscribed to the Google Groups 
"Akaros" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to