[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] libpipe/pq.c
From: |
Ognyan Kulev |
Subject: |
[PATCH] libpipe/pq.c |
Date: |
Wed, 10 Apr 2002 13:48:08 +0300 |
User-agent: |
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.9) Gecko/20020402 Debian/2:0.9.9-4 |
Hi,
In `libpipe/pq.c:packet_set_ports' when the new ports array is bigger
than `packet->ports' a new ports array is malloced but it doesn't
replace the old one. The first patch fix this.
In some places in the file `sizeof (mach_port_t *)' is used while
obviously `sizeof (mach_port_t)' is meant. The second patch fix this.
The third patch deals with reusing the packets in function `pq_queue'.
Let's suppose we do `pq_dequeue' for a packet with ports:
`packet_dealloc_ports' is called but `packet->num_ports' is not changed
and the packet go in the list of the free packets. If `pq_queue' reuse
this packet `packet->num_ports' tells that some ports are in the packet
and a subsequent call to `packet_set_ports' will deallocate these ports
again. So when reusing packets we must make sure that `num_ports' is
set to 0.
I don't know how this library is used so it is possible that a part of
its interfaces demand that ports are already removed by
`packet_read_ports'. But why then `pq_dequeue' calls
`packet_dealloc_ports'? So i think the correct is to set num_ports to zero.
Instead of talking more i'll just mention that the patch initializes
`buf_start' and `buf_end' too.
And now some general questions:
There are many places where `bcopy' is used instead of `memcpy'. The
reason for preferring `memcpy' is that `memcpy' doesn't check for
overlapping memory segments, while `bcopy' and `memmove' do. Are you
accepting patches for such issues?
The second question is about using mmap/munmap instead of
vm_allocate/vm_deallocate. In pq.[ch] they are mixed, there is no
consistency. What is the reason to prefer `mmap' to `vm_allocate'? Is
there a policy about that?
Regards
--
Ognyan Kulev <ogi@fmi.uni-sofia.bg>, "\"Programmer\""
--- pq.c.orig Wed Apr 10 12:45:10 2002
+++ pq.c Wed Apr 10 12:49:44 2002
@@ -299,6 +299,7 @@ packet_set_ports (struct packet *packet,
if (! new_ports)
return ENOMEM;
free (packet->ports);
+ packet->ports = new_ports;
packet->ports_alloced = num_ports;
}
bcopy (ports, packet->ports, sizeof (mach_port_t *) * num_ports);
--- pq.c.ports Wed Apr 10 12:49:44 2002
+++ pq.c Wed Apr 10 12:50:21 2002
@@ -295,14 +295,14 @@ packet_set_ports (struct packet *packet,
packet_dealloc_ports (packet);
if (num_ports > packet->ports_alloced)
{
- mach_port_t *new_ports = malloc (sizeof (mach_port_t *) * num_ports);
+ mach_port_t *new_ports = malloc (sizeof (mach_port_t) * num_ports);
if (! new_ports)
return ENOMEM;
free (packet->ports);
packet->ports = new_ports;
packet->ports_alloced = num_ports;
}
- bcopy (ports, packet->ports, sizeof (mach_port_t *) * num_ports);
+ bcopy (ports, packet->ports, sizeof (mach_port_t) * num_ports);
packet->num_ports = num_ports;
return 0;
}
@@ -313,7 +313,7 @@ error_t
packet_read_ports (struct packet *packet,
mach_port_t **ports, size_t *num_ports)
{
- int length = packet->num_ports * sizeof (mach_port_t *);
+ int length = packet->num_ports * sizeof (mach_port_t);
if (*num_ports < packet->num_ports)
{
*ports = mmap (0, length, PROT_READ|PROT_WRITE, MAP_ANON, 0, 0);
--- pq.c.mach Wed Apr 10 13:02:11 2002
+++ pq.c Wed Apr 10 13:02:15 2002
@@ -132,7 +132,11 @@ pq_queue (struct pq *pq, unsigned type,
packet->buf_vm_alloced = 0;
}
else
- pq->free = packet->next;
+ {
+ pq->free = packet->next;
+ packet->num_ports = 0;
+ packet->buf_start = packet->buf_end = packet->buf;
+ }
packet->type = type;
packet->source = source;
- [PATCH] libpipe/pq.c,
Ognyan Kulev <=
- Re: [PATCH] libpipe/pq.c, Ognyan Kulev, 2002/04/22
- Re: [PATCH] libpipe/pq.c, Roland McGrath, 2002/04/22
- Re: [PATCH] libpipe/pq.c, Marcus Brinkmann, 2002/04/22
- Re: [PATCH] libpipe/pq.c, Marcus Brinkmann, 2002/04/22
- Re: [PATCH] libpipe/pq.c, Ognyan Kulev, 2002/04/24
- Re: [PATCH] libpipe/pq.c, Marcus Brinkmann, 2002/04/24
- Re: [PATCH] libpipe/pq.c, Jeroen Dekkers, 2002/04/24
- Re: [PATCH] libpipe/pq.c, Marcus Brinkmann, 2002/04/24
- Re: [PATCH] libpipe/pq.c, Jeroen Dekkers, 2002/04/24
Re: [PATCH] libpipe/pq.c, Marcus Brinkmann, 2002/04/22