Browse Source

Updated to the latest Octane. (#2817)

* Updated to the latest Octane code. Implemented a JSON endpoint.

* Added new memory allocator support.

* Added dynamic content-length.

* Updated thread count to match hardware core count.
Simon Guindon 8 years ago
parent
commit
cddfbb4b9a

+ 17 - 1
frameworks/C/octane/CMakeLists.txt

@@ -2,6 +2,21 @@ cmake_minimum_required(VERSION 2.6)
 include(CMakeToolsHelpers OPTIONAL)
 include(CMakeToolsHelpers OPTIONAL)
 include("common.cmake")
 include("common.cmake")
 
 
+project(octane C CXX)
+
+set(CMAKE_BUILD_TYPE RelWithDebInfo)
+set (CMAKE_CXX_STANDARD 14)
+
+add_definitions(-std=gnu99)
+#add_definitions(-msse4.1)
+add_definitions(-mavx)
+add_definitions(-pedantic)
+add_definitions(-O3)
+add_definitions(-Wall)
+add_definitions(-Wextra)
+add_definitions(-Wcast-align)
+add_definitions(-w)
+
 # ----------------------------------------
 # ----------------------------------------
 # Benchmark service
 # Benchmark service
 # ----------------------------------------
 # ----------------------------------------
@@ -17,6 +32,7 @@ list(SORT TECHEMPOWER_BENCHMARKS_SOURCES)
 create_source_group("Source Files" "${CMAKE_CURRENT_SOURCE_DIR}/src" ${TECHEMPOWER_BENCHMARKS_SOURCES})
 create_source_group("Source Files" "${CMAKE_CURRENT_SOURCE_DIR}/src" ${TECHEMPOWER_BENCHMARKS_SOURCES})
 include_directories(${CMAKE_SOURCE_DIR}/lib/octane/lib/libuv/include)
 include_directories(${CMAKE_SOURCE_DIR}/lib/octane/lib/libuv/include)
 include_directories(${CMAKE_SOURCE_DIR}/lib/octane/lib/sds)
 include_directories(${CMAKE_SOURCE_DIR}/lib/octane/lib/sds)
+include_directories(${CMAKE_SOURCE_DIR}/lib/octane/lib/rapidjson/include)
 include_directories(${CMAKE_SOURCE_DIR}/lib/octane/include)
 include_directories(${CMAKE_SOURCE_DIR}/lib/octane/include)
 include_directories(${CMAKE_SOURCE_DIR}/include)
 include_directories(${CMAKE_SOURCE_DIR}/include)
 
 
@@ -32,5 +48,5 @@ target_link_libraries (techempower_benchmarks
     ${CMAKE_THREAD_LIBS_INIT})
     ${CMAKE_THREAD_LIBS_INIT})
 
 
 if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
 if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
-    target_link_libraries (hello_world rt)
+    target_link_libraries (techempower_benchmarks rt)
 endif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
 endif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")

+ 48 - 7
frameworks/C/octane/Makefile

@@ -1,5 +1,11 @@
 projectpath = ${CURDIR}
 projectpath = ${CURDIR}
-octane_path = ${projectpath}/lib/octane
+libuv_path = ${projectpath}/lib/libuv
+wrk_path = ${projectpath}/lib/wrk
+wrk2_path = ${projectpath}/lib/wrk2
+sds_path = ${projectpath}/lib/sds
+rapidjson_path = ${projectpath}/lib/rapidjson
+lockless_path = ${projectpath}/lib/lockless_allocator
+tcmalloc_path = ${projectpath}/lib/tcmalloc
 
 
 ifeq ($(OS),Windows_NT)
 ifeq ($(OS),Windows_NT)
 		OPERATING_SYSTEM = WINDOWS
 		OPERATING_SYSTEM = WINDOWS
@@ -49,11 +55,46 @@ osx: deps
 
 
 xcode: deps
 xcode: deps
 	if [ ! -d "build" ]; then mkdir -p build; fi
 	if [ ! -d "build" ]; then mkdir -p build; fi
-	if [ ! -d "build/techempower_benchmarks.xcodeproj" ]; then cd build;cmake -DCMAKE_OSX_ARCHITECTURES=x86_64 -G Xcode ..; fi
-	cd build;xcodebuild -project techempower_benchmarks.xcodeproj/
+	if [ ! -d "build/octane.xcodeproj" ]; then cd build;cmake -DCMAKE_OSX_ARCHITECTURES=x86_64 -G Xcode ..; fi
+	cd build;xcodebuild -project octane.xcodeproj/
 
 
-$(octane_path)/build/liboctane.a:
-	if [ ! -d "$(octane_path)" ]; then git clone https://github.com/simongui/octane.git $(octane_path); fi
-	cd $(octane_path);make
+linux: deps $(lockless_path)
+	rm -rf build
+	mkdir -p build
+	cd build;cmake ..
+	cd build;make VERBOSE=1
 
 
-deps: $(octane_path)/build/liboctane.a
+$(libuv_path)/.libs/libuv.a:
+	if [ ! -d "$(libuv_path)" ]; then git clone https://github.com/libuv/libuv.git $(libuv_path); fi
+	cd $(libuv_path);sh autogen.sh
+	cd $(libuv_path);./configure
+	cd $(libuv_path);make
+
+$(wrk_path)/wrk:
+	if [ ! -d "$(wrk_path)" ]; then git clone https://github.com/wg/wrk.git $(wrk_path); fi
+	cd $(wrk_path);make
+
+$(wrk2_path)/wrk:
+	if [ ! -d "$(wrk2_path)" ]; then git clone https://github.com/giltene/wrk2.git $(wrk2_path); fi
+	cd $(wrk2_path);make
+
+$(sds_path):
+	if [ ! -d "$(sds_path)" ]; then git clone https://github.com/antirez/sds $(sds_path); fi
+
+$(rapidjson_path):
+	if [ ! -d "$(rapidjson_path)" ]; then git clone https://github.com/miloyip/rapidjson.git $(rapidjson_path); fi
+
+$(tcmalloc_path):
+	if [ ! -d "$(tcmalloc_path)" ]; then git clone https://github.com/gperftools/gperftools.git $(tcmalloc_path); fi
+	cd $(tcmalloc_path);./autogen.sh
+	cd $(tcmalloc_path);./configure
+	cd $(tcmalloc_path);make
+
+$(lockless_path):
+	if [ ! -d "$(lockless_path)" ]; then wget https://locklessinc.com/downloads/lockless_allocator_src.tgz -P lib; fi
+	cd lib;tar xvzf lockless_allocator_src.tgz
+	cd lib/lockless_allocator;make
+
+tools: $(wrk_path)/wrk $(wrk2_path)/wrk
+
+deps: $(libuv_path)/.libs/libuv.a $(sds_path) $(rapidjson_path) $(tcmalloc_path)

+ 2 - 1
frameworks/C/octane/benchmark_config.json

@@ -3,7 +3,8 @@
   "tests": [{
   "tests": [{
     "default": {
     "default": {
       "setup_file": "setup",
       "setup_file": "setup",
-      "plaintext_url": "/",
+      "plaintext_url": "/plaintext",
+      "json_url": "/json",
       "port": 8000,
       "port": 8000,
       "approach": "Realistic",
       "approach": "Realistic",
       "classification": "Platform",
       "classification": "Platform",

+ 1 - 1
frameworks/C/octane/setup.sh

@@ -2,4 +2,4 @@
 
 
 fw_depends octane
 fw_depends octane
 
 
-hello_world 8000 40 &
+LD_PRELOAD="$OCTANE_HOME/lib/lockless_allocator/libllalloc.so.1.3" techempower_benchmarks &

+ 0 - 5
frameworks/C/octane/src/common.h

@@ -1,5 +0,0 @@
-#pragma once
-
-#define memory_error(fmt, ...) do { \
-        fprintf(stderr, "%s: %s (%d): not enough memory: " fmt "\n", __FILE__, __FUNCTION__, __LINE__, ## __VA_ARGS__); \
-} while (0)

+ 0 - 16
frameworks/C/octane/src/connection.c

@@ -1,16 +0,0 @@
-#include <stdlib.h>
-#include <octane.h>
-#include "connection.h"
-
-connection* create_connection()
-{
-    connection* conn = calloc(1, sizeof(connection));
-    conn->bytes_remaining = 0;
-    conn->request_length = 0;
-    conn->keep_alive = true;
-    return conn;
-}
-
-void free_connection(connection* conn) {
-    free(conn);
-}

+ 0 - 25
frameworks/C/octane/src/connection.h

@@ -1,25 +0,0 @@
-#pragma once
-
-#include <stdbool.h>
-
-typedef struct
-{
-    uv_tcp_t stream;
-    enum {OPEN, CLOSING, CLOSED} state;
-    void* data;
-    bool keep_alive;
-    int bytes_remaining;
-    int request_length;
-} connection;
-
-typedef enum {
-    OK,
-    SIZE_EXCEEDED,
-    BAD_REQUEST,
-    INTERNAL_ERROR
-} request_state;
-
-connection* create_connection();
-void free_connection(connection* conn);
-
-char* current_time;

+ 0 - 171
frameworks/C/octane/src/program.c

@@ -1,171 +0,0 @@
-#include <stdio.h>
-#include <uv.h>
-#include <stdlib.h>
-#include <octane.h>
-#include <time.h>
-#include "common.h"
-#include "connection.h"
-#include "responders/static_responder.h"
-#include "responders/sds_responder.h"
-#include "responders/nobuffer_responder.h"
-
-typedef struct {
-  uv_write_t req;
-  uv_buf_t buf;
-} write_req_t;
-
-void stream_on_connect(uv_stream_t* stream, int status);
-void stream_on_alloc(uv_handle_t* client, size_t suggested_size, uv_buf_t* buf);
-void stream_on_read(uv_stream_t* tcp, ssize_t nread, const uv_buf_t* buf);
-void timer_callback(uv_timer_t* timer);
-
-void (*stream_on_read_func)(connection* conn, size_t requests, uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf);
-
-uv_timer_t timer;
-
-int main(int args, char **argsv) {
-    //stream_on_read_func = &stream_on_read_static;
-    stream_on_read_func = &stream_on_read_sds;
-    //stream_on_read_func = &stream_on_read_nobuffer;
-
-    uv_async_t* service_handle = 0;
-    uv_loop_t* loop = uv_default_loop();
-
-    uv_timer_init(loop, &timer);
-    uv_timer_start(&timer, timer_callback, 0, 500);
-
-    uv_multi_listen("0.0.0.0", 8000, false, 40, DISPATCH_TYPE_REUSEPORT, loop, 128, stream_on_connect);
-}
-
-void send_error_response(connection* conn, request_state state) {
-
-}
-
-void stream_on_close(uv_handle_t* handle)
-{
-    uv_handle_t* stream = handle;
-    connection* conn = stream->data;
-
-    if (conn->state != CLOSED) {
-        conn->state = CLOSED;
-        connection* conn = (connection*)handle->data;
-        free_connection(conn);
-    }
-}
-
-void stream_close_connection(connection* conn) {
-    if (conn->state == OPEN) {
-        conn->state = CLOSING;
-        uv_close(&conn->stream, stream_on_close);
-    }
-}
-
-void handle_request_error(connection* conn, request_state state)
-{
-    uv_handle_t* stream = &conn->stream;
-
-    if (conn->state == OPEN) {
-        uv_read_stop(stream);
-    }
-
-    conn->keep_alive = false;
-
-    if (conn->state == OPEN) {
-        /* Send the error message back. */
-        send_error_response(conn, state);
-    } else {
-        stream_close_connection(conn);
-    }
-}
-
-void handle_bad_request(connection* conn)
-{
-    handle_request_error(conn, BAD_REQUEST);
-}
-
-void handle_buffer_exceeded_error(connection* conn)
-{
-    handle_request_error(conn, SIZE_EXCEEDED);
-}
-
-void handle_internal_error(connection* conn)
-{
-    handle_request_error(conn, INTERNAL_ERROR);
-}
-
-void stream_on_shutdown(uv_shutdown_t* req, int status)
-{
-    connection* conn = req->data;
-    uv_handle_t* stream = &conn->stream;
-    if (conn->state == OPEN) {
-        stream_close_connection(conn);
-    }
-    free(req);
-}
-
-void stream_on_connect(uv_stream_t* server_stream, int status) {
-    /* TODO: Use the return values from uv_accept() and uv_read_start() */
-    int rc = 0;
-
-    connection* conn = create_connection();
-    rc = uv_tcp_init(server_stream->loop, (uv_stream_t*)&conn->stream);
-    conn->bytes_remaining = 0;
-    conn->request_length = 0;
-    conn->stream.data = conn;
-
-    rc = uv_accept(server_stream, (uv_stream_t*)&conn->stream);
-    uv_read_start((uv_stream_t*)&conn->stream, stream_on_alloc, stream_on_read);
-}
-
-void stream_on_alloc(uv_handle_t* client, size_t suggested_size, uv_buf_t* buf) {
-    char* buffer;
-    if(!(buffer = malloc(suggested_size))){
-        memory_error("Unable to allocate buffer of size %d", suggested_size);
-    }
-    *buf = uv_buf_init(buffer, suggested_size);
-}
-
-void stream_on_read(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) {
-    connection* conn = stream->data;
-
-    if (nread > 0) {
-        if (conn->request_length == 0) {
-            // We need to seek the first request to find out how many characters each request is.
-            for (int i = 1; i < nread; i++) {
-                if (buf->base[i] == '\r' && buf->base[i - 1] == '\n') {
-                    conn->request_length = i + 2;
-                    break;
-                }
-            }
-        }
-
-        ssize_t requests = (nread + conn->bytes_remaining) / conn->request_length;
-        conn->bytes_remaining = conn->bytes_remaining + (nread % conn->request_length);
-
-        stream_on_read_func(conn, requests, stream, nread, buf);
-    }
-    else if (nread == UV_ENOBUFS) {
-        handle_buffer_exceeded_error(conn);
-    }
-    else if (nread == UV_EOF){
-        uv_shutdown_t* req = malloc(sizeof(uv_shutdown_t));
-        req->data = conn;
-        uv_shutdown(req, &conn->stream, stream_on_shutdown);
-    }
-    else if (nread == UV_ECONNRESET || nread == UV_ECONNABORTED) {
-        /* Let's close the connection as the other peer just disappeared */
-        stream_close_connection(conn);
-    } else {
-        /* We didn't see this coming, but an unexpected UV error code was passed in, so we'll
-         * respond with a blanket 500 error if we can */
-        handle_internal_error(conn);
-    }
-    free(buf->base);
-}
-
-void timer_callback(uv_timer_t* timer) {
-    time_t curtime;
-    time(&curtime);
-    char* time = ctime(&curtime);
-    current_time = time;
-}

+ 49 - 0
frameworks/C/octane/src/program.cpp

@@ -0,0 +1,49 @@
+#include <stdio.h>
+#include <uv.h>
+#include <stdbool.h>
+#include <octane.h>
+#include "responders/sds_responder.hpp"
+
+void timer_callback(uv_timer_t* timer);
+
+void on_request(http_connection* connection, http_request** requests, int number_of_requests);
+
+char* current_time;
+uv_timer_t timer;
+
+int main(int argc, char *argv[]) {
+    http_listener* listener = new_http_listener();
+    uv_timer_init(listener->loop, &timer);
+    uv_timer_start(&timer, timer_callback, 0, 500);
+
+    begin_listening(listener, "0.0.0.0", 8000, false, 40, 128, NULL, NULL, NULL, on_request);
+
+    printf("Listening...\n");
+}
+
+void on_request(http_connection* connection, http_request** requests, int number_of_requests) {
+    write_batch* batch = create_write_batch(number_of_requests);
+
+    for (int i=0; i<number_of_requests; i++) {
+        if (requests[i]->path[1] == 'p') {
+            create_plaintext_response_sds(batch);
+        } else if (requests[i]->path[1] == 'j') {
+            create_json_response_sds(batch);
+        }
+    }
+    if (http_connection_is_writable(connection)) {
+        // TODO: Use the return values from uv_write()
+        int rc = http_connection_write(connection, batch);
+    } else {
+        // TODO: Handle closing the stream.
+    }
+
+    free_http_requests(requests, number_of_requests);
+}
+
+void timer_callback(uv_timer_t* timer) {
+    time_t curtime;
+    time(&curtime);
+    char* time = ctime(&curtime);
+    current_time = time;
+}

+ 0 - 54
frameworks/C/octane/src/responders/nobuffer_responder.c

@@ -1,54 +0,0 @@
-#include <stdlib.h>
-#include <uv.h>
-#include "nobuffer_responder.h"
-#include "../write_batch.h"
-
-void create_response_nobuffer(write_batch* batch) {
-    batch->buffers[batch->number_of_used_buffers].base = "HTTP/1.1 200 OK\r\n";
-    batch->buffers[batch->number_of_used_buffers].len = 17;
-    batch->number_of_used_buffers++;
-
-    batch->buffers[batch->number_of_used_buffers].base = "Server: octane\r\n";
-    batch->buffers[batch->number_of_used_buffers].len = 28;
-    batch->number_of_used_buffers++;
-
-    batch->buffers[batch->number_of_used_buffers].base = "Content-Type: text/plain\r\n";
-    batch->buffers[batch->number_of_used_buffers].len = 26;
-    batch->number_of_used_buffers++;
-
-    batch->buffers[batch->number_of_used_buffers].base = "Content-Length: 15\r\n";
-    batch->buffers[batch->number_of_used_buffers].len = 20;
-    batch->number_of_used_buffers++;
-
-    batch->buffers[batch->number_of_used_buffers].base = "Date: Mon Dec 12 00:00:00 2016\r\n";
-    batch->buffers[batch->number_of_used_buffers].len = 32;
-    batch->number_of_used_buffers++;
-
-    batch->buffers[batch->number_of_used_buffers].base = "\r\n";
-    batch->buffers[batch->number_of_used_buffers].len = 2;
-    batch->number_of_used_buffers++;
-
-    batch->buffers[batch->number_of_used_buffers].base = "Hello, World!\n\n";
-    batch->buffers[batch->number_of_used_buffers].len = 15;
-    batch->number_of_used_buffers++;
-}
-
-void stream_on_read_nobuffer(connection* conn, size_t requests, uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) {
-    uv_write_t *write_req = create_write_with_batch(requests * 7);
-    write_batch* batch = write_req->data;
-
-    for (int i=0; i<requests; i++) {
-        create_response_nobuffer(batch);
-    }
-
-    if (uv_is_writable(stream)) {
-        // TODO: Use the return values from uv_write()
-        int rc = uv_write(write_req, stream, batch->buffers, batch->number_of_used_buffers, after_write_nobuffer);
-    } else {
-        // TODO: Handle closing the stream.
-    }
-}
-
-void after_write_nobuffer(uv_write_t* req, int status) {
-    free(req);
-}

+ 0 - 9
frameworks/C/octane/src/responders/nobuffer_responder.h

@@ -1,9 +0,0 @@
-#pragma once
-
-#include <uv.h>
-#include "../connection.h"
-#include "../write_batch.h"
-
-void create_response_nobuffer(write_batch* batch);
-void stream_on_read_nobuffer(connection* conn, size_t requests, uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf);
-void after_write_nobuffer(uv_write_t* req, int status);

+ 0 - 47
frameworks/C/octane/src/responders/sds_responder.c

@@ -1,47 +0,0 @@
-#include <uv.h>
-#include <sds.h>
-#include "sds_responder.h"
-#include "../connection.h"
-#include "../write_batch.h"
-
-void create_response_sds(write_batch* batch) {
-    //sds response_buffer = sdsnew("HTTP/1.1 200 OK\r\nServer: octane/master\r\nContent-Type: text/plain\r\nContent-Length: 15\r\n");
-    //response_buffer = sdscat(response_buffer, "Date: Mon Dec 12 00:00:00 2016\r\n");
-    //response_buffer = sdscat(response_buffer, "\r\nHello, World!\n\n");
-
-    sds response_buffer = sdsnew("HTTP/1.1 200 OK\r\n");
-    response_buffer = sdscat(response_buffer, "Server: octane\r\n");
-    response_buffer = sdscat(response_buffer, "Content-Type: text/plain\r\n");
-    response_buffer = sdscat(response_buffer, "Content-Length: 15\r\n");
-    response_buffer = sdscatprintf(response_buffer, "Date: %s", current_time);
-    response_buffer = sdscat(response_buffer, "\r\nHello, World!\n\n");
-
-    batch->buffers[batch->number_of_used_buffers].base = response_buffer;
-    batch->buffers[batch->number_of_used_buffers].len = sdslen(response_buffer);
-    batch->number_of_used_buffers++;
-}
-
-void stream_on_read_sds(connection* conn, size_t requests, uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) {
-    uv_write_t *write_req = create_write_with_batch(requests);
-    write_batch* batch = write_req->data;
-
-    for (int i=0; i<requests; i++) {
-        create_response_sds(batch);
-    }
-
-    if (uv_is_writable(stream)) {
-        // TODO: Use the return values from uv_write()
-        int rc = uv_write(write_req, stream, batch->buffers, batch->number_of_used_buffers, after_write_sds);
-    } else {
-        // TODO: Handle closing the stream.
-    }
-}
-
-void after_write_sds(uv_write_t* req, int status) {
-    write_batch* batch = get_write_batch(req);
-    for (int i=0; i<batch->number_of_used_buffers; i++) {
-        sds buffer = batch->buffers[i].base;
-        sdsfree(buffer);
-    }
-    free(req);
-}

+ 42 - 0
frameworks/C/octane/src/responders/sds_responder.cpp

@@ -0,0 +1,42 @@
+#include <uv.h>
+#include "sds.h"
+#include "sds_responder.hpp"
+#include "rapidjson/writer.h"
+#include "rapidjson/stringbuffer.h"
+
+using namespace rapidjson;
+
+extern char* current_time;
+
+void create_plaintext_response_sds(write_batch* batch) {
+    sds response_buffer = sdsnew("HTTP/1.1 200 OK\r\n");
+    response_buffer = sdscat(response_buffer, "Server: octane\r\n");
+    response_buffer = sdscat(response_buffer, "Content-Type: text/plain\r\n");
+    response_buffer = sdscat(response_buffer, "Content-Length: 13\r\n");
+    response_buffer = sdscatprintf(response_buffer, "Date: %s\r\n", current_time);
+    response_buffer = sdscat(response_buffer, "Hello, World!");
+
+    batch->buffers[batch->number_of_used_buffers].base = response_buffer;
+    batch->buffers[batch->number_of_used_buffers].len = sdslen(response_buffer);
+    batch->number_of_used_buffers++;
+}
+
+void create_json_response_sds(write_batch* batch) {
+    StringBuffer s;
+    Writer<StringBuffer> writer(s);
+    writer.StartObject();
+    writer.Key("message");
+    writer.String("Hello, World!");
+    writer.EndObject();
+
+    sds response_buffer = sdsnew("HTTP/1.1 200 OK\r\n");
+    response_buffer = sdscat(response_buffer, "Server: octane\r\n");
+    response_buffer = sdscat(response_buffer, "Content-Type: application/json\r\n");
+    response_buffer = sdscatprintf(response_buffer, "Content-Length: %d\r\n", s.GetSize());
+    response_buffer = sdscatprintf(response_buffer, "Date: %s\r\n", current_time);
+    response_buffer = sdscat(response_buffer, s.GetString());
+
+    batch->buffers[batch->number_of_used_buffers].base = response_buffer;
+    batch->buffers[batch->number_of_used_buffers].len = sdslen(response_buffer);
+    batch->number_of_used_buffers++;
+}

+ 0 - 9
frameworks/C/octane/src/responders/sds_responder.h

@@ -1,9 +0,0 @@
-#pragma once
-
-#include <uv.h>
-#include "../connection.h"
-#include "../write_batch.h"
-
-void create_response_sds(write_batch* batch);
-void stream_on_read_sds(connection* conn, size_t requests, uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf);
-void after_write_sds(uv_write_t* req, int status);

+ 7 - 0
frameworks/C/octane/src/responders/sds_responder.hpp

@@ -0,0 +1,7 @@
+#pragma once
+
+#include <uv.h>
+#include "octane.h"
+
+void create_plaintext_response_sds(write_batch* batch);
+void create_json_response_sds(write_batch* batch);

+ 0 - 30
frameworks/C/octane/src/responders/static_responder.c

@@ -1,30 +0,0 @@
-#include <stdlib.h>
-#include <uv.h>
-#include "static_responder.h"
-
-void create_response_static(write_batch* batch) {
-    batch->buffers[batch->number_of_used_buffers].base = RESPONSE;
-    batch->buffers[batch->number_of_used_buffers].len = sizeof(RESPONSE);
-    batch->number_of_used_buffers++;
-}
-
-void stream_on_read_static(connection* conn, size_t requests, uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) {
-    uv_write_t *write_req = create_write_with_batch(requests);
-    write_batch* batch = write_req->data;
-
-    for (int i=0; i<requests; i++) {
-        create_response_static(batch);
-    }
-
-    if (uv_is_writable(stream)) {
-        // TODO: Use the return values from uv_write()
-        int rc = uv_write(write_req, stream, batch->buffers, batch->number_of_used_buffers, after_write_static);
-    } else {
-        // TODO: Handle closing the stream.
-    }
-}
-
-void after_write_static(uv_write_t* req, int status) {
-    free(req);
-}
-

+ 0 - 18
frameworks/C/octane/src/responders/static_responder.h

@@ -1,18 +0,0 @@
-#pragma once
-
-#include <uv.h>
-#include "../connection.h"
-#include "../write_batch.h"
-
-#define RESPONSE \
-    "HTTP/1.1 200 OK\r\n" \
-    "Server: octane\r\n" \
-    "Date: Mon Dec 12 00:00:00 2016\r\n" \
-    "Content-Type: text/plain\r\n" \
-    "Content-Length: 15\r\n" \
-    "\r\n" \
-    "Hello, World!\n"
-
-void create_response_static(write_batch* batch);
-void stream_on_read_static(connection* conn, size_t requests, uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf);
-void after_write_static(uv_write_t* req, int status);

+ 0 - 28
frameworks/C/octane/src/write_batch.c

@@ -1,28 +0,0 @@
-#include <stdlib.h>
-#include "write_batch.h"
-#include "common.h"
-
-uv_write_t* create_write_with_batch(size_t number_of_total_buffers) {
-    /*
-     * Allocate the 3 structures and array of buffers in one malloc call
-     * to reduce malloc() contention across CPU cores.
-     */
-    uv_write_t *write_req;
-    size_t bytes = sizeof(*write_req) + sizeof(write_batch) + (sizeof(uv_buf_t) * number_of_total_buffers);
-    if(!(write_req = (uv_write_t *) malloc(bytes))){
-        memory_error("Unable to allocate buffer of size %d", bytes);
-    }
-
-    write_batch* batch = get_write_batch(write_req);
-    batch->buffers = (uv_buf_t*)(batch + 1);
-    batch->number_of_used_buffers = 0;
-    batch->number_of_total_buffers = number_of_total_buffers;
-    write_req->data = batch;
-
-    return write_req;
-}
-
-write_batch* get_write_batch(uv_write_t* write_req) {
-    write_batch* batch = (write_batch*)(write_req + 1);
-    return batch;
-}

+ 0 - 12
frameworks/C/octane/src/write_batch.h

@@ -1,12 +0,0 @@
-#pragma once
-#include <stdlib.h>
-#include <uv.h>
-
-typedef struct {
-    uv_buf_t* buffers;
-    size_t number_of_used_buffers;
-    size_t number_of_total_buffers;
-}write_batch;
-
-uv_write_t* create_write_with_batch(size_t number_of_total_buffers);
-write_batch* get_write_batch(uv_write_t* write_req);

+ 2 - 2
toolset/setup/linux/frameworks/octane.sh

@@ -6,8 +6,8 @@ OCTANE_HOME=$IROOT/octane
 
 
 git clone https://github.com/simongui/octane.git
 git clone https://github.com/simongui/octane.git
 cd $OCTANE_HOME
 cd $OCTANE_HOME
-# December 21st, 2016
-git checkout 04c95e3ff650b9d8f06e84f9c135b7c6a9ad4eb6
+# May 22nd, 2017
+git checkout 8c28b1b83f1aa2817a401a3e8437a0af4ec53c28
 make
 make
 
 
 echo "export OCTANE_HOME=${OCTANE_HOME}" >> $IROOT/octane.installed
 echo "export OCTANE_HOME=${OCTANE_HOME}" >> $IROOT/octane.installed