How do I force something onto the heap? (need for libev)

Tyler Jameson Little beatgammit at gmail.com
Mon Mar 5 21:09:31 PST 2012


On Tuesday, 6 March 2012 at 04:54:44 UTC, Mike Parker wrote:
> On 3/6/2012 1:34 PM, Tyler Jameson Little wrote:
>> I've been playing with libev in D lately, and I've run into a 
>> problem.
>> I've been able to hack around it, but it'd like to find a 
>> better, more
>> general solution. Here's a link to the code:
>>
>> https://github.com/beatgammit/fun-with-d/blob/master/libev/tcp_server.d
>>
>> The code is a basic TCP server that responds to connections in 
>> a
>> non-blocking fashion. It's not perfect, and the current 
>> problem I'm
>> trying to solve is how to get my Socket instance (from accept) 
>> to the
>> handler.  Since everything is asynchronous, and the return 
>> value of
>> accept() will get lost (garbage collected, I think). When I 
>> try to get
>> the address of it, the compiler complains that it's not an 
>> lvalue.
>
> Socket instance returned by accept won't be garbage collected 
> (or lost) as long as you have a reference to it active 
> somewhere in your program. It doesn't matter which thread. Just 
> take the return value of accept and pass it to your handler as 
> is. As long as your handler holds on to the reference, you're 
> fine. No need to try and get the address, or hack around it.

Maybe I'm missing something then. I tried to do this:

Add the following after line 34 in my code:

     watcher.data = &req;

Change line 14 to:

     auto req = cast(Socket*)w.data;

That all compiled ok, but I got a seg fault, which I assume is 
because it's been garbage collected. w.data should be the pointer 
that I assigned to it, or a Socket*.

w.data is defined as a void*, and the struct comes from C (I 
think), so it wouldn't be read by the garbage collector in its 
sweep. Maybe I'm wrong, but that's what I think is going on.

Is there something else going on here that I'm not seeing?

Thanks so much for your help!


More information about the Digitalmars-d-learn mailing list