1/* 2 * Copyright 2009, Haiku, Inc. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Michael Lotz <mmlr@mlotz.ch> 7 */ 8 9#include "NetSender.h" 10 11#include "StreamingRingBuffer.h" 12 13#include <NetEndpoint.h> 14 15#include <stdio.h> 16#include <stdlib.h> 17#include <string.h> 18 19#define TRACE(x...) /*debug_printf("NetSender: " x)*/ 20#define TRACE_ERROR(x...) debug_printf("NetSender: " x) 21 22 23NetSender::NetSender(BNetEndpoint *endpoint, StreamingRingBuffer *source) 24 : 25 fEndpoint(endpoint), 26 fSource(source), 27 fSenderThread(-1), 28 fStopThread(false) 29{ 30 fSenderThread = spawn_thread(_NetworkSenderEntry, "network sender", 31 B_NORMAL_PRIORITY, this); 32 resume_thread(fSenderThread); 33} 34 35 36NetSender::~NetSender() 37{ 38 fStopThread = true; 39 40 suspend_thread(fSenderThread); 41 resume_thread(fSenderThread); 42} 43 44 45int32 46NetSender::_NetworkSenderEntry(void *data) 47{ 48 return ((NetSender *)data)->_NetworkSender(); 49} 50 51 52status_t 53NetSender::_NetworkSender() 54{ 55 while (!fStopThread) { 56 uint8 buffer[4096]; 57 int32 readSize = fSource->Read(buffer, sizeof(buffer), true); 58 if (readSize < 0) { 59 TRACE_ERROR("read failed, stopping sender thread: %s\n", 60 strerror(readSize)); 61 return readSize; 62 } 63 64 while (readSize > 0) { 65 int32 sendSize = fEndpoint->Send(buffer, readSize); 66 if (sendSize < 0) { 67 TRACE_ERROR("sending data failed: %s\n", strerror(sendSize)); 68 return sendSize; 69 } 70 71 readSize -= sendSize; 72 } 73 } 74 75 return B_OK; 76} 77