I think it's fair to cast shared away on certain core fns.

Sent by shouting through my showerhead.

On Jun 30, 2010, at 1:37 PM, Sean Kelly <[email protected]> wrote:

Okay, alternate evil solution:

class Condition
{
   shared void notify()
   {
       static void doNotify() {}
       (cast(Condition) this).doNotify();
   }
}

Seems like it should work, though I'm hoping that the classes in core.sync are about the only ones where it's necessary (something similar will probably be necessary for Mutex to make lock() and unlock() explicitly callable, etc). I'm half tempted to try labeling these functions as __gshared and see if it compiles.

On Jun 30, 2010, at 1:24 PM, Sean Kelly wrote:

Well that was a disaster.  I have this:

class MessageBox
{
  this()
  {
      // this makes m_lock the monitor for the MessageBox instance.
      m_lock = new Mutex( this );
      m_cond = new Condition( m_lock );
  }

  final synchronized void put( Message msg )
  {
      // m_lock is locked now
      m_list.add( msg );
m_cond.notify(); // error: notify () is not callable using argument types () shared
  }
}

struct Tid
{
  shared MessageBox mbox;
}

class Condition
{
  void notify()
  {
      // fancy stuff involving semaphores
  }
}

How do I fix this? Condition.notify() is technically shared, but I don't want to pay the cost for memory barriers that are utterly pointless. Should I change the call to notify() to:

(cast(Condition)m_cond).notify();

This should work, but it seems like an even worse subversion of the shared system than I'm already doing for MessageBox. If it helps, MessageBox is a thread-local class instance with put() as its one shared public method, so other threads have a shared reference to MessageBox while the object's owner has a non-shared reference to it. This is functionally correct, though it seems theoretically wrong to have both shared and unshared references to the same instance in the first place.


On Jun 30, 2010, at 12:27 PM, Sean Kelly wrote:

Looks like it's time I start labeling references as shared in std.concurrency. The static checking is new.

On Jun 30, 2010, at 12:15 PM, Lars Tandle Kyllingstad wrote:

Great, thanks!  I can confirm that receiveTimeout() doesn't hang
anymore.

I just encountered another problem with the SVN version of
std.concurrency. The following code is a simplified version of an idiom
which is used in TDPL, namely, sending a Tid as a message:

    import std.concurrency;

    void main()
    {
        Tid someTid;
        someTid.send(thisTid);
    }

Upon compilation, I get the following error:

/home/lars/code/phobos-trunk/phobos/std/concurrency.d(217): Error:
static assert  "Aliases to mutable thread-local data not allowed."
a.d(6):        instantiated from here: send!(Tid)

I do not get this message when I compile with the released (2.047)
version of std.concurrency.

-Lars


On Wed, 2010-06-30 at 11:36 -0700, Sean Kelly wrote:
Okay, should be fixed now.

On Jun 30, 2010, at 8:38 AM, Sean Kelly wrote:

Oh well, looks like I have even more fixing to do :-)

On Jun 30, 2010, at 7:35 AM, Lars Tandle Kyllingstad wrote:

Yeah, I noticed that you committed the fix, but too late. :) Due to some server lag, I got the "phobos commit" message several hours after I sent my e-mail, even though the commit was apparently done before I sent
it.

In case it's useful, I should mention that even after fixing the tuple issue and changing the return type of receiveTimeout() to void, it still
doesn't work.  The following code hangs indefinitely:

  import std.concurrency;

  void main()
  {
          // Should only block for 1ms:
          receiveTimeout(1, (int i) { });
  }

-Lars



On Tue, 2010-06-29 at 20:47 -0700, Sean Kelly wrote:
The code has changed a ton recently and I hadn't gotten around to testing receiveTimeout yet. I'll take care of it.

Sent from my iPhone

On Jun 29, 2010, at 4:09 PM, Lars Tandle Kyllingstad <[email protected] > wrote:

I'm guessing this error turned up because someone tried to use
receiveTimeout(). That's when it happened for me, at least. But when I
fixed this, another error occurred:

receiveTimeout() is supposed to return a bool, but it tries to return the result of MessageBox.get(), which is void. So get() should, in the case when ops[0] is an integer, somehow detect whether a message was
received within the time limit and return a bool.

Sean, if you aren't working on this already, I can look into it if you
like.

-Lars



On Tue, 2010-06-29 at 09:40 -0700, Sean Kelly wrote:
Okay I guess that makes sense. Should be easy enough to fix anyway.

On Jun 29, 2010, at 8:43 AM, Steve Schveighoffer wrote:

You can't slice a tuple and assign it back to the same tuple type.

-Steve

----- Original Message ----
From: Sean Kelly <[email protected]>
To: Discuss the phobos library for D <[email protected]>
Sent: Tue, June 29, 2010 11:39:50 AM
Subject: Re: [phobos] Typo (bug) in std.concurrency

On Jun 29, 2010, at 7:00 AM, Simen Kjaeraas wrote:


http://d.puremagic.com/issues/show_bug.cgi?id=4406

Posting it
here too, to make sure it gets noticed. It's a rather simple fix.

You
can't slice a tuple? Seriously? I could have sworn that I tested
this and it worked.


_______________________________________________
phobos mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/phobos

_______________________________________________
phobos mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/phobos

_______________________________________________
phobos mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/phobos


_______________________________________________
phobos mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/phobos

_______________________________________________
phobos mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/phobos

_______________________________________________
phobos mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/phobos

_______________________________________________
phobos mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/phobos
_______________________________________________
phobos mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/phobos

Reply via email to