This looks great - one question, though. Is there any straightforward way of detecting when a block of memory is no longer being used by a packet so that I can free up that memory? Getting a 'type' argument to the free() callback would be sufficient, but it might also be nice to just have a specialized 'packetDestroyed' callback that lets the user know that a packet's data is no longer in use.
<br><br>In my specific case, to be able to pass a data pointer to enet, I have to pin the data in memory first because I'm using a garbage-collected VM, so I need to know when the data is no longer in use so that it can be unpinned and GCed.
<br><br>Thanks<br>-k<br><br><div><span class="gmail_quote">On 5/1/06, <b class="gmail_sendername">Lee Salzman</b> &lt;<a href="mailto:lsalzman1@cox.net">lsalzman1@cox.net</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Just because I felt inspired I will eventually add something similar to<br>the following code to the main ENet branch. If you really want, just<br>manually apply these diffs for now, and when I get around to the next<br>release it will be in there. You can consider the interface to it
<br>(ENET_PACKET_FLAG_NO_ALLOCATE) final, so don't worry about using it. It<br>will just use the pointer passed to enet_packet_create() verbatim rather<br>than copying from it.<br><br>Index: packet.c<br>===================================================================
<br>RCS file: /cvsroot/sauerbraten/sauerbraten/src/enet/packet.c,v<br>retrieving revision 1.2<br>diff -u -r1.2 packet.c<br>--- packet.c&nbsp;&nbsp;&nbsp;&nbsp;24 Mar 2006 21:14:07 -0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.2<br>+++ packet.c&nbsp;&nbsp;&nbsp;&nbsp;2 May 2006 04:13:31 -0000<br>
@@ -21,10 +21,15 @@<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ENetPacket * packet = (ENetPacket *) enet_malloc (sizeof<br>(ENetPacket));<br><br>-&nbsp;&nbsp;&nbsp;&nbsp;packet -&gt; data = (enet_uint8 *) enet_malloc (dataLength);<br>+&nbsp;&nbsp;&nbsp;&nbsp;if(flags &amp; ENET_PACKET_FLAG_NO_ALLOCATE)
<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;packet -&gt; data = (enet_uint8 *) data;<br>+&nbsp;&nbsp;&nbsp;&nbsp;else<br>+&nbsp;&nbsp;&nbsp;&nbsp;{<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; packet -&gt; data = (enet_uint8 *) enet_malloc (dataLength);<br><br>-&nbsp;&nbsp;&nbsp;&nbsp;if (data != NULL)<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy (packet -&gt; data, data, dataLength);
<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (data != NULL)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy (packet -&gt; data, data, dataLength);<br>+&nbsp;&nbsp;&nbsp;&nbsp;};<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;packet -&gt; referenceCount = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;packet -&gt; flags = flags;<br>@@ -39,7 +44,8 @@<br>&nbsp;&nbsp;void<br>&nbsp;&nbsp;enet_packet_destroy (ENetPacket * packet)
<br>&nbsp;&nbsp;{<br>-&nbsp;&nbsp;&nbsp;&nbsp;enet_free (packet -&gt; data);<br>+&nbsp;&nbsp;&nbsp;&nbsp;if((packet -&gt; flags &amp; ENET_PACKET_FLAG_NO_ALLOCATE) == 0)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enet_free (packet -&gt; data);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enet_free (packet);<br>&nbsp;&nbsp;}<br><br>@@ -54,7 +60,7 @@
<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enet_uint8 * newData;<br><br>-&nbsp;&nbsp;&nbsp;&nbsp;if (dataLength &lt;= packet -&gt; dataLength)<br>+&nbsp;&nbsp;&nbsp;&nbsp;if (dataLength &lt;= packet -&gt; dataLength || (packet -&gt; flags &amp;<br>ENET_PACKET_FLAG_NO_ALLOCATE))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; packet -&gt; dataLength = dataLength;<br><br>Index: include/enet/enet.h<br>===================================================================<br>RCS file: /cvsroot/sauerbraten/sauerbraten/src/enet/include/enet/enet.h,v
<br>retrieving revision 1.8<br>diff -u -r1.8 enet.h<br>--- include/enet/enet.h 1 May 2006 19:24:17 -0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.8<br>+++ include/enet/enet.h 2 May 2006 04:13:31 -0000<br>@@ -80,7 +80,9 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; /** packet will not be sequenced with other packets
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * not supported for reliable packets<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>-&nbsp;&nbsp; ENET_PACKET_FLAG_UNSEQUENCED = (1 &lt;&lt; 1)<br>+&nbsp;&nbsp; ENET_PACKET_FLAG_UNSEQUENCED = (1 &lt;&lt; 1),<br>+&nbsp;&nbsp; /** packet will not allocate data, and user must supply it instead */
<br>+&nbsp;&nbsp; ENET_PACKET_FLAG_NO_ALLOCATE = (1 &lt;&lt; 2)<br>&nbsp;&nbsp;} ENetPacketFlag;<br><br>&nbsp;&nbsp;/**<br><br>Kevin Gadd wrote:<br>&gt; Perfect. Being able to send the same packets multiple times will be a<br>&gt; godsend - glad that's possible. Probably wouldn't hurt to document that
<br>&gt; somewhere. :)<br>&gt;<br>&gt; I noticed the callbacks stuff in the new version of the library but<br>&gt; didn't notice that it was for allocation. Makes sense. Is there any way<br>&gt; to turn the callbacks on and off dynamically so that I can only use them
<br>&gt; when I'm creating a packet from an existing memory buffer?<br>&gt;<br>&gt; Thanks!<br>&gt; -kg<br>&gt;<br>_______________________________________________<br>ENet-discuss mailing list<br><a href="mailto:ENet-discuss@cubik.org">
ENet-discuss@cubik.org</a><br><a href="http://lists.cubik.org/mailman/listinfo/enet-discuss">http://lists.cubik.org/mailman/listinfo/enet-discuss</a><br></blockquote></div><br>