1
Fork 0

Convert pipes::Buffer into a struct

This commit is contained in:
Erick Tryzelaar 2013-01-24 11:37:36 -08:00
parent feab095d65
commit 5085eb3c28
3 changed files with 34 additions and 5 deletions

View file

@ -140,10 +140,19 @@ pub fn BufferHeader() -> BufferHeader{
// This is for protocols to associate extra data to thread around. // This is for protocols to associate extra data to thread around.
#[doc(hidden)] #[doc(hidden)]
#[cfg(stage0)]
type Buffer<T: Owned> = { type Buffer<T: Owned> = {
header: BufferHeader, header: BufferHeader,
data: T, data: T,
}; };
#[doc(hidden)]
#[cfg(stage1)]
#[cfg(stage2)]
#[cfg(stage3)]
pub struct Buffer<T: Owned> {
header: BufferHeader,
data: T,
}
struct PacketHeader { struct PacketHeader {
mut state: State, mut state: State,
@ -230,6 +239,7 @@ pub fn mk_packet<T: Owned>() -> Packet<T> {
} }
#[doc(hidden)] #[doc(hidden)]
#[cfg(stage0)]
fn unibuffer<T: Owned>() -> ~Buffer<Packet<T>> { fn unibuffer<T: Owned>() -> ~Buffer<Packet<T>> {
let b = ~{ let b = ~{
header: BufferHeader(), header: BufferHeader(),
@ -245,6 +255,25 @@ fn unibuffer<T: Owned>() -> ~Buffer<Packet<T>> {
move b move b
} }
#[doc(hidden)]
#[cfg(stage1)]
#[cfg(stage2)]
#[cfg(stage3)]
fn unibuffer<T: Owned>() -> ~Buffer<Packet<T>> {
let b = ~Buffer {
header: BufferHeader(),
data: Packet {
header: PacketHeader(),
payload: None,
}
};
unsafe {
b.data.header.buffer = reinterpret_cast(&b);
}
move b
}
#[doc(hidden)] #[doc(hidden)]
pub fn packet<T: Owned>() -> *Packet<T> { pub fn packet<T: Owned>() -> *Packet<T> {
let b = unibuffer(); let b = unibuffer();

View file

@ -357,10 +357,10 @@ impl protocol: gen_init {
fn gen_init_bounded(ext_cx: ext_ctxt) -> @ast::expr { fn gen_init_bounded(ext_cx: ext_ctxt) -> @ast::expr {
debug!("gen_init_bounded"); debug!("gen_init_bounded");
let buffer_fields = self.gen_buffer_init(ext_cx); let buffer_fields = self.gen_buffer_init(ext_cx);
let buffer = quote_expr!( let buffer = quote_expr!(~::pipes::Buffer {
~{header: ::pipes::BufferHeader(), header: ::pipes::BufferHeader(),
data: $buffer_fields} data: $buffer_fields,
); });
let entangle_body = ext_cx.block_expr( let entangle_body = ext_cx.block_expr(
ext_cx.block( ext_cx.block(

View file

@ -27,7 +27,7 @@ mod pingpong {
}; };
pub fn init() -> (client::ping, server::ping) { pub fn init() -> (client::ping, server::ping) {
let buffer = ~{ let buffer = ~Buffer {
header: BufferHeader(), header: BufferHeader(),
data: { data: {
ping: mk_packet::<ping>(), ping: mk_packet::<ping>(),