tag:blogger.com,1999:blog-84060132149299846582024-03-13T12:35:46.083-07:00epoll_waitLrrrhttp://www.blogger.com/profile/03345827308117973929noreply@blogger.comBlogger5125tag:blogger.com,1999:blog-8406013214929984658.post-71100091694224126202012-04-27T21:12:00.000-07:002012-04-27T21:12:51.765-07:00Simple Memory Pool in C<div class="c" style="background-color: #f0f0f0; border: 1px solid #d0d0d0; color: #000066; font-family: monospace;">
<span style="color: #339933;">#include <stdio.h></span><br />
<span style="color: #339933;">#include <stdlib.h></span><br />
<span style="color: #339933;">#include <string.h></span><br />
<span style="color: #339933;">#include <stdint.h></span><br />
<br />
<br />
<span style="color: #339933;">#define MEMORY_POOL_ALLOCED_CONST ((void *) 0xFFFFFFFFu)</span><br />
<br />
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> memory_pool_s<br />
<span style="color: #009900;">{</span><br />
<span style="color: #993333;">void</span> <span style="color: #339933;">*</span>pool<span style="color: #339933;">;</span><br />
<span style="color: #993333;">void</span> <span style="color: #339933;">*</span>empty_blocks<span style="color: #339933;">;</span><br />
size_t block_size<span style="color: #339933;">;</span><br />
size_t count<span style="color: #339933;">;</span><br />
<span style="color: #009900;">}</span> __attribute__ <span style="color: #009900;">(</span><span style="color: #009900;">(</span>__aligned__<span style="color: #009900;">)</span><span style="color: #009900;">)</span> memory_pool_t<span style="color: #339933;">;</span><br />
<br />
memory_pool_t <span style="color: #339933;">*</span> memory_pool_create<span style="color: #009900;">(</span>size_t bs<span style="color: #339933;">,</span> size_t c<span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<span style="color: #993333;">void</span> memory_pool_destroy<span style="color: #009900;">(</span>memory_pool_t <span style="color: #339933;">*</span>mp<span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<span style="color: #993333;">void</span> memory_pool_clear<span style="color: #009900;">(</span>memory_pool_t <span style="color: #339933;">*</span>mp<span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<span style="color: #993333;">void</span> memory_pool_dump<span style="color: #009900;">(</span>memory_pool_t <span style="color: #339933;">*</span>mp<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #009900;">(</span><span style="color: #339933;">*</span> print_func<span style="color: #009900;">)</span> <span style="color: #009900;">(</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span>value<span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<span style="color: #993333;">void</span> <span style="color: #339933;">*</span> memory_pool_alloc<span style="color: #009900;">(</span>memory_pool_t <span style="color: #339933;">*</span>mp<span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<span style="color: #993333;">void</span> memory_pool_free<span style="color: #009900;">(</span>memory_pool_t <span style="color: #339933;">*</span>mp<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>p<span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<br />
<br />
memory_pool_t <span style="color: #339933;">*</span> memory_pool_create<span style="color: #009900;">(</span>size_t bs<span style="color: #339933;">,</span> size_t c<span style="color: #009900;">)</span><br />
<span style="color: #009900;">{</span><br />
memory_pool_t <span style="color: #339933;">*</span>mp <span style="color: #339933;">=</span> malloc<span style="color: #009900;">(</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">(</span>memory_pool_t<span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">(</span><span style="color: #339933;">!</span>mp<span style="color: #009900;">)</span><br />
<span style="color: #b1b100;">return</span> NULL<span style="color: #339933;">;</span><br />
<br />
mp<span style="color: #339933;">-></span>block_size <span style="color: #339933;">=</span> bs<span style="color: #339933;">;</span><br />
mp<span style="color: #339933;">-></span>count <span style="color: #339933;">=</span> c<span style="color: #339933;">;</span><br />
<br />
mp<span style="color: #339933;">-></span>pool <span style="color: #339933;">=</span> malloc<span style="color: #009900;">(</span><span style="color: #009900;">(</span>mp<span style="color: #339933;">-></span>block_size <span style="color: #339933;">+</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">(</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span> <span style="color: #339933;">*</span> mp<span style="color: #339933;">-></span>count<span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<br />
memory_pool_clear<span style="color: #009900;">(</span>mp<span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<br />
mp<span style="color: #339933;">-></span>empty_blocks <span style="color: #339933;">=</span> mp<span style="color: #339933;">-></span>pool<span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">return</span> mp<span style="color: #339933;">;</span><br />
<span style="color: #009900;">}</span><br />
<br />
<span style="color: #993333;">void</span> memory_pool_destroy<span style="color: #009900;">(</span>memory_pool_t <span style="color: #339933;">*</span>mp<span style="color: #009900;">)</span><br />
<span style="color: #009900;">{</span><br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">(</span><span style="color: #339933;">!</span>mp<span style="color: #009900;">)</span><br />
<span style="color: #b1b100;">return</span><span style="color: #339933;">;</span><br />
<br />
memory_pool_clear<span style="color: #009900;">(</span>mp<span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
free<span style="color: #009900;">(</span>mp<span style="color: #339933;">-></span>pool<span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
free<span style="color: #009900;">(</span>mp<span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">}</span><br />
<br />
<br />
<span style="color: #993333;">void</span> memory_pool_clear<span style="color: #009900;">(</span>memory_pool_t <span style="color: #339933;">*</span>mp<span style="color: #009900;">)</span><br />
<span style="color: #009900;">{</span><br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">(</span><span style="color: #339933;">!</span>mp<span style="color: #009900;">)</span><br />
<span style="color: #b1b100;">return</span><span style="color: #339933;">;</span><br />
<br />
size_t i<span style="color: #339933;">;</span><br />
<span style="color: #993333;">void</span> <span style="color: #339933;">**</span>p<span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">for</span> <span style="color: #009900;">(</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;"><</span> mp<span style="color: #339933;">-></span>count <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">)</span><br />
<span style="color: #009900;">{</span><br />
p <span style="color: #339933;">=</span> <span style="color: #009900;">(</span><span style="color: #993333;">void</span> <span style="color: #339933;">**</span><span style="color: #009900;">)</span> <span style="color: #009900;">(</span><span style="color: #009900;">(</span><span style="color: #993333;">uint8_t</span> <span style="color: #339933;">*</span><span style="color: #009900;">)</span> mp<span style="color: #339933;">-></span>pool <span style="color: #339933;">+</span> <span style="color: #009900;">(</span>mp<span style="color: #339933;">-></span>block_size <span style="color: #339933;">*</span> <span style="color: #009900;">(</span>i <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">)</span> <span style="color: #339933;">+</span><br />
<span style="color: #993333;">sizeof</span><span style="color: #009900;">(</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">)</span> <span style="color: #339933;">*</span> i<span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<span style="color: #339933;">*</span>p <span style="color: #339933;">=</span> <span style="color: #009900;">(</span><span style="color: #993333;">uint8_t</span> <span style="color: #339933;">*</span><span style="color: #009900;">)</span> mp<span style="color: #339933;">-></span>pool <span style="color: #339933;">+</span> <span style="color: #009900;">(</span>mp<span style="color: #339933;">-></span>block_size <span style="color: #339933;">+</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">(</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span> <span style="color: #339933;">*</span> <span style="color: #009900;">(</span>i <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">}</span><br />
<br />
p <span style="color: #339933;">=</span> <span style="color: #009900;">(</span><span style="color: #993333;">void</span> <span style="color: #339933;">**</span><span style="color: #009900;">)</span> <span style="color: #009900;">(</span><span style="color: #009900;">(</span><span style="color: #993333;">uint8_t</span> <span style="color: #339933;">*</span><span style="color: #009900;">)</span> mp<span style="color: #339933;">-></span>pool <span style="color: #339933;">+</span> <span style="color: #009900;">(</span>mp<span style="color: #339933;">-></span>block_size <span style="color: #339933;">*</span> mp<span style="color: #339933;">-></span>count <span style="color: #339933;">+</span><br />
<span style="color: #993333;">sizeof</span><span style="color: #009900;">(</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">)</span> <span style="color: #339933;">*</span> <span style="color: #009900;">(</span>mp<span style="color: #339933;">-></span>count <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<span style="color: #339933;">*</span>p <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span><br />
<br />
mp<span style="color: #339933;">-></span>empty_blocks <span style="color: #339933;">=</span> mp<span style="color: #339933;">-></span>pool<span style="color: #339933;">;</span><br />
<span style="color: #009900;">}</span><br />
<br />
<span style="color: #993333;">void</span> memory_pool_dump<span style="color: #009900;">(</span>memory_pool_t <span style="color: #339933;">*</span>mp<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #009900;">(</span><span style="color: #339933;">*</span> print_func<span style="color: #009900;">)</span> <span style="color: #009900;">(</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span>value<span style="color: #009900;">)</span><span style="color: #009900;">)</span><br />
<span style="color: #009900;">{</span><br />
<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html" style="color: #000060;"><span style="color: #000066;">printf</span></a><span style="color: #009900;">(</span><span style="color: red;">"start: %p, size: %d, count: %d<span style="color: #000099; font-weight: bold;">\n</span>"</span><span style="color: #339933;">,</span> mp<span style="color: #339933;">-></span>pool<span style="color: #339933;">,</span><br />
<span style="color: #009900;">(</span>mp<span style="color: #339933;">-></span>block_size <span style="color: #339933;">+</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">(</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span> <span style="color: #339933;">*</span> mp<span style="color: #339933;">-></span>count<span style="color: #339933;">,</span> mp<span style="color: #339933;">-></span>count<span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #993333;">void</span> <span style="color: #339933;">*</span>block<span style="color: #339933;">;</span><br />
<span style="color: #993333;">void</span> <span style="color: #339933;">**</span>next<span style="color: #339933;">;</span><br />
size_t i<span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">for</span> <span style="color: #009900;">(</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;"><</span> mp<span style="color: #339933;">-></span>count<span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">)</span><br />
<span style="color: #009900;">{</span><br />
block <span style="color: #339933;">=</span> <span style="color: #009900;">(</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">)</span> <span style="color: #009900;">(</span><span style="color: #009900;">(</span><span style="color: #993333;">uint8_t</span> <span style="color: #339933;">*</span><span style="color: #009900;">)</span> mp<span style="color: #339933;">-></span>pool <span style="color: #339933;">+</span> <span style="color: #009900;">(</span>mp<span style="color: #339933;">-></span>block_size <span style="color: #339933;">*</span> i<span style="color: #009900;">)</span> <span style="color: #339933;">+</span><br />
<span style="color: #993333;">sizeof</span><span style="color: #009900;">(</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">)</span> <span style="color: #339933;">*</span> i<span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
next <span style="color: #339933;">=</span> <span style="color: #009900;">(</span><span style="color: #993333;">void</span> <span style="color: #339933;">**</span><span style="color: #009900;">)</span> <span style="color: #009900;">(</span><span style="color: #009900;">(</span><span style="color: #993333;">uint8_t</span> <span style="color: #339933;">*</span><span style="color: #009900;">)</span> block <span style="color: #339933;">+</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">(</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<br />
<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html" style="color: #000060;"><span style="color: #000066;">printf</span></a><span style="color: #009900;">(</span><span style="color: red;">"block #%i(%p):"</span><span style="color: #339933;">,</span> i<span style="color: #339933;">,</span> block<span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">(</span><span style="color: #339933;">*</span>next <span style="color: #339933;">==</span> MEMORY_POOL_ALLOCED_CONST<span style="color: #009900;">)</span><br />
<span style="color: #009900;">{</span><br />
<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html" style="color: #000060;"><span style="color: #000066;">printf</span></a><span style="color: #009900;">(</span><span style="color: red;">" allocated"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">(</span>print_func<span style="color: #009900;">)</span><br />
<span style="color: #009900;">{</span><br />
<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html" style="color: #000060;"><span style="color: #000066;">printf</span></a><span style="color: #009900;">(</span><span style="color: red;">", value: "</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
print_func<span style="color: #009900;">(</span>block<span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">}</span><br />
<br />
<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html" style="color: #000060;"><span style="color: #000066;">printf</span></a><span style="color: #009900;">(</span><span style="color: red;">"<span style="color: #000099; font-weight: bold;">\n</span>"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">}</span> <span style="color: #b1b100;">else</span><br />
<span style="color: #009900;">{</span><br />
<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html" style="color: #000060;"><span style="color: #000066;">printf</span></a><span style="color: #009900;">(</span><span style="color: red;">" free, next address %p<span style="color: #000099; font-weight: bold;">\n</span>"</span><span style="color: #339933;">,</span> <span style="color: #339933;">*</span>next<span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">}</span><br />
<span style="color: #009900;">}</span><br />
<span style="color: #009900;">}</span><br />
<br />
<span style="color: #993333;">void</span> <span style="color: #339933;">*</span> memory_pool_alloc<span style="color: #009900;">(</span>memory_pool_t <span style="color: #339933;">*</span>mp<span style="color: #009900;">)</span><br />
<span style="color: #009900;">{</span><br />
<span style="color: #993333;">void</span> <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">(</span>mp<span style="color: #339933;">-></span>empty_blocks<span style="color: #009900;">)</span><br />
<span style="color: #009900;">{</span><br />
p <span style="color: #339933;">=</span> mp<span style="color: #339933;">-></span>empty_blocks<span style="color: #339933;">;</span><br />
mp<span style="color: #339933;">-></span>empty_blocks <span style="color: #339933;">=</span> <span style="color: #339933;">*</span> <span style="color: #009900;">(</span><span style="color: #993333;">void</span> <span style="color: #339933;">**</span><span style="color: #009900;">)</span> <span style="color: #009900;">(</span><span style="color: #009900;">(</span><span style="color: #993333;">uint8_t</span> <span style="color: #339933;">*</span><span style="color: #009900;">)</span> mp<span style="color: #339933;">-></span>empty_blocks <span style="color: #339933;">+</span><br />
mp<span style="color: #339933;">-></span>block_size<span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<span style="color: #339933;">*</span><span style="color: #009900;">(</span><span style="color: #993333;">void</span> <span style="color: #339933;">**</span><span style="color: #009900;">)</span> <span style="color: #009900;">(</span><span style="color: #009900;">(</span><span style="color: #993333;">uint8_t</span> <span style="color: #339933;">*</span><span style="color: #009900;">)</span> p <span style="color: #339933;">+</span> mp<span style="color: #339933;">-></span>block_size<span style="color: #009900;">)</span> <span style="color: #339933;">=</span> MEMORY_POOL_ALLOCED_CONST<span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">return</span> p<span style="color: #339933;">;</span><br />
<span style="color: #009900;">}</span> <span style="color: #b1b100;">else</span><br />
<span style="color: #009900;">{</span><br />
<span style="color: #b1b100;">return</span> NULL<span style="color: #339933;">;</span><br />
<span style="color: #009900;">}</span><br />
<span style="color: #009900;">}</span><br />
<br />
<span style="color: #993333;">void</span> memory_pool_free<span style="color: #009900;">(</span>memory_pool_t <span style="color: #339933;">*</span>mp<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>p<span style="color: #009900;">)</span><br />
<span style="color: #009900;">{</span><br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">(</span>p <span style="color: #339933;">&&</span> <span style="color: #009900;">(</span>p <span style="color: #339933;">>=</span> mp<span style="color: #339933;">-></span>pool<span style="color: #009900;">)</span> <span style="color: #339933;">&&</span> <span style="color: #009900;">(</span>p <span style="color: #339933;"><=</span> <span style="color: #009900;">(</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">)</span> <span style="color: #009900;">(</span><span style="color: #009900;">(</span><span style="color: #993333;">uint8_t</span> <span style="color: #339933;">*</span><span style="color: #009900;">)</span> mp<span style="color: #339933;">-></span>pool <span style="color: #339933;">+</span><br />
<span style="color: #009900;">(</span>mp<span style="color: #339933;">-></span>block_size <span style="color: #339933;">+</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">(</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span> <span style="color: #339933;">*</span> mp<span style="color: #339933;">-></span>count<span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><br />
<span style="color: #009900;">{</span><br />
<span style="color: #339933;">*</span><span style="color: #009900;">(</span><span style="color: #993333;">void</span> <span style="color: #339933;">**</span><span style="color: #009900;">)</span> <span style="color: #009900;">(</span><span style="color: #009900;">(</span><span style="color: #993333;">uint8_t</span> <span style="color: #339933;">*</span><span style="color: #009900;">)</span> p <span style="color: #339933;">+</span> mp<span style="color: #339933;">-></span>block_size<span style="color: #009900;">)</span> <span style="color: #339933;">=</span> mp<span style="color: #339933;">-></span>empty_blocks<span style="color: #339933;">;</span><br />
mp<span style="color: #339933;">-></span>empty_blocks <span style="color: #339933;">=</span> p<span style="color: #339933;">;</span><br />
<span style="color: #009900;">}</span><br />
<span style="color: #009900;">}</span><br />
<br />
<br />
<span style="color: #993333;">void</span> print_intptr<span style="color: #009900;">(</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span>p<span style="color: #009900;">)</span><br />
<span style="color: #009900;">{</span><br />
<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html" style="color: #000060;"><span style="color: #000066;">printf</span></a><span style="color: #009900;">(</span><span style="color: red;">"%d"</span><span style="color: #339933;">,</span> <span style="color: #339933;">*</span><span style="color: #009900;">(</span><span style="color: #993333;">int</span> <span style="color: #339933;">*</span><span style="color: #009900;">)</span> p<span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">}</span><br />
<br />
<span style="color: #993333;">int</span> main<span style="color: #009900;">(</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>argv<span style="color: #009900;">[</span><span style="color: #009900;">]</span><span style="color: #009900;">)</span><br />
<span style="color: #009900;">{</span><br />
<span style="color: #993333;">int</span> <span style="color: #339933;">*</span>value<span style="color: #339933;">;</span><br />
<span style="color: #993333;">int</span> c <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span><br />
<br />
memory_pool_t <span style="color: #339933;">*</span>mp <span style="color: #339933;">=</span> memory_pool_create<span style="color: #009900;">(</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">(</span><span style="color: #993333;">int</span><span style="color: #009900;">)</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">128</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<br />
memory_pool_dump<span style="color: #009900;">(</span>mp<span style="color: #339933;">,</span> print_intptr<span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">while</span> <span style="color: #009900;">(</span><span style="color: #009900;">(</span>value <span style="color: #339933;">=</span> memory_pool_alloc<span style="color: #009900;">(</span>mp<span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><br />
<span style="color: #009900;">{</span><br />
<span style="color: #339933;">*</span>value <span style="color: #339933;">=</span> c<span style="color: #339933;">++;</span><br />
<span style="color: #009900;">}</span><br />
<br />
memory_pool_dump<span style="color: #009900;">(</span>mp<span style="color: #339933;">,</span> print_intptr<span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<br />
memory_pool_destroy<span style="color: #009900;">(</span>mp<span style="color: #009900;">)</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">return</span> EXIT_SUCCESS<span style="color: #339933;">;</span><br />
<span style="color: #009900;">}</span><br />
</div>Lrrrhttp://www.blogger.com/profile/03345827308117973929noreply@blogger.com0tag:blogger.com,1999:blog-8406013214929984658.post-35444336146160146862011-11-09T06:48:00.000-08:002011-11-09T06:48:01.890-08:00Sine function using inline assembly<pre style='color:#000000;background:#ffffff;'><span style='color:#800000; font-weight:bold; '>static</span> <span style='color:#800000; font-weight:bold; '>inline</span> <span style='color:#800000; font-weight:bold; '>float</span> <span style='color:#603000; '>sin</span><span style='color:#808030; '>(</span><span style='color:#800000; font-weight:bold; '>float</span> angle<span style='color:#808030; '>)</span>
<span style='color:#800080; '>{</span>
<span style='color:#800000; font-weight:bold; '>float</span> answer<span style='color:#800080; '>;</span>
<span style='color:#004a43; '>asm</span> <span style='color:#808030; '>(</span><span style='color:#0000e6; '>"fsin"</span> <span style='color:#808030; '>:</span> <span style='color:#0000e6; '>"=t"</span> <span style='color:#808030; '>(</span>answer<span style='color:#808030; '>)</span> <span style='color:#808030; '>:</span> <span style='color:#0000e6; '>"0"</span> <span style='color:#808030; '>(</span>angle<span style='color:#808030; '>)</span><span style='color:#808030; '>)</span><span style='color:#808030; '>;</span>
<span style='color:#800000; font-weight:bold; '>return</span> answer<span style='color:#800080; '>;</span>
<span style='color:#800080; '>}</span>
</pre>Lrrrhttp://www.blogger.com/profile/03345827308117973929noreply@blogger.com0tag:blogger.com,1999:blog-8406013214929984658.post-16620131102769304802011-05-27T15:01:00.000-07:002011-05-27T15:01:02.706-07:00Saving debug symbols to separate file<span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;"></span><br />
<pre class="lang-c prettyprint" style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 0px; max-height: 600px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; vertical-align: baseline; width: auto;"><code style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">objcopy </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">--</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">only</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">-</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">keep</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">-</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">debug </span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"${tostripfile}"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"${debugdir}/${debugfile}"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
strip </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">--</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">strip</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">-</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">debug </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">--</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">strip</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">-</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">unneeded </span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"${tostripfile}"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
objcopy </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">--</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">add</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">-</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">gnu</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">-</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">debuglink</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">=</span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"${debugdir}/${debugfile}"</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">"${tostripfile}"</span></code></pre><br />
<br />
--<br />
source: <a href="http://stackoverflow.com/questions/866721/how-to-generate-gcc-debug-symbol-outside-the-build-target">stackoverflow</a>Lrrrhttp://www.blogger.com/profile/03345827308117973929noreply@blogger.com0tag:blogger.com,1999:blog-8406013214929984658.post-60319940549433815612010-11-25T05:16:00.000-08:002010-11-25T05:16:58.243-08:00Linux sockets example<style>
/* Pretty printing styles. Used with prettify.js. */
.str { color: #080; }
.kwd { color: #008; }
.com { color: #800; }
.typ { color: #606; }
.lit { color: #066; }
.pun { color: #660; }
.pln { color: #000; }
.tag { color: #008; }
.atn { color: #606; }
.atv { color: #080; }
.dec { color: #606; }
pre.prettyprint { padding: 2px; border: 1px solid #888 }
/* Specify class=linenums on a pre to get line numbering */
ol.linenums { margin-top: 0; margin-bottom: 0 } /* IE indents via margin-left */
li.L0,
li.L1,
li.L2,
li.L3,
li.L5,
li.L6,
li.L7,
li.L8 { list-style-type: none }
/* Alternate shading for lines */
li.L1,
li.L3,
li.L5,
li.L7,
li.L9 { background: #eee }
@media print {
.str { color: #060; }
.kwd { color: #006; font-weight: bold; }
.com { color: #600; font-style: italic; }
.typ { color: #404; font-weight: bold; }
.lit { color: #044; }
.pun { color: #440; }
.pln { color: #000; }
.tag { color: #006; font-weight: bold; }
.atn { color: #404; }
.atv { color: #060; }
}
</style><span class="pln"><br />
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><stdlib.h></span><span class="pln"><br />
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><stdio.h></span><span class="pln"><br />
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><string.h></span><span class="pln"><br />
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><ctype.h></span><span class="pln"><br />
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><unistd.h></span><span class="pln"><br />
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><errno.h></span><span class="pln"><br />
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><fcntl.h></span><span class="pln"><br />
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><sys/types.h></span><span class="pln"><br />
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><sys/socket.h></span><span class="pln"><br />
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><arpa/inet.h></span><span class="pln"><br />
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><sys/epoll.h></span><span class="pln"><br />
<br />
<br />
</span><span class="com">#define</span><span class="pln"> EPOLL_ARRAY_SIZE </span><span class="lit">64</span><span class="pln"><br />
<br />
<br />
</span><span class="kwd">void</span><span class="pln"> sprint_buffer</span><span class="pun">(</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">char</span><span class="pln"> </span><span class="pun">*</span><span class="pln">buffer</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> size</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
</span><span class="kwd">int</span><span class="pln"> i</span><span class="pun">;</span><span class="pln"><br />
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun"><</span><span class="pln"> size</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isprint</span><span class="pun">(</span><span class="pln">buffer</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]))</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"%c"</span><span class="pun">,</span><span class="pln"> buffer</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]);</span><span class="pln"><br />
</span><span class="kwd">else</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"\\0x%02X"</span><span class="pun">,</span><span class="pln"> buffer</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]);</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
<br />
</span><span class="kwd">int</span><span class="pln"> main</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> argc</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">char</span><span class="pln"> </span><span class="pun">*</span><span class="pln">argv</span><span class="pun">[])</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
</span><span class="kwd">int</span><span class="pln"> sd</span><span class="pun">,</span><span class="pln"> efd</span><span class="pun">,</span><span class="pln"> clientsd</span><span class="pun">,</span><span class="pln"> fd</span><span class="pun">;</span><span class="pln"><br />
</span><span class="kwd">struct</span><span class="pln"> sockaddr_in bindaddr</span><span class="pun">,</span><span class="pln"> peeraddr</span><span class="pun">;</span><span class="pln"><br />
socklen_t salen </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">peeraddr</span><span class="pun">);</span><span class="pln"><br />
</span><span class="kwd">int</span><span class="pln"> pollsize </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"><br />
</span><span class="kwd">struct</span><span class="pln"> epoll_event ev</span><span class="pun">;</span><span class="pln"><br />
</span><span class="kwd">struct</span><span class="pln"> epoll_event epoll_events</span><span class="pun">[</span><span class="pln">EPOLL_ARRAY_SIZE</span><span class="pun">];</span><span class="pln"><br />
uint32_t events</span><span class="pun">;</span><span class="pln"><br />
</span><span class="kwd">unsigned</span><span class="pln"> </span><span class="kwd">short</span><span class="pln"> port </span><span class="pun">=</span><span class="pln"> </span><span class="lit">20000</span><span class="pun">;</span><span class="pln"><br />
</span><span class="kwd">int</span><span class="pln"> i</span><span class="pun">,</span><span class="pln"> rval</span><span class="pun">,</span><span class="pln"> on </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"><br />
ssize_t rc</span><span class="pun">;</span><span class="pln"><br />
</span><span class="kwd">char</span><span class="pln"> buffer</span><span class="pun">[</span><span class="lit">1024</span><span class="pun">];</span><span class="pln"><br />
<br />
<br />
efd </span><span class="pun">=</span><span class="pln"> epoll_create</span><span class="pun">(</span><span class="pln">pollsize</span><span class="pun">);</span><span class="pln"><br />
<br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">efd </span><span class="pun"><</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"Could not create the epoll fd: %m"</span><span class="pun">);</span><span class="pln"><br />
</span><span class="kwd">return</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
<br />
sd </span><span class="pun">=</span><span class="pln"> socket</span><span class="pun">(</span><span class="pln">AF_INET</span><span class="pun">,</span><span class="pln"> SOCK_STREAM</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln"><br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">sd </span><span class="pun"><</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"Could not create new socket: %m\n"</span><span class="pun">);</span><span class="pln"><br />
</span><span class="kwd">return</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
<br />
printf</span><span class="pun">(</span><span class="str">"New socket created with sd %d\n"</span><span class="pun">,</span><span class="pln"> sd</span><span class="pun">);</span><span class="pln"><br />
<br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">fcntl</span><span class="pun">(</span><span class="pln">sd</span><span class="pun">,</span><span class="pln"> F_SETFL</span><span class="pun">,</span><span class="pln"> O_NONBLOCK</span><span class="pun">))</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"Could not make the socket non-blocking: %m\n"</span><span class="pun">);</span><span class="pln"><br />
close</span><span class="pun">(</span><span class="pln">sd</span><span class="pun">);</span><span class="pln"><br />
</span><span class="kwd">return</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
<br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">setsockopt</span><span class="pun">(</span><span class="pln">sd</span><span class="pun">,</span><span class="pln"> SOL_SOCKET</span><span class="pun">,</span><span class="pln"> SO_REUSEADDR</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&</span><span class="pln">on</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">on</span><span class="pun">)))</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"Could not set socket %d option for reusability: %m\n"</span><span class="pun">,</span><span class="pln"> sd</span><span class="pun">);</span><span class="pln"><br />
close</span><span class="pun">(</span><span class="pln">sd</span><span class="pun">);</span><span class="pln"><br />
</span><span class="kwd">return</span><span class="pln"> </span><span class="lit">4</span><span class="pun">;</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
<br />
bindaddr</span><span class="pun">.</span><span class="pln">sin_addr</span><span class="pun">.</span><span class="pln">s_addr </span><span class="pun">=</span><span class="pln"> htonl</span><span class="pun">(</span><span class="pln">INADDR_ANY</span><span class="pun">);</span><span class="pln"><br />
bindaddr</span><span class="pun">.</span><span class="pln">sin_family</span><span class="pun">=</span><span class="pln"> AF_INET</span><span class="pun">;</span><span class="pln"><br />
bindaddr</span><span class="pun">.</span><span class="pln">sin_port </span><span class="pun">=</span><span class="pln"> htons</span><span class="pun">(</span><span class="pln">port</span><span class="pun">);</span><span class="pln"><br />
<br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">bind</span><span class="pun">(</span><span class="pln">sd</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">struct</span><span class="pln"> sockaddr </span><span class="pun">*)</span><span class="pln"> </span><span class="pun">&</span><span class="pln">bindaddr</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="kwd">struct</span><span class="pln"> sockaddr_in</span><span class="pun">))</span><span class="pln"> </span><span class="pun"><</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"Could not bind socket %d to address 'INADDR_ANY' and port %u: %m"</span><span class="pun">,</span><span class="pln"> sd</span><span class="pun">,</span><span class="pln"> port</span><span class="pun">);</span><span class="pln"><br />
close</span><span class="pun">(</span><span class="pln">sd</span><span class="pun">);</span><span class="pln"><br />
</span><span class="kwd">return</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
</span><span class="kwd">else</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"Bound socket %d to address 'INADDR_ANY' and port %u\n"</span><span class="pun">,</span><span class="pln"> sd</span><span class="pun">,</span><span class="pln"> port</span><span class="pun">);</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
<br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">listen</span><span class="pun">(</span><span class="pln">sd</span><span class="pun">,</span><span class="pln"> SOMAXCONN</span><span class="pun">))</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"Could not start listening on server socket %d: %m\n"</span><span class="pun">,</span><span class="pln"> sd</span><span class="pun">);</span><span class="pln"><br />
</span><span class="kwd">goto</span><span class="pln"> cleanup</span><span class="pun">;</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
</span><span class="kwd">else</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"Server socket %d started listening to address 'INADDR_ANY' and port %u\n"</span><span class="pun">,</span><span class="pln"> sd</span><span class="pun">,</span><span class="pln"> port</span><span class="pun">);</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
<br />
ev</span><span class="pun">.</span><span class="pln">events </span><span class="pun">=</span><span class="pln"> EPOLLIN</span><span class="pun">;</span><span class="pln"><br />
ev</span><span class="pun">.</span><span class="pln">data</span><span class="pun">.</span><span class="pln">u64 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0LL</span><span class="pun">;</span><span class="pln"><br />
ev</span><span class="pun">.</span><span class="pln">data</span><span class="pun">.</span><span class="pln">fd </span><span class="pun">=</span><span class="pln"> sd</span><span class="pun">;</span><span class="pln"><br />
<br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">epoll_ctl</span><span class="pun">(</span><span class="pln">efd</span><span class="pun">,</span><span class="pln"> EPOLL_CTL_ADD</span><span class="pun">,</span><span class="pln"> sd</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&</span><span class="pln">ev</span><span class="pun">)</span><span class="pln"> </span><span class="pun"><</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"Couldn't add server socket %d to epoll set: %m\n"</span><span class="pun">,</span><span class="pln"> sd</span><span class="pun">);</span><span class="pln"><br />
</span><span class="kwd">goto</span><span class="pln"> cleanup</span><span class="pun">;</span><span class="pln"> <br />
</span><span class="pun">}</span><span class="pln"><br />
<br />
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(;;)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"Starting epoll_wait on %d fds\n"</span><span class="pun">,</span><span class="pln"> pollsize</span><span class="pun">);</span><span class="pln"><br />
<br />
</span><span class="kwd">while</span><span class="pln"> </span><span class="pun">((</span><span class="pln">rval </span><span class="pun">=</span><span class="pln"> epoll_wait</span><span class="pun">(</span><span class="pln">efd</span><span class="pun">,</span><span class="pln"> epoll_events</span><span class="pun">,</span><span class="pln"> EPOLL_ARRAY_SIZE</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">))</span><span class="pln"> </span><span class="pun"><</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">rval </span><span class="pun"><</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&&</span><span class="pln"> </span><span class="pun">(</span><span class="pln">errno </span><span class="pun">!=</span><span class="pln"> EINTR</span><span class="pun">))</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"EPoll on %d fds failed: %m\n"</span><span class="pun">,</span><span class="pln"> pollsize</span><span class="pun">);</span><span class="pln"><br />
</span><span class="kwd">goto</span><span class="pln"> cleanup</span><span class="pun">;</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
<br />
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun"><</span><span class="pln"> rval</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
events </span><span class="pun">=</span><span class="pln"> epoll_events</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="pln">events</span><span class="pun">;</span><span class="pln"><br />
fd </span><span class="pun">=</span><span class="pln"> epoll_events</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="pln">data</span><span class="pun">.</span><span class="pln">fd</span><span class="pun">;</span><span class="pln"><br />
<br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">events </span><span class="pun">&</span><span class="pln"> EPOLLERR</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">fd </span><span class="pun">==</span><span class="pln"> sd</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"EPoll on %d fds failed: %m\n"</span><span class="pun">,</span><span class="pln"> pollsize</span><span class="pun">);</span><span class="pln"><br />
</span><span class="kwd">goto</span><span class="pln"> cleanup</span><span class="pun">;</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"Closing socket with sd %d\n"</span><span class="pun">,</span><span class="pln"> fd</span><span class="pun">);</span><span class="pln"><br />
shutdown</span><span class="pun">(</span><span class="pln">fd</span><span class="pun">,</span><span class="pln"> SHUT_RDWR</span><span class="pun">);</span><span class="pln"><br />
close</span><span class="pun">(</span><span class="pln">fd</span><span class="pun">);</span><span class="pln"><br />
</span><span class="kwd">continue</span><span class="pun">;</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
<br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">events </span><span class="pun">&</span><span class="pln"> EPOLLHUP</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">fd </span><span class="pun">==</span><span class="pln"> sd</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"EPoll on %d fds failed: %m\n"</span><span class="pun">,</span><span class="pln"> pollsize</span><span class="pun">);</span><span class="pln"><br />
</span><span class="kwd">goto</span><span class="pln"> cleanup</span><span class="pun">;</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"Closing socket with sd %d\n"</span><span class="pun">,</span><span class="pln"> fd</span><span class="pun">);</span><span class="pln"><br />
shutdown</span><span class="pun">(</span><span class="pln">fd</span><span class="pun">,</span><span class="pln"> SHUT_RDWR</span><span class="pun">);</span><span class="pln"><br />
close</span><span class="pun">(</span><span class="pln">fd</span><span class="pun">);</span><span class="pln"><br />
</span><span class="kwd">continue</span><span class="pun">;</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
<br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">events </span><span class="pun">&</span><span class="pln"> EPOLLRDHUP</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">fd </span><span class="pun">==</span><span class="pln"> sd</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"EPoll on %d fds failed: %m\n"</span><span class="pun">,</span><span class="pln"> pollsize</span><span class="pun">);</span><span class="pln"><br />
</span><span class="kwd">goto</span><span class="pln"> cleanup</span><span class="pun">;</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"Closing socket with sd %d\n"</span><span class="pun">,</span><span class="pln"> fd</span><span class="pun">);</span><span class="pln"><br />
shutdown</span><span class="pun">(</span><span class="pln">fd</span><span class="pun">,</span><span class="pln"> SHUT_RDWR</span><span class="pun">);</span><span class="pln"><br />
close</span><span class="pun">(</span><span class="pln">fd</span><span class="pun">);</span><span class="pln"><br />
</span><span class="kwd">continue</span><span class="pun">;</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
<br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">events </span><span class="pun">&</span><span class="pln"> EPOLLOUT</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">fd </span><span class="pun">!=</span><span class="pln"> sd</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
rc </span><span class="pun">=</span><span class="pln"> snprintf</span><span class="pun">(</span><span class="pln">buffer</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">buffer</span><span class="pun">),</span><span class="pln"> </span><span class="str">"Hello socket %d from server socket %d!\n"</span><span class="pun">,</span><span class="pln"> fd</span><span class="pun">,</span><span class="pln"> sd</span><span class="pun">);</span><span class="pln"><br />
</span><span class="kwd">while</span><span class="pln"> </span><span class="pun">((</span><span class="pln">rc </span><span class="pun">=</span><span class="pln"> send</span><span class="pun">(</span><span class="pln">fd</span><span class="pun">,</span><span class="pln"> buffer</span><span class="pun">,</span><span class="pln"> rc</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">))</span><span class="pln"> </span><span class="pun"><</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">fd </span><span class="pun"><</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&&</span><span class="pln"> </span><span class="pun">(</span><span class="pln">errno </span><span class="pun">!=</span><span class="pln"> EINTR</span><span class="pun">))</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"Send to socket %d failed: %m\n"</span><span class="pun">,</span><span class="pln"> fd</span><span class="pun">);</span><span class="pln"><br />
pollsize</span><span class="pun">--;</span><span class="pln"><br />
shutdown</span><span class="pun">(</span><span class="pln">fd</span><span class="pun">,</span><span class="pln"> SHUT_RDWR</span><span class="pun">);</span><span class="pln"><br />
close</span><span class="pun">(</span><span class="pln">fd</span><span class="pun">);</span><span class="pln"><br />
</span><span class="kwd">continue</span><span class="pun">;</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
<br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">rc </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"Closing socket with sd %d\n"</span><span class="pun">,</span><span class="pln"> fd</span><span class="pun">);</span><span class="pln"><br />
pollsize</span><span class="pun">--;</span><span class="pln"><br />
shutdown</span><span class="pun">(</span><span class="pln">fd</span><span class="pun">,</span><span class="pln"> SHUT_RDWR</span><span class="pun">);</span><span class="pln"><br />
close</span><span class="pun">(</span><span class="pln">fd</span><span class="pun">);</span><span class="pln"><br />
</span><span class="kwd">continue</span><span class="pun">;</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">rc </span><span class="pun">></span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"Sent '"</span><span class="pun">);</span><span class="pln"><br />
sprint_buffer</span><span class="pun">(</span><span class="pln">buffer</span><span class="pun">,</span><span class="pln"> rc</span><span class="pun">);</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"' to socket with sd %d\n"</span><span class="pun">,</span><span class="pln"> fd</span><span class="pun">);</span><span class="pln"><br />
<br />
ev</span><span class="pun">.</span><span class="pln">events </span><span class="pun">=</span><span class="pln"> EPOLLIN</span><span class="pun">;</span><span class="pln"><br />
ev</span><span class="pun">.</span><span class="pln">data</span><span class="pun">.</span><span class="pln">u64 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0LL</span><span class="pun">;</span><span class="pln"><br />
ev</span><span class="pun">.</span><span class="pln">data</span><span class="pun">.</span><span class="pln">fd </span><span class="pun">=</span><span class="pln"> fd</span><span class="pun">;</span><span class="pln"><br />
<br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">epoll_ctl</span><span class="pun">(</span><span class="pln">efd</span><span class="pun">,</span><span class="pln"> EPOLL_CTL_MOD</span><span class="pun">,</span><span class="pln"> fd</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&</span><span class="pln">ev</span><span class="pun">)</span><span class="pln"> </span><span class="pun"><</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"Couldn't modify client socket %d in epoll set: %m\n"</span><span class="pun">,</span><span class="pln"> fd</span><span class="pun">);</span><span class="pln"><br />
</span><span class="kwd">goto</span><span class="pln"> cleanup</span><span class="pun">;</span><span class="pln"> <br />
</span><span class="pun">}</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
<br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">events </span><span class="pun">&</span><span class="pln"> EPOLLIN</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">fd </span><span class="pun">==</span><span class="pln"> sd</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
</span><span class="kwd">while</span><span class="pln"> </span><span class="pun">((</span><span class="pln">clientsd </span><span class="pun">=</span><span class="pln"> accept</span><span class="pun">(</span><span class="pln">sd</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">struct</span><span class="pln"> sockaddr </span><span class="pun">*)</span><span class="pln"> </span><span class="pun">&</span><span class="pln">peeraddr</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&</span><span class="pln">salen</span><span class="pun">))</span><span class="pln"> </span><span class="pun"><</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">clientsd </span><span class="pun"><</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&&</span><span class="pln"> </span><span class="pun">(</span><span class="pln">errno </span><span class="pun">!=</span><span class="pln"> EINTR</span><span class="pun">))</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"Accept on socket %d failed: %m\n"</span><span class="pun">,</span><span class="pln"> sd</span><span class="pun">);</span><span class="pln"><br />
</span><span class="kwd">goto</span><span class="pln"> cleanup</span><span class="pun">;</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
<br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">inet_ntop</span><span class="pun">(</span><span class="pln">AF_INET</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&</span><span class="pln">peeraddr</span><span class="pun">.</span><span class="pln">sin_addr</span><span class="pun">.</span><span class="pln">s_addr</span><span class="pun">,</span><span class="pln"> buffer</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">buffer</span><span class="pun">))</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> NULL</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"Accepted connection from %s:%u, assigned new sd %d\n"</span><span class="pun">,</span><span class="pln"> buffer</span><span class="pun">,</span><span class="pln"> ntohs</span><span class="pun">(</span><span class="pln">peeraddr</span><span class="pun">.</span><span class="pln">sin_port</span><span class="pun">),</span><span class="pln"> clientsd</span><span class="pun">);</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"Failed to convert address from binary to text form: %m\n"</span><span class="pun">);</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
<br />
ev</span><span class="pun">.</span><span class="pln">events </span><span class="pun">=</span><span class="pln"> EPOLLIN</span><span class="pun">;</span><span class="pln"><br />
ev</span><span class="pun">.</span><span class="pln">data</span><span class="pun">.</span><span class="pln">u64 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0LL</span><span class="pun">;</span><span class="pln"><br />
ev</span><span class="pun">.</span><span class="pln">data</span><span class="pun">.</span><span class="pln">fd </span><span class="pun">=</span><span class="pln"> clientsd</span><span class="pun">;</span><span class="pln"> <br />
<br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">epoll_ctl</span><span class="pun">(</span><span class="pln">efd</span><span class="pun">,</span><span class="pln"> EPOLL_CTL_ADD</span><span class="pun">,</span><span class="pln"> clientsd</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&</span><span class="pln">ev</span><span class="pun">)</span><span class="pln"> </span><span class="pun"><</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"Couldn't add client socket %d to epoll set: %m\n"</span><span class="pun">,</span><span class="pln"> clientsd</span><span class="pun">);</span><span class="pln"><br />
</span><span class="kwd">goto</span><span class="pln"> cleanup</span><span class="pun">;</span><span class="pln"> <br />
</span><span class="pun">}</span><span class="pln"><br />
<br />
pollsize</span><span class="pun">++;</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
</span><span class="kwd">while</span><span class="pln"> </span><span class="pun">((</span><span class="pln">rc </span><span class="pun">=</span><span class="pln"> recv</span><span class="pun">(</span><span class="pln">fd</span><span class="pun">,</span><span class="pln"> buffer</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">buffer</span><span class="pun">),</span><span class="pln"> </span><span class="lit">0</span><span class="pun">))</span><span class="pln"> </span><span class="pun"><</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">fd </span><span class="pun"><</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&&</span><span class="pln"> </span><span class="pun">(</span><span class="pln">errno </span><span class="pun">!=</span><span class="pln"> EINTR</span><span class="pun">))</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"Receive from socket %d failed: %m\n"</span><span class="pun">,</span><span class="pln"> fd</span><span class="pun">);</span><span class="pln"><br />
pollsize</span><span class="pun">--;</span><span class="pln"><br />
shutdown</span><span class="pun">(</span><span class="pln">fd</span><span class="pun">,</span><span class="pln"> SHUT_RDWR</span><span class="pun">);</span><span class="pln"><br />
close</span><span class="pun">(</span><span class="pln">fd</span><span class="pun">);</span><span class="pln"><br />
</span><span class="kwd">continue</span><span class="pun">;</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
<br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">rc </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"Closing socket with sd %d\n"</span><span class="pun">,</span><span class="pln"> fd</span><span class="pun">);</span><span class="pln"><br />
pollsize</span><span class="pun">--;</span><span class="pln"><br />
shutdown</span><span class="pun">(</span><span class="pln">fd</span><span class="pun">,</span><span class="pln"> SHUT_RDWR</span><span class="pun">);</span><span class="pln"><br />
close</span><span class="pun">(</span><span class="pln">fd</span><span class="pun">);</span><span class="pln"><br />
</span><span class="kwd">continue</span><span class="pun">;</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">rc </span><span class="pun">></span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"Received '"</span><span class="pun">);</span><span class="pln"><br />
sprint_buffer</span><span class="pun">(</span><span class="pln">buffer</span><span class="pun">,</span><span class="pln"> rc</span><span class="pun">);</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"' from socket with sd %d\n"</span><span class="pun">,</span><span class="pln"> fd</span><span class="pun">);</span><span class="pln"><br />
<br />
ev</span><span class="pun">.</span><span class="pln">events </span><span class="pun">=</span><span class="pln"> EPOLLIN </span><span class="pun">|</span><span class="pln"> EPOLLOUT</span><span class="pun">;</span><span class="pln"><br />
ev</span><span class="pun">.</span><span class="pln">data</span><span class="pun">.</span><span class="pln">u64 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0LL</span><span class="pun">;</span><span class="pln"><br />
ev</span><span class="pun">.</span><span class="pln">data</span><span class="pun">.</span><span class="pln">fd </span><span class="pun">=</span><span class="pln"> fd</span><span class="pun">;</span><span class="pln"><br />
<br />
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">epoll_ctl</span><span class="pun">(</span><span class="pln">efd</span><span class="pun">,</span><span class="pln"> EPOLL_CTL_MOD</span><span class="pun">,</span><span class="pln"> fd</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&</span><span class="pln">ev</span><span class="pun">)</span><span class="pln"> </span><span class="pun"><</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"><br />
</span><span class="pun">{</span><span class="pln"><br />
printf</span><span class="pun">(</span><span class="str">"Couldn't modify client socket %d in epoll set: %m\n"</span><span class="pun">,</span><span class="pln"> fd</span><span class="pun">);</span><span class="pln"><br />
</span><span class="kwd">goto</span><span class="pln"> cleanup</span><span class="pun">;</span><span class="pln"> <br />
</span><span class="pun">}</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
</span><span class="pun">}</span><span class="pln"><br />
<br />
cleanup</span><span class="pun">:</span><span class="pln"><br />
shutdown</span><span class="pun">(</span><span class="pln">sd</span><span class="pun">,</span><span class="pln"> SHUT_RDWR</span><span class="pun">);</span><span class="pln"><br />
close</span><span class="pun">(</span><span class="pln">sd</span><span class="pun">);</span><span class="pln"><br />
<br />
</span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"><br />
</span><span class="pun">}</span>Lrrrhttp://www.blogger.com/profile/03345827308117973929noreply@blogger.com0tag:blogger.com,1999:blog-8406013214929984658.post-92083112779557869772010-11-24T14:07:00.000-08:002010-11-24T14:07:17.311-08:00Hello WorldI will post mostly technical, programming related stuff, that at some point later I could use as reference.Lrrrhttp://www.blogger.com/profile/03345827308117973929noreply@blogger.com1