mirror of
https://github.com/wassname/ray.git
synced 2026-08-09 12:20:09 +08:00
Make Ray code C++ compatible (#321)
* convert Ray to C++ * const correctness
This commit is contained in:
committed by
Alexey Tumanov
parent
ad4b03bf7f
commit
793a102846
+16
-14
@@ -6,6 +6,8 @@ include(${CMAKE_CURRENT_LIST_DIR}/cmake/Common.cmake)
|
||||
|
||||
add_subdirectory(redis_module)
|
||||
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
|
||||
|
||||
include_directories(thirdparty/ae)
|
||||
|
||||
add_custom_target(
|
||||
@@ -14,26 +16,26 @@ add_custom_target(
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/thirdparty/hiredis)
|
||||
|
||||
add_library(common STATIC
|
||||
event_loop.c
|
||||
common.c
|
||||
task.c
|
||||
io.c
|
||||
net.c
|
||||
logging.c
|
||||
state/redis.c
|
||||
state/table.c
|
||||
state/object_table.c
|
||||
state/task_table.c
|
||||
state/db_client_table.c
|
||||
state/actor_notification_table.c
|
||||
state/local_scheduler_table.c
|
||||
event_loop.cc
|
||||
common.cc
|
||||
task.cc
|
||||
io.cc
|
||||
net.cc
|
||||
logging.cc
|
||||
state/redis.cc
|
||||
state/table.cc
|
||||
state/object_table.cc
|
||||
state/task_table.cc
|
||||
state/db_client_table.cc
|
||||
state/actor_notification_table.cc
|
||||
state/local_scheduler_table.cc
|
||||
thirdparty/ae/ae.c
|
||||
thirdparty/sha256.c)
|
||||
|
||||
target_link_libraries(common "${CMAKE_CURRENT_LIST_DIR}/thirdparty/hiredis/libhiredis.a")
|
||||
|
||||
function(define_test test_name library)
|
||||
add_executable(${test_name} test/${test_name}.c ${ARGN})
|
||||
add_executable(${test_name} test/${test_name}.cc ${ARGN})
|
||||
add_dependencies(${test_name} hiredis flatbuffers_ep)
|
||||
target_link_libraries(${test_name} common ${FLATBUFFERS_STATIC_LIB} ${library})
|
||||
target_compile_options(${test_name} PUBLIC "-DPLASMA_TEST -DLOCAL_SCHEDULER_TEST -DCOMMON_TEST -DRAY_COMMON_LOG_LEVEL=4 -DRAY_TIMEOUT=50")
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
extern "C" {
|
||||
#ifdef _WIN32
|
||||
/* Quirks mean that Windows version needs to be included differently */
|
||||
#include <hiredis/hiredis.h>
|
||||
@@ -10,6 +11,7 @@
|
||||
#else
|
||||
#include "ae/ae.h"
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Unique timer ID that will be generated when the timer is added to the
|
||||
* event loop. Will not be reused later on in another call
|
||||
|
||||
@@ -348,7 +348,7 @@ disconnected:
|
||||
return 0;
|
||||
}
|
||||
|
||||
void write_log_message(int fd, char *message) {
|
||||
void write_log_message(int fd, const char *message) {
|
||||
/* Account for the \0 at the end of the string. */
|
||||
write_message(fd, LOG_MESSAGE, strlen(message) + 1, (uint8_t *) message);
|
||||
}
|
||||
+1
-1
@@ -174,7 +174,7 @@ int64_t read_buffer(int fd, int64_t *type, UT_array *buffer);
|
||||
/**
|
||||
* Write a null-terminated string to a file descriptor.
|
||||
*/
|
||||
void write_log_message(int fd, char *message);
|
||||
void write_log_message(int fd, const char *message);
|
||||
|
||||
void write_formatted_log_message(int fd, const char *format, ...);
|
||||
|
||||
|
||||
+1
-1
@@ -96,7 +96,7 @@ PyObject *PyTask_from_string(PyObject *self, PyObject *args) {
|
||||
}
|
||||
PyTask *result = PyObject_New(PyTask, &PyTaskType);
|
||||
result = (PyTask *) PyObject_Init((PyObject *) result, &PyTaskType);
|
||||
result->spec = malloc(size);
|
||||
result->spec = (task_spec *) malloc(size);
|
||||
memcpy(result->spec, data, size);
|
||||
/* TODO(pcm): Better error checking once we use flatbuffers. */
|
||||
if (size != task_spec_size(result->spec)) {
|
||||
+2
-1
@@ -7,7 +7,8 @@ void actor_notification_table_subscribe(
|
||||
void *subscribe_context,
|
||||
RetryInfo *retry) {
|
||||
ActorNotificationTableSubscribeData *sub_data =
|
||||
malloc(sizeof(ActorNotificationTableSubscribeData));
|
||||
(ActorNotificationTableSubscribeData *) malloc(
|
||||
sizeof(ActorNotificationTableSubscribeData));
|
||||
sub_data->subscribe_callback = subscribe_callback;
|
||||
sub_data->subscribe_context = subscribe_context;
|
||||
|
||||
@@ -9,11 +9,11 @@ void db_client_table_subscribe(
|
||||
db_client_table_done_callback done_callback,
|
||||
void *user_context) {
|
||||
DBClientTableSubscribeData *sub_data =
|
||||
malloc(sizeof(DBClientTableSubscribeData));
|
||||
(DBClientTableSubscribeData *) malloc(sizeof(DBClientTableSubscribeData));
|
||||
sub_data->subscribe_callback = subscribe_callback;
|
||||
sub_data->subscribe_context = subscribe_context;
|
||||
|
||||
init_table_callback(db_handle, NIL_ID, __func__, sub_data, retry,
|
||||
done_callback, redis_db_client_table_subscribe,
|
||||
user_context);
|
||||
(table_done_callback) done_callback,
|
||||
redis_db_client_table_subscribe, user_context);
|
||||
}
|
||||
+4
-2
@@ -7,7 +7,8 @@ void local_scheduler_table_subscribe(
|
||||
void *subscribe_context,
|
||||
RetryInfo *retry) {
|
||||
LocalSchedulerTableSubscribeData *sub_data =
|
||||
malloc(sizeof(LocalSchedulerTableSubscribeData));
|
||||
(LocalSchedulerTableSubscribeData *) malloc(
|
||||
sizeof(LocalSchedulerTableSubscribeData));
|
||||
sub_data->subscribe_callback = subscribe_callback;
|
||||
sub_data->subscribe_context = subscribe_context;
|
||||
|
||||
@@ -19,7 +20,8 @@ void local_scheduler_table_send_info(DBHandle *db_handle,
|
||||
LocalSchedulerInfo *info,
|
||||
RetryInfo *retry) {
|
||||
LocalSchedulerTableSendInfoData *data =
|
||||
malloc(sizeof(LocalSchedulerTableSendInfoData));
|
||||
(LocalSchedulerTableSendInfoData *) malloc(
|
||||
sizeof(LocalSchedulerTableSendInfoData));
|
||||
data->info = *info;
|
||||
|
||||
init_table_callback(db_handle, NIL_ID, __func__, data, retry, NULL,
|
||||
@@ -9,7 +9,8 @@ void object_table_lookup(DBHandle *db_handle,
|
||||
void *user_context) {
|
||||
CHECK(db_handle != NULL);
|
||||
init_table_callback(db_handle, object_id, __func__, NULL, retry,
|
||||
done_callback, redis_object_table_lookup, user_context);
|
||||
(table_done_callback) done_callback,
|
||||
redis_object_table_lookup, user_context);
|
||||
}
|
||||
|
||||
void object_table_add(DBHandle *db_handle,
|
||||
@@ -21,11 +22,13 @@ void object_table_add(DBHandle *db_handle,
|
||||
void *user_context) {
|
||||
CHECK(db_handle != NULL);
|
||||
|
||||
ObjectTableAddData *info = malloc(sizeof(ObjectTableAddData));
|
||||
ObjectTableAddData *info =
|
||||
(ObjectTableAddData *) malloc(sizeof(ObjectTableAddData));
|
||||
info->object_size = object_size;
|
||||
memcpy(&info->digest[0], digest, DIGEST_SIZE);
|
||||
init_table_callback(db_handle, object_id, __func__, info, retry,
|
||||
done_callback, redis_object_table_add, user_context);
|
||||
(table_done_callback) done_callback,
|
||||
redis_object_table_add, user_context);
|
||||
}
|
||||
|
||||
void object_table_remove(DBHandle *db_handle,
|
||||
@@ -38,11 +41,12 @@ void object_table_remove(DBHandle *db_handle,
|
||||
/* Copy the client ID, if one was provided. */
|
||||
DBClientID *client_id_copy = NULL;
|
||||
if (client_id != NULL) {
|
||||
client_id_copy = malloc(sizeof(DBClientID));
|
||||
client_id_copy = (DBClientID *) malloc(sizeof(DBClientID));
|
||||
*client_id_copy = *client_id;
|
||||
}
|
||||
init_table_callback(db_handle, object_id, __func__, client_id_copy, retry,
|
||||
done_callback, redis_object_table_remove, user_context);
|
||||
(table_done_callback) done_callback,
|
||||
redis_object_table_remove, user_context);
|
||||
}
|
||||
|
||||
void object_table_subscribe_to_notifications(
|
||||
@@ -54,14 +58,16 @@ void object_table_subscribe_to_notifications(
|
||||
object_table_lookup_done_callback done_callback,
|
||||
void *user_context) {
|
||||
CHECK(db_handle != NULL);
|
||||
ObjectTableSubscribeData *sub_data = malloc(sizeof(ObjectTableSubscribeData));
|
||||
ObjectTableSubscribeData *sub_data =
|
||||
(ObjectTableSubscribeData *) malloc(sizeof(ObjectTableSubscribeData));
|
||||
sub_data->object_available_callback = object_available_callback;
|
||||
sub_data->subscribe_context = subscribe_context;
|
||||
sub_data->subscribe_all = subscribe_all;
|
||||
|
||||
init_table_callback(
|
||||
db_handle, NIL_OBJECT_ID, __func__, sub_data, retry, done_callback,
|
||||
redis_object_table_subscribe_to_notifications, user_context);
|
||||
init_table_callback(db_handle, NIL_OBJECT_ID, __func__, sub_data, retry,
|
||||
(table_done_callback) done_callback,
|
||||
redis_object_table_subscribe_to_notifications,
|
||||
user_context);
|
||||
}
|
||||
|
||||
void object_table_request_notifications(DBHandle *db_handle,
|
||||
@@ -71,8 +77,9 @@ void object_table_request_notifications(DBHandle *db_handle,
|
||||
CHECK(db_handle != NULL);
|
||||
CHECK(num_object_ids > 0);
|
||||
ObjectTableRequestNotificationsData *data =
|
||||
malloc(sizeof(ObjectTableRequestNotificationsData) +
|
||||
num_object_ids * sizeof(ObjectID));
|
||||
(ObjectTableRequestNotificationsData *) malloc(
|
||||
sizeof(ObjectTableRequestNotificationsData) +
|
||||
num_object_ids * sizeof(ObjectID));
|
||||
data->num_object_ids = num_object_ids;
|
||||
memcpy(data->object_ids, object_ids, num_object_ids * sizeof(ObjectID));
|
||||
|
||||
@@ -86,12 +93,14 @@ void object_info_subscribe(DBHandle *db_handle,
|
||||
RetryInfo *retry,
|
||||
object_info_done_callback done_callback,
|
||||
void *user_context) {
|
||||
ObjectInfoSubscribeData *sub_data = malloc(sizeof(ObjectInfoSubscribeData));
|
||||
ObjectInfoSubscribeData *sub_data =
|
||||
(ObjectInfoSubscribeData *) malloc(sizeof(ObjectInfoSubscribeData));
|
||||
sub_data->subscribe_callback = subscribe_callback;
|
||||
sub_data->subscribe_context = subscribe_context;
|
||||
|
||||
init_table_callback(db_handle, NIL_OBJECT_ID, __func__, sub_data, retry,
|
||||
done_callback, redis_object_info_subscribe, user_context);
|
||||
(table_done_callback) done_callback,
|
||||
redis_object_info_subscribe, user_context);
|
||||
}
|
||||
|
||||
void result_table_add(DBHandle *db_handle,
|
||||
@@ -100,10 +109,11 @@ void result_table_add(DBHandle *db_handle,
|
||||
RetryInfo *retry,
|
||||
result_table_done_callback done_callback,
|
||||
void *user_context) {
|
||||
TaskID *task_id_copy = malloc(sizeof(TaskID));
|
||||
TaskID *task_id_copy = (TaskID *) malloc(sizeof(TaskID));
|
||||
memcpy(task_id_copy, task_id_arg.id, sizeof(*task_id_copy));
|
||||
init_table_callback(db_handle, object_id, __func__, task_id_copy, retry,
|
||||
done_callback, redis_result_table_add, user_context);
|
||||
(table_done_callback) done_callback,
|
||||
redis_result_table_add, user_context);
|
||||
}
|
||||
|
||||
void result_table_lookup(DBHandle *db_handle,
|
||||
@@ -112,5 +122,6 @@ void result_table_lookup(DBHandle *db_handle,
|
||||
result_table_lookup_callback done_callback,
|
||||
void *user_context) {
|
||||
init_table_callback(db_handle, object_id, __func__, NULL, retry,
|
||||
done_callback, redis_result_table_lookup, user_context);
|
||||
(table_done_callback) done_callback,
|
||||
redis_result_table_lookup, user_context);
|
||||
}
|
||||
@@ -4,9 +4,13 @@
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
extern "C" {
|
||||
/* Including hiredis here is necessary on Windows for typedefs used in ae.h. */
|
||||
#include "hiredis/hiredis.h"
|
||||
#include "hiredis/adapters/ae.h"
|
||||
}
|
||||
|
||||
#include "utstring.h"
|
||||
|
||||
#include "common.h"
|
||||
@@ -24,7 +24,8 @@ TableCallbackData *init_table_callback(DBHandle *db_handle,
|
||||
}
|
||||
CHECK(retry);
|
||||
/* Allocate and initialize callback data structure for object table */
|
||||
TableCallbackData *callback_data = malloc(sizeof(TableCallbackData));
|
||||
TableCallbackData *callback_data =
|
||||
(TableCallbackData *) malloc(sizeof(TableCallbackData));
|
||||
CHECKM(callback_data != NULL, "Memory allocation error!")
|
||||
callback_data->id = id;
|
||||
callback_data->label = label;
|
||||
@@ -6,10 +6,11 @@
|
||||
void task_table_get_task(DBHandle *db_handle,
|
||||
TaskID task_id,
|
||||
RetryInfo *retry,
|
||||
task_table_get_callback done_callback,
|
||||
task_table_get_callback get_callback,
|
||||
void *user_context) {
|
||||
init_table_callback(db_handle, task_id, __func__, NULL, retry, done_callback,
|
||||
redis_task_table_get_task, user_context);
|
||||
init_table_callback(db_handle, task_id, __func__, NULL, retry,
|
||||
(void *) get_callback, redis_task_table_get_task,
|
||||
user_context);
|
||||
}
|
||||
|
||||
void task_table_add_task(DBHandle *db_handle,
|
||||
@@ -18,7 +19,8 @@ void task_table_add_task(DBHandle *db_handle,
|
||||
task_table_done_callback done_callback,
|
||||
void *user_context) {
|
||||
init_table_callback(db_handle, Task_task_id(task), __func__, task, retry,
|
||||
done_callback, redis_task_table_add_task, user_context);
|
||||
(table_done_callback) done_callback,
|
||||
redis_task_table_add_task, user_context);
|
||||
}
|
||||
|
||||
void task_table_update(DBHandle *db_handle,
|
||||
@@ -27,7 +29,8 @@ void task_table_update(DBHandle *db_handle,
|
||||
task_table_done_callback done_callback,
|
||||
void *user_context) {
|
||||
init_table_callback(db_handle, Task_task_id(task), __func__, task, retry,
|
||||
done_callback, redis_task_table_update, user_context);
|
||||
(table_done_callback) done_callback,
|
||||
redis_task_table_update, user_context);
|
||||
}
|
||||
|
||||
void task_table_test_and_update(DBHandle *db_handle,
|
||||
@@ -38,14 +41,14 @@ void task_table_test_and_update(DBHandle *db_handle,
|
||||
task_table_get_callback done_callback,
|
||||
void *user_context) {
|
||||
TaskTableTestAndUpdateData *update_data =
|
||||
malloc(sizeof(TaskTableTestAndUpdateData));
|
||||
(TaskTableTestAndUpdateData *) malloc(sizeof(TaskTableTestAndUpdateData));
|
||||
update_data->test_state_bitmask = test_state_bitmask;
|
||||
update_data->update_state = update_state;
|
||||
/* Update the task entry's local scheduler with this client's ID. */
|
||||
update_data->local_scheduler_id = db_handle->client;
|
||||
init_table_callback(db_handle, task_id, __func__, update_data, retry,
|
||||
done_callback, redis_task_table_test_and_update,
|
||||
user_context);
|
||||
(table_done_callback) done_callback,
|
||||
redis_task_table_test_and_update, user_context);
|
||||
}
|
||||
|
||||
/* TODO(swang): A corresponding task_table_unsubscribe. */
|
||||
@@ -57,12 +60,14 @@ void task_table_subscribe(DBHandle *db_handle,
|
||||
RetryInfo *retry,
|
||||
task_table_done_callback done_callback,
|
||||
void *user_context) {
|
||||
TaskTableSubscribeData *sub_data = malloc(sizeof(TaskTableSubscribeData));
|
||||
TaskTableSubscribeData *sub_data =
|
||||
(TaskTableSubscribeData *) malloc(sizeof(TaskTableSubscribeData));
|
||||
sub_data->local_scheduler_id = local_scheduler_id;
|
||||
sub_data->state_filter = state_filter;
|
||||
sub_data->subscribe_callback = subscribe_callback;
|
||||
sub_data->subscribe_context = subscribe_context;
|
||||
|
||||
init_table_callback(db_handle, local_scheduler_id, __func__, sub_data, retry,
|
||||
done_callback, redis_task_table_subscribe, user_context);
|
||||
(table_done_callback) done_callback,
|
||||
redis_task_table_subscribe, user_context);
|
||||
}
|
||||
@@ -42,7 +42,7 @@ typedef void (*task_table_get_callback)(Task *task, void *user_context);
|
||||
void task_table_get_task(DBHandle *db,
|
||||
TaskID task_id,
|
||||
RetryInfo *retry,
|
||||
task_table_get_callback done_callback,
|
||||
task_table_get_callback get_callback,
|
||||
void *user_context);
|
||||
|
||||
/**
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
extern "C" {
|
||||
#include "sha256.h"
|
||||
}
|
||||
#include "utarray.h"
|
||||
|
||||
#include "task.h"
|
||||
@@ -114,14 +114,14 @@ Task *task_table_test_task;
|
||||
void task_table_test_fail_callback(UniqueID id,
|
||||
void *context,
|
||||
void *user_data) {
|
||||
event_loop *loop = user_data;
|
||||
event_loop *loop = (event_loop *) user_data;
|
||||
event_loop_stop(loop);
|
||||
}
|
||||
|
||||
int64_t task_table_delayed_add_task(event_loop *loop,
|
||||
int64_t id,
|
||||
void *context) {
|
||||
DBHandle *db = context;
|
||||
DBHandle *db = (DBHandle *) context;
|
||||
RetryInfo retry = {
|
||||
.num_retries = NUM_RETRIES,
|
||||
.timeout = TIMEOUT,
|
||||
@@ -138,7 +138,7 @@ void task_table_test_callback(Task *callback_task, void *user_data) {
|
||||
CHECK(Task_size(callback_task) == Task_size(task_table_test_task));
|
||||
CHECK(memcmp(callback_task, task_table_test_task, Task_size(callback_task)) ==
|
||||
0);
|
||||
event_loop *loop = user_data;
|
||||
event_loop *loop = (event_loop *) user_data;
|
||||
event_loop_stop(loop);
|
||||
}
|
||||
|
||||
@@ -15,8 +15,8 @@ TEST ipc_socket_test(void) {
|
||||
int socket_fd = bind_ipc_sock(socket_pathname, true);
|
||||
ASSERT(socket_fd >= 0);
|
||||
|
||||
char *test_string = "hello world";
|
||||
char *test_bytes = "another string";
|
||||
const char *test_string = "hello world";
|
||||
const char *test_bytes = "another string";
|
||||
pid_t pid = fork();
|
||||
if (pid == 0) {
|
||||
close(socket_fd);
|
||||
@@ -60,7 +60,7 @@ TEST long_ipc_socket_test(void) {
|
||||
for (int i = 0; i < 10000; i++) {
|
||||
utstring_printf(test_string, "hello world ");
|
||||
}
|
||||
char *test_bytes = "another string";
|
||||
const char *test_bytes = "another string";
|
||||
pid_t pid = fork();
|
||||
if (pid == 0) {
|
||||
close(socket_fd);
|
||||
@@ -46,7 +46,7 @@ void new_object_lookup_callback(ObjectID object_id, void *user_context) {
|
||||
.timeout = 100,
|
||||
.fail_callback = new_object_fail_callback,
|
||||
};
|
||||
DBHandle *db = user_context;
|
||||
DBHandle *db = (DBHandle *) user_context;
|
||||
result_table_lookup(db, new_object_id, &retry, new_object_done_callback,
|
||||
NULL);
|
||||
}
|
||||
@@ -57,7 +57,7 @@ void new_object_task_callback(TaskID task_id, void *user_context) {
|
||||
.timeout = 100,
|
||||
.fail_callback = new_object_fail_callback,
|
||||
};
|
||||
DBHandle *db = user_context;
|
||||
DBHandle *db = (DBHandle *) user_context;
|
||||
result_table_add(db, new_object_id, new_object_task_id, &retry,
|
||||
new_object_lookup_callback, (void *) db);
|
||||
}
|
||||
@@ -246,7 +246,7 @@ TEST subscribe_timeout_test(void) {
|
||||
int64_t reconnect_context_callback(event_loop *loop,
|
||||
int64_t timer_id,
|
||||
void *context) {
|
||||
DBHandle *db = context;
|
||||
DBHandle *db = (DBHandle *) context;
|
||||
/* Reconnect to redis. This is not reconnecting the pub/sub channel. */
|
||||
redisAsyncFree(db->context);
|
||||
redisFree(db->sync_context);
|
||||
@@ -304,7 +304,7 @@ void add_lookup_done_callback(ObjectID object_id,
|
||||
}
|
||||
|
||||
void add_lookup_callback(ObjectID object_id, void *user_context) {
|
||||
DBHandle *db = user_context;
|
||||
DBHandle *db = (DBHandle *) user_context;
|
||||
RetryInfo retry = {
|
||||
.num_retries = 5,
|
||||
.timeout = 100,
|
||||
@@ -352,7 +352,7 @@ void add_remove_lookup_done_callback(ObjectID object_id,
|
||||
}
|
||||
|
||||
void add_remove_lookup_callback(ObjectID object_id, void *user_context) {
|
||||
DBHandle *db = user_context;
|
||||
DBHandle *db = (DBHandle *) user_context;
|
||||
RetryInfo retry = {
|
||||
.num_retries = 5,
|
||||
.timeout = 100,
|
||||
@@ -363,7 +363,7 @@ void add_remove_lookup_callback(ObjectID object_id, void *user_context) {
|
||||
}
|
||||
|
||||
void add_remove_callback(ObjectID object_id, void *user_context) {
|
||||
DBHandle *db = user_context;
|
||||
DBHandle *db = (DBHandle *) user_context;
|
||||
RetryInfo retry = {
|
||||
.num_retries = 5,
|
||||
.timeout = 100,
|
||||
@@ -406,7 +406,7 @@ int subscribe_retry_succeeded = 0;
|
||||
int64_t reconnect_sub_context_callback(event_loop *loop,
|
||||
int64_t timer_id,
|
||||
void *context) {
|
||||
DBHandle *db = context;
|
||||
DBHandle *db = (DBHandle *) context;
|
||||
/* Reconnect to redis. This is not reconnecting the pub/sub channel. */
|
||||
redisAsyncFree(db->sub_context);
|
||||
redisAsyncFree(db->context);
|
||||
@@ -777,7 +777,8 @@ void subscribe_object_available_later_object_available_callback(
|
||||
TEST subscribe_object_available_later_test(void) {
|
||||
int64_t data_size = 0xF1F0;
|
||||
subscribe_object_present_context_t *myctx =
|
||||
malloc(sizeof(subscribe_object_present_context_t));
|
||||
(subscribe_object_present_context_t *) malloc(
|
||||
sizeof(subscribe_object_present_context_t));
|
||||
myctx->teststr = subscribe_object_available_later_context;
|
||||
myctx->data_size = data_size;
|
||||
|
||||
@@ -27,7 +27,8 @@ void async_redis_socket_test_callback(redisAsyncContext *ac,
|
||||
void *privdata) {
|
||||
async_redis_socket_test_callback_called = 1;
|
||||
redisContext *context = redisConnect("127.0.0.1", 6379);
|
||||
redisReply *reply = redisCommand(context, test_get_format, test_key);
|
||||
redisReply *reply =
|
||||
(redisReply *) redisCommand(context, test_get_format, test_key);
|
||||
redisFree(context);
|
||||
CHECK(reply != NULL);
|
||||
if (strcmp(reply->str, test_value)) {
|
||||
@@ -55,10 +56,9 @@ TEST redis_socket_test(void) {
|
||||
close(socket_fd);
|
||||
unlink(socket_pathname);
|
||||
|
||||
redisReply *reply;
|
||||
reply = redisCommand(context, cmd, 0, 0);
|
||||
redisReply *reply = (redisReply *) redisCommand(context, cmd, 0, 0);
|
||||
freeReplyObject(reply);
|
||||
reply = redisCommand(context, "GET %s", test_key);
|
||||
reply = (redisReply *) redisCommand(context, "GET %s", test_key);
|
||||
ASSERT(reply != NULL);
|
||||
ASSERT_STR_EQ(reply->str, test_value);
|
||||
freeReplyObject(reply);
|
||||
@@ -69,7 +69,7 @@ TEST redis_socket_test(void) {
|
||||
}
|
||||
|
||||
void redis_read_callback(event_loop *loop, int fd, void *context, int events) {
|
||||
DBHandle *db = context;
|
||||
DBHandle *db = (DBHandle *) context;
|
||||
char *cmd = read_log_message(fd);
|
||||
redisAsyncCommand(db->context, async_redis_socket_test_callback, NULL, cmd);
|
||||
free(cmd);
|
||||
@@ -137,7 +137,7 @@ int logging_test_callback_called = 0;
|
||||
void logging_test_callback(redisAsyncContext *ac, void *r, void *privdata) {
|
||||
logging_test_callback_called = 1;
|
||||
redisContext *context = redisConnect("127.0.0.1", 6379);
|
||||
redisReply *reply = redisCommand(context, "KEYS %s", "log:*");
|
||||
redisReply *reply = (redisReply *) redisCommand(context, "KEYS %s", "log:*");
|
||||
redisFree(context);
|
||||
CHECK(reply != NULL);
|
||||
CHECK(reply->elements > 0);
|
||||
@@ -148,7 +148,7 @@ void logging_read_callback(event_loop *loop,
|
||||
int fd,
|
||||
void *context,
|
||||
int events) {
|
||||
DBHandle *conn = context;
|
||||
DBHandle *conn = (DBHandle *) context;
|
||||
char *cmd = read_log_message(fd);
|
||||
redisAsyncCommand(conn->context, logging_test_callback, NULL, cmd,
|
||||
(char *) conn->client.id, sizeof(conn->client.id));
|
||||
@@ -81,7 +81,7 @@ void add_success_callback(TaskID task_id, void *context) {
|
||||
add_success = 1;
|
||||
CHECK(TaskID_equal(task_id, Task_task_id(add_lookup_task)));
|
||||
|
||||
DBHandle *db = context;
|
||||
DBHandle *db = (DBHandle *) context;
|
||||
RetryInfo retry = {
|
||||
.num_retries = 5,
|
||||
.timeout = 1000,
|
||||
@@ -200,7 +200,7 @@ TEST publish_timeout_test(void) {
|
||||
int64_t reconnect_db_callback(event_loop *loop,
|
||||
int64_t timer_id,
|
||||
void *context) {
|
||||
DBHandle *db = context;
|
||||
DBHandle *db = (DBHandle *) context;
|
||||
/* Reconnect to redis. */
|
||||
redisAsyncFree(db->sub_context);
|
||||
db->sub_context = redisAsyncConnect("127.0.0.1", 6379);
|
||||
@@ -4,5 +4,5 @@ project(global_scheduler)
|
||||
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/../common/cmake/Common.cmake)
|
||||
|
||||
add_executable(global_scheduler global_scheduler.c global_scheduler_algorithm.c)
|
||||
add_executable(global_scheduler global_scheduler.cc global_scheduler_algorithm.cc)
|
||||
target_link_libraries(global_scheduler common ${HIREDIS_LIB})
|
||||
|
||||
@@ -64,7 +64,8 @@ void assign_task_to_local_scheduler(GlobalSchedulerState *state,
|
||||
GlobalSchedulerState *GlobalSchedulerState_init(event_loop *loop,
|
||||
const char *redis_addr,
|
||||
int redis_port) {
|
||||
GlobalSchedulerState *state = malloc(sizeof(GlobalSchedulerState));
|
||||
GlobalSchedulerState *state =
|
||||
(GlobalSchedulerState *) malloc(sizeof(GlobalSchedulerState));
|
||||
/* Must initialize state to 0. Sets hashmap head(s) to NULL. */
|
||||
memset(state, 0, sizeof(GlobalSchedulerState));
|
||||
state->db =
|
||||
@@ -184,7 +185,7 @@ void process_new_db_client(DBClientID db_client_id,
|
||||
/* Add plasma_manager ip:port -> local_scheduler_db_client_id association to
|
||||
* state. */
|
||||
AuxAddressEntry *plasma_local_scheduler_entry =
|
||||
calloc(1, sizeof(AuxAddressEntry));
|
||||
(AuxAddressEntry *) calloc(1, sizeof(AuxAddressEntry));
|
||||
plasma_local_scheduler_entry->aux_address = strdup(aux_address);
|
||||
plasma_local_scheduler_entry->local_scheduler_db_client_id = db_client_id;
|
||||
HASH_ADD_KEYPTR(plasma_local_scheduler_hh,
|
||||
@@ -319,7 +320,7 @@ void local_scheduler_table_handler(DBClientID client_id,
|
||||
}
|
||||
|
||||
int task_cleanup_handler(event_loop *loop, timer_id id, void *context) {
|
||||
GlobalSchedulerState *state = context;
|
||||
GlobalSchedulerState *state = (GlobalSchedulerState *) context;
|
||||
/* Loop over the pending tasks and resubmit them. */
|
||||
int64_t num_pending_tasks = utarray_len(state->pending_tasks);
|
||||
for (int64_t i = num_pending_tasks - 1; i >= 0; --i) {
|
||||
+2
-2
@@ -8,7 +8,7 @@
|
||||
|
||||
GlobalSchedulerPolicyState *GlobalSchedulerPolicyState_init(void) {
|
||||
GlobalSchedulerPolicyState *policy_state =
|
||||
malloc(sizeof(GlobalSchedulerPolicyState));
|
||||
(GlobalSchedulerPolicyState *) malloc(sizeof(GlobalSchedulerPolicyState));
|
||||
policy_state->round_robin_index = 0;
|
||||
|
||||
int num_weight_elem =
|
||||
@@ -131,7 +131,7 @@ ObjectSizeEntry *create_object_size_hashmap(GlobalSchedulerState *state,
|
||||
HASH_FIND_STR(object_size_table, object_location, s);
|
||||
if (NULL == s) {
|
||||
/* This location not yet known, so add this object location. */
|
||||
s = calloc(1, sizeof(ObjectSizeEntry));
|
||||
s = (ObjectSizeEntry *) calloc(1, sizeof(ObjectSizeEntry));
|
||||
s->object_location = object_location;
|
||||
HASH_ADD_KEYPTR(hh, object_size_table, s->object_location,
|
||||
strlen(s->object_location), s);
|
||||
@@ -5,6 +5,8 @@ project(local_scheduler)
|
||||
# Recursively include common
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/../common/cmake/Common.cmake)
|
||||
|
||||
add_definitions(-fPIC)
|
||||
|
||||
if(APPLE)
|
||||
SET(CMAKE_SHARED_LIBRARY_SUFFIX ".so")
|
||||
endif(APPLE)
|
||||
@@ -22,8 +24,8 @@ include_directories("${CMAKE_CURRENT_LIST_DIR}/../")
|
||||
include_directories("${CMAKE_CURRENT_LIST_DIR}/../plasma/")
|
||||
|
||||
add_library(local_scheduler_library SHARED
|
||||
local_scheduler_extension.c
|
||||
../common/lib/python/common_extension.c)
|
||||
local_scheduler_extension.cc
|
||||
../common/lib/python/common_extension.cc)
|
||||
|
||||
get_filename_component(PYTHON_SHARED_LIBRARY ${PYTHON_LIBRARIES} NAME)
|
||||
if(APPLE)
|
||||
@@ -31,14 +33,14 @@ if(APPLE)
|
||||
POST_BUILD COMMAND ${CMAKE_INSTALL_NAME_TOOL} -change ${PYTHON_SHARED_LIBRARY} ${PYTHON_LIBRARIES} liblocal_scheduler_library.so)
|
||||
endif(APPLE)
|
||||
|
||||
add_library(local_scheduler_client STATIC local_scheduler_client.c)
|
||||
add_library(local_scheduler_client STATIC local_scheduler_client.cc)
|
||||
|
||||
target_link_libraries(local_scheduler_library local_scheduler_client ${COMMON_LIB} ${PYTHON_LIBRARIES})
|
||||
|
||||
add_executable(local_scheduler local_scheduler.c local_scheduler_algorithm.c)
|
||||
add_executable(local_scheduler local_scheduler.cc local_scheduler_algorithm.cc)
|
||||
target_link_libraries(local_scheduler local_scheduler_client common ${HIREDIS_LIB} plasma_lib)
|
||||
|
||||
add_executable(local_scheduler_tests test/local_scheduler_tests.c local_scheduler.c local_scheduler_algorithm.c )
|
||||
add_executable(local_scheduler_tests test/local_scheduler_tests.cc local_scheduler.cc local_scheduler_algorithm.cc)
|
||||
target_link_libraries(local_scheduler_tests local_scheduler_client common ${HIREDIS_LIB} plasma_lib)
|
||||
target_compile_options(local_scheduler_tests PUBLIC "-DLOCAL_SCHEDULER_TEST")
|
||||
|
||||
|
||||
@@ -240,7 +240,7 @@ void start_worker(LocalSchedulerState *state, ActorID actor_id) {
|
||||
for (; state->config.start_worker_command[num_args] != NULL; ++num_args) {
|
||||
}
|
||||
const char **start_actor_worker_command =
|
||||
malloc((num_args + 3) * sizeof(const char *));
|
||||
(const char **) malloc((num_args + 3) * sizeof(const char *));
|
||||
for (int i = 0; i < num_args; ++i) {
|
||||
start_actor_worker_command[i] = state->config.start_worker_command[i];
|
||||
}
|
||||
@@ -278,7 +278,8 @@ const char **parse_command(const char *command) {
|
||||
free(command_copy);
|
||||
|
||||
/* Allocate a NULL-terminated array for the tokens. */
|
||||
const char **command_args = malloc((num_args + 1) * sizeof(const char *));
|
||||
const char **command_args =
|
||||
(const char **) malloc((num_args + 1) * sizeof(const char *));
|
||||
command_args[num_args] = NULL;
|
||||
|
||||
/* Fill in the token array. */
|
||||
@@ -309,7 +310,8 @@ LocalSchedulerState *LocalSchedulerState_init(
|
||||
const double static_resource_conf[],
|
||||
const char *start_worker_command,
|
||||
int num_workers) {
|
||||
LocalSchedulerState *state = malloc(sizeof(LocalSchedulerState));
|
||||
LocalSchedulerState *state =
|
||||
(LocalSchedulerState *) malloc(sizeof(LocalSchedulerState));
|
||||
/* Set the configuration struct for the local scheduler. */
|
||||
if (start_worker_command != NULL) {
|
||||
state->config.start_worker_command = parse_command(start_worker_command);
|
||||
@@ -342,7 +344,7 @@ LocalSchedulerState *LocalSchedulerState_init(
|
||||
utstring_printf(num_gpus, "%f", static_resource_conf[1]);
|
||||
if (plasma_manager_address != NULL) {
|
||||
num_args = 8;
|
||||
db_connect_args = malloc(sizeof(char *) * num_args);
|
||||
db_connect_args = (const char **) malloc(sizeof(char *) * num_args);
|
||||
db_connect_args[0] = "local_scheduler_socket_name";
|
||||
db_connect_args[1] = local_scheduler_socket_name;
|
||||
db_connect_args[2] = "num_cpus";
|
||||
@@ -353,7 +355,7 @@ LocalSchedulerState *LocalSchedulerState_init(
|
||||
db_connect_args[7] = plasma_manager_address;
|
||||
} else {
|
||||
num_args = 6;
|
||||
db_connect_args = malloc(sizeof(char *) * num_args);
|
||||
db_connect_args = (const char **) malloc(sizeof(char *) * num_args);
|
||||
db_connect_args[0] = "local_scheduler_socket_name";
|
||||
db_connect_args[1] = local_scheduler_socket_name;
|
||||
db_connect_args[2] = "num_cpus";
|
||||
@@ -463,7 +465,7 @@ void process_plasma_notification(event_loop *loop,
|
||||
int client_sock,
|
||||
void *context,
|
||||
int events) {
|
||||
LocalSchedulerState *state = context;
|
||||
LocalSchedulerState *state = (LocalSchedulerState *) context;
|
||||
/* Read the notification from Plasma. */
|
||||
ObjectInfo object_info;
|
||||
int error =
|
||||
@@ -494,7 +496,7 @@ void reconstruct_task_update_callback(Task *task, void *user_context) {
|
||||
}
|
||||
/* Otherwise, the test-and-set succeeded, so resubmit the task for execution
|
||||
* to ensure that reconstruction will happen. */
|
||||
LocalSchedulerState *state = user_context;
|
||||
LocalSchedulerState *state = (LocalSchedulerState *) user_context;
|
||||
task_spec *spec = Task_task_spec(task);
|
||||
/* If the task is an actor task, then we currently do not reconstruct it.
|
||||
* TODO(rkn): Handle this better. */
|
||||
@@ -517,7 +519,7 @@ void reconstruct_evicted_result_lookup_callback(ObjectID reconstruct_object_id,
|
||||
* put. */
|
||||
CHECKM(!IS_NIL_ID(task_id),
|
||||
"No task information found for object during reconstruction");
|
||||
LocalSchedulerState *state = user_context;
|
||||
LocalSchedulerState *state = (LocalSchedulerState *) user_context;
|
||||
/* If there are no other instances of the task running, it's safe for us to
|
||||
* claim responsibility for reconstruction. */
|
||||
task_table_test_and_update(state->db, task_id,
|
||||
@@ -541,7 +543,7 @@ void reconstruct_failed_result_lookup_callback(ObjectID reconstruct_object_id,
|
||||
"entry yet)");
|
||||
return;
|
||||
}
|
||||
LocalSchedulerState *state = user_context;
|
||||
LocalSchedulerState *state = (LocalSchedulerState *) user_context;
|
||||
/* If the task failed to finish, it's safe for us to claim responsibility for
|
||||
* reconstruction. */
|
||||
task_table_test_and_update(state->db, task_id, TASK_STATUS_LOST,
|
||||
@@ -557,7 +559,7 @@ void reconstruct_object_lookup_callback(ObjectID reconstruct_object_id,
|
||||
/* Only continue reconstruction if we find that the object doesn't exist on
|
||||
* any nodes. NOTE: This codepath is not responsible for checking if the
|
||||
* object table entry is up-to-date. */
|
||||
LocalSchedulerState *state = user_context;
|
||||
LocalSchedulerState *state = (LocalSchedulerState *) user_context;
|
||||
/* Look up the task that created the object in the result table. */
|
||||
if (manager_count == 0) {
|
||||
/* If the object was created and later evicted, we reconstruct the object
|
||||
@@ -589,7 +591,7 @@ void process_message(event_loop *loop,
|
||||
int client_sock,
|
||||
void *context,
|
||||
int events) {
|
||||
LocalSchedulerClient *worker = context;
|
||||
LocalSchedulerClient *worker = (LocalSchedulerClient *) context;
|
||||
LocalSchedulerState *state = worker->local_scheduler_state;
|
||||
|
||||
int64_t type;
|
||||
@@ -631,10 +633,10 @@ void process_message(event_loop *loop,
|
||||
int64_t value_length;
|
||||
memcpy(&value_length, &message[offset], sizeof(value_length));
|
||||
offset += sizeof(value_length);
|
||||
uint8_t *key = malloc(key_length);
|
||||
uint8_t *key = (uint8_t *) malloc(key_length);
|
||||
memcpy(key, &message[offset], key_length);
|
||||
offset += key_length;
|
||||
uint8_t *value = malloc(value_length);
|
||||
uint8_t *value = (uint8_t *) malloc(value_length);
|
||||
memcpy(value, &message[offset], value_length);
|
||||
offset += value_length;
|
||||
CHECK(offset == length);
|
||||
@@ -762,11 +764,12 @@ void new_client_connection(event_loop *loop,
|
||||
int listener_sock,
|
||||
void *context,
|
||||
int events) {
|
||||
LocalSchedulerState *state = context;
|
||||
LocalSchedulerState *state = (LocalSchedulerState *) context;
|
||||
int new_socket = accept_client(listener_sock);
|
||||
/* Create a struct for this worker. This will be freed when we free the local
|
||||
* scheduler state. */
|
||||
LocalSchedulerClient *worker = malloc(sizeof(LocalSchedulerClient));
|
||||
LocalSchedulerClient *worker =
|
||||
(LocalSchedulerClient *) malloc(sizeof(LocalSchedulerClient));
|
||||
worker->sock = new_socket;
|
||||
worker->task_in_progress = NULL;
|
||||
worker->is_blocked = false;
|
||||
@@ -820,7 +823,7 @@ void handle_task_scheduled_callback(Task *original_task, void *user_context) {
|
||||
void handle_actor_creation_callback(ActorInfo info, void *context) {
|
||||
ActorID actor_id = info.actor_id;
|
||||
DBClientID local_scheduler_id = info.local_scheduler_id;
|
||||
LocalSchedulerState *state = context;
|
||||
LocalSchedulerState *state = (LocalSchedulerState *) context;
|
||||
/* Make sure the actor entry is not already present in the actor map table.
|
||||
* TODO(rkn): We will need to remove this check to handle the case where the
|
||||
* corresponding publish is retried and the case in which a task that creates
|
||||
@@ -831,7 +834,7 @@ void handle_actor_creation_callback(ActorInfo info, void *context) {
|
||||
/* Create a new entry and add it to the actor mapping table. TODO(rkn):
|
||||
* Currently this is never removed (except when the local scheduler state is
|
||||
* deleted). */
|
||||
entry = malloc(sizeof(actor_map_entry));
|
||||
entry = (actor_map_entry *) malloc(sizeof(actor_map_entry));
|
||||
entry->actor_id = actor_id;
|
||||
entry->local_scheduler_id = local_scheduler_id;
|
||||
HASH_ADD(hh, state->actor_mapping, actor_id, sizeof(entry->actor_id), entry);
|
||||
@@ -846,7 +849,7 @@ void handle_actor_creation_callback(ActorInfo info, void *context) {
|
||||
}
|
||||
|
||||
int heartbeat_handler(event_loop *loop, timer_id id, void *context) {
|
||||
LocalSchedulerState *state = context;
|
||||
LocalSchedulerState *state = (LocalSchedulerState *) context;
|
||||
SchedulingAlgorithmState *algorithm_state = state->algorithm_state;
|
||||
LocalSchedulerInfo info;
|
||||
/* Ask the scheduling algorithm to fill out the scheduler info struct. */
|
||||
+7
-7
@@ -109,7 +109,7 @@ struct SchedulingAlgorithmState {
|
||||
|
||||
SchedulingAlgorithmState *SchedulingAlgorithmState_init(void) {
|
||||
SchedulingAlgorithmState *algorithm_state =
|
||||
malloc(sizeof(SchedulingAlgorithmState));
|
||||
(SchedulingAlgorithmState *) malloc(sizeof(SchedulingAlgorithmState));
|
||||
/* Initialize an empty hash map for the cache of local available objects. */
|
||||
algorithm_state->local_objects = NULL;
|
||||
/* Initialize the hash table of objects being fetched. */
|
||||
@@ -220,7 +220,7 @@ void create_actor(SchedulingAlgorithmState *algorithm_state,
|
||||
ActorID actor_id,
|
||||
LocalSchedulerClient *worker) {
|
||||
/* This will be freed when the actor is removed in remove_actor. */
|
||||
LocalActorInfo *entry = malloc(sizeof(LocalActorInfo));
|
||||
LocalActorInfo *entry = (LocalActorInfo *) malloc(sizeof(LocalActorInfo));
|
||||
entry->actor_id = actor_id;
|
||||
entry->task_counter = 0;
|
||||
/* Initialize the doubly-linked list to NULL. */
|
||||
@@ -341,7 +341,7 @@ void add_task_to_actor_queue(LocalSchedulerState *state,
|
||||
CHECK(task_counter >= entry->task_counter);
|
||||
|
||||
/* Create a new task queue entry. */
|
||||
task_queue_entry *elt = malloc(sizeof(task_queue_entry));
|
||||
task_queue_entry *elt = (task_queue_entry *) malloc(sizeof(task_queue_entry));
|
||||
elt->spec = (task_spec *) malloc(task_spec_size(spec));
|
||||
memcpy(elt->spec, spec, task_spec_size(spec));
|
||||
/* Add the task spec to the actor's task queue in a manner that preserves the
|
||||
@@ -457,7 +457,7 @@ void fetch_missing_dependency(LocalSchedulerState *state,
|
||||
* hash table of locally available objects in handle_object_available when
|
||||
* the object becomes available locally. It will get freed if the object is
|
||||
* subsequently removed locally. */
|
||||
entry = malloc(sizeof(object_entry));
|
||||
entry = (object_entry *) malloc(sizeof(object_entry));
|
||||
entry->object_id = obj_id;
|
||||
utarray_new(entry->dependent_tasks, &task_queue_entry_icd);
|
||||
HASH_ADD(hh, algorithm_state->remote_objects, object_id,
|
||||
@@ -529,7 +529,7 @@ bool can_run(SchedulingAlgorithmState *algorithm_state, task_spec *task) {
|
||||
/* TODO(rkn): This method will need to be changed to call reconstruct. */
|
||||
/* TODO(swang): This method is not covered by any valgrind tests. */
|
||||
int fetch_object_timeout_handler(event_loop *loop, timer_id id, void *context) {
|
||||
LocalSchedulerState *state = context;
|
||||
LocalSchedulerState *state = (LocalSchedulerState *) context;
|
||||
/* Only try the fetches if we are connected to the object store manager. */
|
||||
if (!plasma_manager_is_connected(state->plasma_conn)) {
|
||||
LOG_INFO("Local scheduler is not connected to a object store manager");
|
||||
@@ -538,7 +538,7 @@ int fetch_object_timeout_handler(event_loop *loop, timer_id id, void *context) {
|
||||
|
||||
/* Allocate a buffer to hold all the object IDs for active fetch requests. */
|
||||
int num_object_ids = HASH_COUNT(state->algorithm_state->remote_objects);
|
||||
ObjectID *object_ids = malloc(num_object_ids * sizeof(ObjectID));
|
||||
ObjectID *object_ids = (ObjectID *) malloc(num_object_ids * sizeof(ObjectID));
|
||||
|
||||
/* Fill out the request with the object IDs for active fetches. */
|
||||
object_entry *fetch_request, *tmp;
|
||||
@@ -646,7 +646,7 @@ task_queue_entry *queue_task(LocalSchedulerState *state,
|
||||
bool from_global_scheduler) {
|
||||
/* Copy the spec and add it to the task queue. The allocated spec will be
|
||||
* freed when it is assigned to a worker. */
|
||||
task_queue_entry *elt = malloc(sizeof(task_queue_entry));
|
||||
task_queue_entry *elt = (task_queue_entry *) malloc(sizeof(task_queue_entry));
|
||||
elt->spec = (task_spec *) malloc(task_spec_size(spec));
|
||||
memcpy(elt->spec, spec, task_spec_size(spec));
|
||||
DL_APPEND((*task_queue), elt);
|
||||
@@ -29,9 +29,9 @@ enum local_scheduler_message_type {
|
||||
};
|
||||
|
||||
/* These are needed to define the UT_arrays. */
|
||||
UT_icd task_ptr_icd;
|
||||
UT_icd workers_icd;
|
||||
UT_icd pid_t_icd;
|
||||
extern UT_icd task_ptr_icd;
|
||||
extern UT_icd workers_icd;
|
||||
extern UT_icd pid_t_icd;
|
||||
|
||||
/** This struct is used to register a new worker with the local scheduler.
|
||||
* It is shipped as part of local_scheduler_connect */
|
||||
|
||||
+15
-11
@@ -58,7 +58,8 @@ LocalSchedulerMock *LocalSchedulerMock_init(int num_workers,
|
||||
int redis_port = 6379;
|
||||
const double static_resource_conf[MAX_RESOURCE_INDEX] = {DEFAULT_NUM_CPUS,
|
||||
DEFAULT_NUM_GPUS};
|
||||
LocalSchedulerMock *mock = malloc(sizeof(LocalSchedulerMock));
|
||||
LocalSchedulerMock *mock =
|
||||
(LocalSchedulerMock *) malloc(sizeof(LocalSchedulerMock));
|
||||
memset(mock, 0, sizeof(LocalSchedulerMock));
|
||||
mock->loop = event_loop_create();
|
||||
/* Bind to the local scheduler port and initialize the local scheduler. */
|
||||
@@ -95,7 +96,8 @@ LocalSchedulerMock *LocalSchedulerMock_init(int num_workers,
|
||||
|
||||
/* Connect a local scheduler client. */
|
||||
mock->num_local_scheduler_conns = num_mock_workers;
|
||||
mock->conns = malloc(sizeof(LocalSchedulerConnection *) * num_mock_workers);
|
||||
mock->conns = (LocalSchedulerConnection **) malloc(
|
||||
sizeof(LocalSchedulerConnection *) * num_mock_workers);
|
||||
for (int i = 0; i < num_mock_workers; ++i) {
|
||||
mock->conns[i] = LocalSchedulerConnection_init(
|
||||
utstring_body(local_scheduler_socket_name), NIL_ACTOR_ID);
|
||||
@@ -160,12 +162,13 @@ TEST object_reconstruction_test(void) {
|
||||
* simulate it having been created and evicted. */
|
||||
const char *client_id = "clientid";
|
||||
redisContext *context = redisConnect("127.0.0.1", 6379);
|
||||
redisReply *reply = redisCommand(context, "RAY.OBJECT_TABLE_ADD %b %ld %b %s",
|
||||
return_id.id, sizeof(return_id.id), 1,
|
||||
NIL_DIGEST, (size_t) DIGEST_SIZE, client_id);
|
||||
redisReply *reply = (redisReply *) redisCommand(
|
||||
context, "RAY.OBJECT_TABLE_ADD %b %ld %b %s", return_id.id,
|
||||
sizeof(return_id.id), 1, NIL_DIGEST, (size_t) DIGEST_SIZE, client_id);
|
||||
freeReplyObject(reply);
|
||||
reply = redisCommand(context, "RAY.OBJECT_TABLE_REMOVE %b %s", return_id.id,
|
||||
sizeof(return_id.id), client_id);
|
||||
reply = (redisReply *) redisCommand(context, "RAY.OBJECT_TABLE_REMOVE %b %s",
|
||||
return_id.id, sizeof(return_id.id),
|
||||
client_id);
|
||||
freeReplyObject(reply);
|
||||
redisFree(context);
|
||||
|
||||
@@ -245,12 +248,13 @@ TEST object_reconstruction_recursive_test(void) {
|
||||
redisContext *context = redisConnect("127.0.0.1", 6379);
|
||||
for (int i = 0; i < NUM_TASKS; ++i) {
|
||||
ObjectID return_id = task_return(specs[i], 0);
|
||||
redisReply *reply = redisCommand(
|
||||
redisReply *reply = (redisReply *) redisCommand(
|
||||
context, "RAY.OBJECT_TABLE_ADD %b %ld %b %s", return_id.id,
|
||||
sizeof(return_id.id), 1, NIL_DIGEST, (size_t) DIGEST_SIZE, client_id);
|
||||
freeReplyObject(reply);
|
||||
reply = redisCommand(context, "RAY.OBJECT_TABLE_REMOVE %b %s", return_id.id,
|
||||
sizeof(return_id.id), client_id);
|
||||
reply = (redisReply *) redisCommand(
|
||||
context, "RAY.OBJECT_TABLE_REMOVE %b %s", return_id.id,
|
||||
sizeof(return_id.id), client_id);
|
||||
freeReplyObject(reply);
|
||||
}
|
||||
redisFree(context);
|
||||
@@ -335,7 +339,7 @@ task_spec *object_reconstruction_suppression_spec;
|
||||
void object_reconstruction_suppression_callback(ObjectID object_id,
|
||||
void *user_context) {
|
||||
/* Submit the task after adding the object to the object table. */
|
||||
LocalSchedulerConnection *worker = user_context;
|
||||
LocalSchedulerConnection *worker = (LocalSchedulerConnection *) user_context;
|
||||
local_scheduler_submit(worker, object_reconstruction_suppression_spec);
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ if(HAS_PLASMA)
|
||||
include_directories("${CMAKE_CURRENT_LIST_DIR}/../plasma")
|
||||
include_directories("${CMAKE_CURRENT_LIST_DIR}/../common")
|
||||
include_directories("${CMAKE_CURRENT_LIST_DIR}/../common/thirdparty")
|
||||
set(COMMON_EXTENSION ../common/lib/python/common_extension.c)
|
||||
set(COMMON_EXTENSION ../common/lib/python/common_extension.cc)
|
||||
endif()
|
||||
|
||||
add_definitions(-fPIC)
|
||||
|
||||
@@ -15,13 +15,17 @@
|
||||
#include "memory.h"
|
||||
|
||||
#ifdef HAS_PLASMA
|
||||
extern "C" {
|
||||
#include "plasma_client.h"
|
||||
#include "plasma_protocol.h"
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
PyObject* NumbufPlasmaOutOfMemoryError;
|
||||
PyObject* NumbufPlasmaObjectExistsError;
|
||||
}
|
||||
|
||||
#include "common_extension.h"
|
||||
#include "plasma_extension.h"
|
||||
|
||||
#endif
|
||||
|
||||
using namespace arrow;
|
||||
@@ -193,9 +197,6 @@ static PyObject* register_callbacks(PyObject* self, PyObject* args) {
|
||||
|
||||
#ifdef HAS_PLASMA
|
||||
|
||||
#include "common_extension.h"
|
||||
#include "plasma_extension.h"
|
||||
|
||||
/**
|
||||
* Release the object when its associated PyCapsule goes out of scope.
|
||||
*
|
||||
|
||||
+12
-12
@@ -41,11 +41,11 @@ include_directories("${CMAKE_CURRENT_LIST_DIR}/")
|
||||
include_directories("${CMAKE_CURRENT_LIST_DIR}/../")
|
||||
|
||||
add_library(plasma SHARED
|
||||
plasma.c
|
||||
plasma_extension.c
|
||||
../common/lib/python/common_extension.c
|
||||
plasma.cc
|
||||
plasma_extension.cc
|
||||
../common/lib/python/common_extension.cc
|
||||
plasma_protocol.cc
|
||||
plasma_client.c
|
||||
plasma_client.cc
|
||||
thirdparty/xxhash.c
|
||||
fling.c)
|
||||
|
||||
@@ -70,10 +70,10 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
|
||||
set_source_files_properties(thirdparty/dlmalloc.c PROPERTIES COMPILE_FLAGS -Wno-all)
|
||||
|
||||
add_executable(plasma_store
|
||||
plasma_store.c
|
||||
plasma.c
|
||||
plasma_store.cc
|
||||
plasma.cc
|
||||
plasma_protocol.cc
|
||||
eviction_policy.c
|
||||
eviction_policy.cc
|
||||
fling.c
|
||||
malloc.c)
|
||||
|
||||
@@ -82,8 +82,8 @@ add_dependencies(plasma_store hiredis gen_plasma_fbs)
|
||||
target_link_libraries(plasma_store common ${FLATBUFFERS_STATIC_LIB})
|
||||
|
||||
add_library(plasma_lib STATIC
|
||||
plasma_client.c
|
||||
plasma.c
|
||||
plasma_client.cc
|
||||
plasma.cc
|
||||
plasma_protocol.cc
|
||||
fling.c
|
||||
thirdparty/xxhash.c)
|
||||
@@ -94,15 +94,15 @@ add_dependencies(plasma_lib gen_plasma_fbs)
|
||||
add_dependencies(plasma protocol_fbs)
|
||||
|
||||
add_executable(plasma_manager
|
||||
plasma_manager.c)
|
||||
plasma_manager.cc)
|
||||
|
||||
target_link_libraries(plasma_manager common plasma_lib ${FLATBUFFERS_STATIC_LIB})
|
||||
|
||||
add_library(plasma_client SHARED plasma_client.c)
|
||||
add_library(plasma_client SHARED plasma_client.cc)
|
||||
target_link_libraries(plasma_client ${FLATBUFFERS_STATIC_LIB})
|
||||
|
||||
target_link_libraries(plasma_client common plasma_lib ${FLATBUFFERS_STATIC_LIB})
|
||||
|
||||
define_test(client_tests plasma_lib)
|
||||
define_test(manager_tests plasma_lib plasma_manager.c)
|
||||
define_test(manager_tests plasma_lib plasma_manager.cc)
|
||||
define_test(serialization_tests plasma_lib)
|
||||
|
||||
@@ -4,14 +4,14 @@
|
||||
|
||||
/** An element representing a released object in a doubly-linked list. This is
|
||||
* used to implement an LRU cache. */
|
||||
typedef struct released_object {
|
||||
typedef struct ReleasedObject {
|
||||
/** The object_id of the released object. */
|
||||
ObjectID object_id;
|
||||
/** Needed for the doubly-linked list macros. */
|
||||
struct released_object *prev;
|
||||
struct ReleasedObject *prev;
|
||||
/** Needed for the doubly-linked list macros. */
|
||||
struct released_object *next;
|
||||
} released_object;
|
||||
struct ReleasedObject *next;
|
||||
} ReleasedObject;
|
||||
|
||||
/** This type is used to define a hash table mapping the object ID of a released
|
||||
* object to its location in the doubly-linked list of released objects. */
|
||||
@@ -20,7 +20,7 @@ typedef struct {
|
||||
ObjectID object_id;
|
||||
/** A pointer to the corresponding entry for this object in the doubly-linked
|
||||
* list of released objects. */
|
||||
released_object *released_object;
|
||||
ReleasedObject *released_object;
|
||||
/** Handle for the uthash table. */
|
||||
UT_hash_handle handle;
|
||||
} released_object_entry;
|
||||
@@ -31,7 +31,7 @@ struct EvictionState {
|
||||
int64_t memory_used;
|
||||
/** A doubly-linked list of the released objects in order from least recently
|
||||
* released to most recently released. */
|
||||
released_object *released_objects;
|
||||
ReleasedObject *released_objects;
|
||||
/** A hash table mapping the object ID of a released object to its location in
|
||||
* the doubly linked list of released objects. */
|
||||
released_object_entry *released_object_table;
|
||||
@@ -42,7 +42,7 @@ struct EvictionState {
|
||||
UT_icd released_objects_entry_icd = {sizeof(ObjectID), NULL, NULL, NULL};
|
||||
|
||||
EvictionState *EvictionState_init(void) {
|
||||
EvictionState *state = malloc(sizeof(EvictionState));
|
||||
EvictionState *state = (EvictionState *) malloc(sizeof(EvictionState));
|
||||
state->memory_used = 0;
|
||||
state->released_objects = NULL;
|
||||
state->released_object_table = NULL;
|
||||
@@ -51,7 +51,7 @@ EvictionState *EvictionState_init(void) {
|
||||
|
||||
void EvictionState_free(EvictionState *s) {
|
||||
/* Delete each element in the doubly-linked list. */
|
||||
released_object *element, *temp;
|
||||
ReleasedObject *element, *temp;
|
||||
DL_FOREACH_SAFE(s->released_objects, element, temp) {
|
||||
DL_DELETE(s->released_objects, element);
|
||||
free(element);
|
||||
@@ -69,7 +69,8 @@ void EvictionState_free(EvictionState *s) {
|
||||
void add_object_to_lru_cache(EvictionState *eviction_state,
|
||||
ObjectID object_id) {
|
||||
/* Add the object ID to the doubly-linked list. */
|
||||
released_object *linked_list_entry = malloc(sizeof(released_object));
|
||||
ReleasedObject *linked_list_entry =
|
||||
(ReleasedObject *) malloc(sizeof(ReleasedObject));
|
||||
linked_list_entry->object_id = object_id;
|
||||
DL_APPEND(eviction_state->released_objects, linked_list_entry);
|
||||
/* Check that the object ID is not already in the hash table. */
|
||||
@@ -78,7 +79,8 @@ void add_object_to_lru_cache(EvictionState *eviction_state,
|
||||
sizeof(object_id), hash_table_entry);
|
||||
CHECK(hash_table_entry == NULL);
|
||||
/* Add the object ID to the hash table. */
|
||||
hash_table_entry = malloc(sizeof(released_object_entry));
|
||||
hash_table_entry =
|
||||
(released_object_entry *) malloc(sizeof(released_object_entry));
|
||||
hash_table_entry->object_id = object_id;
|
||||
hash_table_entry->released_object = linked_list_entry;
|
||||
HASH_ADD(handle, eviction_state->released_object_table, object_id,
|
||||
@@ -114,7 +116,7 @@ int64_t EvictionState_choose_objects_to_evict(
|
||||
int64_t num_bytes = 0;
|
||||
/* Figure out how many objects need to be evicted in order to recover a
|
||||
* sufficient number of bytes. */
|
||||
released_object *element, *temp;
|
||||
ReleasedObject *element, *temp;
|
||||
DL_FOREACH_SAFE(eviction_state->released_objects, element, temp) {
|
||||
if (num_bytes >= num_bytes_required) {
|
||||
break;
|
||||
@@ -25,15 +25,19 @@
|
||||
#include "plasma.h"
|
||||
#include "plasma_protocol.h"
|
||||
#include "plasma_client.h"
|
||||
#include "fling.h"
|
||||
#include "uthash.h"
|
||||
#include "utlist.h"
|
||||
#include "sha256.h"
|
||||
|
||||
extern "C" {
|
||||
|
||||
#include "fling.h"
|
||||
|
||||
#define XXH_STATIC_LINKING_ONLY
|
||||
#include "xxhash.h"
|
||||
|
||||
#define XXH64_DEFAULT_SEED 0
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
/** Key that uniquely identifies the memory mapped file. In practice, we
|
||||
@@ -140,13 +144,13 @@ uint8_t *lookup_or_mmap(PlasmaConnection *conn,
|
||||
close(fd);
|
||||
return entry->pointer;
|
||||
} else {
|
||||
uint8_t *result =
|
||||
mmap(NULL, map_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
|
||||
uint8_t *result = (uint8_t *) mmap(NULL, map_size, PROT_READ | PROT_WRITE,
|
||||
MAP_SHARED, fd, 0);
|
||||
if (result == MAP_FAILED) {
|
||||
LOG_FATAL("mmap failed");
|
||||
}
|
||||
close(fd);
|
||||
entry = malloc(sizeof(client_mmap_table_entry));
|
||||
entry = (client_mmap_table_entry *) malloc(sizeof(client_mmap_table_entry));
|
||||
entry->key = store_fd_val;
|
||||
entry->pointer = result;
|
||||
entry->length = map_size;
|
||||
@@ -177,7 +181,7 @@ void increment_object_count(PlasmaConnection *conn,
|
||||
if (object_entry == NULL) {
|
||||
/* Add this object ID to the hash table of object IDs in use. The
|
||||
* corresponding call to free happens in plasma_release. */
|
||||
object_entry = malloc(sizeof(object_in_use_entry));
|
||||
object_entry = (object_in_use_entry *) malloc(sizeof(object_in_use_entry));
|
||||
object_entry->object_id = object_id;
|
||||
object_entry->object = *object;
|
||||
object_entry->count = 0;
|
||||
@@ -305,8 +309,10 @@ void plasma_get(PlasmaConnection *conn,
|
||||
num_objects, timeout_ms) >= 0);
|
||||
uint8_t *reply_data =
|
||||
plasma_receive(conn->store_conn, MessageType_PlasmaGetReply);
|
||||
ObjectID *received_obj_ids = malloc(num_objects * sizeof(ObjectID));
|
||||
PlasmaObject *object_data = malloc(num_objects * sizeof(PlasmaObject));
|
||||
ObjectID *received_obj_ids =
|
||||
(ObjectID *) malloc(num_objects * sizeof(ObjectID));
|
||||
PlasmaObject *object_data =
|
||||
(PlasmaObject *) malloc(num_objects * sizeof(PlasmaObject));
|
||||
PlasmaObject *object;
|
||||
plasma_read_GetReply(reply_data, received_obj_ids, object_data, num_objects);
|
||||
free(reply_data);
|
||||
@@ -413,7 +419,8 @@ void plasma_perform_release(PlasmaConnection *conn, ObjectID object_id) {
|
||||
void plasma_release(PlasmaConnection *conn, ObjectID obj_id) {
|
||||
/* Add the new object to the release history. The corresponding call to free
|
||||
* will occur in plasma_perform_release or in plasma_disconnect. */
|
||||
pending_release *pending_release_entry = malloc(sizeof(pending_release));
|
||||
pending_release *pending_release_entry =
|
||||
(pending_release *) malloc(sizeof(pending_release));
|
||||
pending_release_entry->object_id = obj_id;
|
||||
DL_APPEND(conn->release_history, pending_release_entry);
|
||||
conn->release_history_length += 1;
|
||||
@@ -555,7 +562,8 @@ PlasmaConnection *plasma_connect(const char *store_socket_name,
|
||||
const char *manager_socket_name,
|
||||
int release_delay) {
|
||||
/* Initialize the store connection struct */
|
||||
PlasmaConnection *result = malloc(sizeof(PlasmaConnection));
|
||||
PlasmaConnection *result =
|
||||
(PlasmaConnection *) malloc(sizeof(PlasmaConnection));
|
||||
result->store_conn = connect_ipc_sock_retry(store_socket_name, -1, -1);
|
||||
if (manager_socket_name != NULL) {
|
||||
result->manager_conn = connect_ipc_sock_retry(manager_socket_name, -1, -1);
|
||||
@@ -79,7 +79,7 @@ PyObject *PyPlasma_create(PyObject *self, PyObject *args) {
|
||||
CHECK(error_code == PlasmaError_OK);
|
||||
|
||||
#if PY_MAJOR_VERSION >= 3
|
||||
return PyMemoryView_FromMemory((void *) data, (Py_ssize_t) size, PyBUF_WRITE);
|
||||
return PyMemoryView_FromMemory((char *) data, (Py_ssize_t) size, PyBUF_WRITE);
|
||||
#else
|
||||
return PyBuffer_FromReadWriteMemory((void *) data, (Py_ssize_t) size);
|
||||
#endif
|
||||
@@ -154,11 +154,11 @@ PyObject *PyPlasma_get(PyObject *self, PyObject *args) {
|
||||
#if PY_MAJOR_VERSION >= 3
|
||||
PyTuple_SetItem(
|
||||
t, 0, PyMemoryView_FromMemory(
|
||||
(void *) object_buffers[i].data,
|
||||
(char *) object_buffers[i].data,
|
||||
(Py_ssize_t) object_buffers[i].data_size, PyBUF_READ));
|
||||
PyTuple_SetItem(
|
||||
t, 1, PyMemoryView_FromMemory(
|
||||
(void *) object_buffers[i].metadata,
|
||||
(char *) object_buffers[i].metadata,
|
||||
(Py_ssize_t) object_buffers[i].metadata_size, PyBUF_READ));
|
||||
#else
|
||||
PyTuple_SetItem(
|
||||
@@ -207,7 +207,7 @@ PyObject *PyPlasma_fetch(PyObject *self, PyObject *args) {
|
||||
return NULL;
|
||||
}
|
||||
Py_ssize_t n = PyList_Size(object_id_list);
|
||||
ObjectID *object_ids = malloc(sizeof(ObjectID) * n);
|
||||
ObjectID *object_ids = (ObjectID *) malloc(sizeof(ObjectID) * n);
|
||||
for (int i = 0; i < n; ++i) {
|
||||
PyStringToUniqueID(PyList_GetItem(object_id_list, i), &object_ids[i]);
|
||||
}
|
||||
@@ -249,7 +249,8 @@ PyObject *PyPlasma_wait(PyObject *self, PyObject *args) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ObjectRequest *object_requests = malloc(sizeof(ObjectRequest) * n);
|
||||
ObjectRequest *object_requests =
|
||||
(ObjectRequest *) malloc(sizeof(ObjectRequest) * n);
|
||||
for (int i = 0; i < n; ++i) {
|
||||
CHECK(PyStringToUniqueID(PyList_GetItem(object_id_list, i),
|
||||
&object_requests[i].object_id) == 1);
|
||||
@@ -299,7 +299,8 @@ void add_wait_request_for_object(plasma_manager_state *manager_state,
|
||||
* new object_wait_requests struct for this object ID and add it to the hash
|
||||
* table. */
|
||||
if (object_wait_reqs == NULL) {
|
||||
object_wait_reqs = malloc(sizeof(object_wait_requests));
|
||||
object_wait_reqs =
|
||||
(object_wait_requests *) malloc(sizeof(object_wait_requests));
|
||||
object_wait_reqs->object_id = object_id;
|
||||
utarray_new(object_wait_reqs->wait_requests, &wait_request_icd);
|
||||
HASH_ADD(hh, *object_wait_requests_table_ptr, object_id,
|
||||
@@ -423,7 +424,7 @@ void update_object_wait_requests(plasma_manager_state *manager_state,
|
||||
|
||||
fetch_request *create_fetch_request(plasma_manager_state *manager_state,
|
||||
ObjectID object_id) {
|
||||
fetch_request *fetch_req = malloc(sizeof(fetch_request));
|
||||
fetch_request *fetch_req = (fetch_request *) malloc(sizeof(fetch_request));
|
||||
fetch_req->object_id = object_id;
|
||||
fetch_req->manager_count = 0;
|
||||
fetch_req->manager_vector = NULL;
|
||||
@@ -450,7 +451,8 @@ plasma_manager_state *init_plasma_manager_state(const char *store_socket_name,
|
||||
int manager_port,
|
||||
const char *db_addr,
|
||||
int db_port) {
|
||||
plasma_manager_state *state = malloc(sizeof(plasma_manager_state));
|
||||
plasma_manager_state *state =
|
||||
(plasma_manager_state *) malloc(sizeof(plasma_manager_state));
|
||||
state->loop = event_loop_create();
|
||||
state->plasma_conn =
|
||||
plasma_connect(store_socket_name, NULL, PLASMA_DEFAULT_RELEASE_DELAY);
|
||||
@@ -465,7 +467,8 @@ plasma_manager_state *init_plasma_manager_state(const char *store_socket_name,
|
||||
utstring_printf(manager_address_str, "%s:%d", manager_addr, manager_port);
|
||||
|
||||
int num_args = 6;
|
||||
const char **db_connect_args = malloc(sizeof(char *) * num_args);
|
||||
const char **db_connect_args =
|
||||
(const char **) malloc(sizeof(char *) * num_args);
|
||||
db_connect_args[0] = "store_socket_name";
|
||||
db_connect_args[1] = store_socket_name;
|
||||
db_connect_args[2] = "manager_socket_name";
|
||||
@@ -705,7 +708,7 @@ ClientConnection *get_manager_connection(plasma_manager_state *state,
|
||||
/* TODO(swang): Handle the case when connection to this manager was
|
||||
* unsuccessful. */
|
||||
CHECK(fd >= 0);
|
||||
manager_conn = malloc(sizeof(ClientConnection));
|
||||
manager_conn = (ClientConnection *) malloc(sizeof(ClientConnection));
|
||||
manager_conn->fd = fd;
|
||||
manager_conn->manager_state = state;
|
||||
manager_conn->transfer_queue = NULL;
|
||||
@@ -768,7 +771,8 @@ void process_transfer_request(event_loop *loop,
|
||||
counter += 1;
|
||||
} while (obj_buffer.data_size == -1);
|
||||
DCHECK(obj_buffer.metadata == obj_buffer.data + obj_buffer.data_size);
|
||||
plasma_request_buffer *buf = malloc(sizeof(plasma_request_buffer));
|
||||
plasma_request_buffer *buf =
|
||||
(plasma_request_buffer *) malloc(sizeof(plasma_request_buffer));
|
||||
buf->type = MessageType_PlasmaDataReply;
|
||||
buf->object_id = obj_id;
|
||||
/* We treat buf->data as a pointer to the concatenated data and metadata, so
|
||||
@@ -799,7 +803,8 @@ void process_data_request(event_loop *loop,
|
||||
int64_t data_size,
|
||||
int64_t metadata_size,
|
||||
ClientConnection *conn) {
|
||||
plasma_request_buffer *buf = malloc(sizeof(plasma_request_buffer));
|
||||
plasma_request_buffer *buf =
|
||||
(plasma_request_buffer *) malloc(sizeof(plasma_request_buffer));
|
||||
buf->object_id = object_id;
|
||||
buf->data_size = data_size;
|
||||
buf->metadata_size = metadata_size;
|
||||
@@ -867,7 +872,7 @@ void request_transfer_from(plasma_manager_state *manager_state,
|
||||
}
|
||||
|
||||
plasma_request_buffer *transfer_request =
|
||||
malloc(sizeof(plasma_request_buffer));
|
||||
(plasma_request_buffer *) malloc(sizeof(plasma_request_buffer));
|
||||
transfer_request->type = MessageType_PlasmaDataRequest;
|
||||
transfer_request->object_id = fetch_req->object_id;
|
||||
|
||||
@@ -885,7 +890,7 @@ void request_transfer_from(plasma_manager_state *manager_state,
|
||||
}
|
||||
|
||||
int fetch_timeout_handler(event_loop *loop, timer_id id, void *context) {
|
||||
plasma_manager_state *manager_state = context;
|
||||
plasma_manager_state *manager_state = (plasma_manager_state *) context;
|
||||
/* Loop over the fetch requests and reissue the requests. */
|
||||
fetch_request *fetch_req, *tmp;
|
||||
HASH_ITER(hh, manager_state->fetch_requests, fetch_req, tmp) {
|
||||
@@ -938,12 +943,12 @@ void request_transfer(ObjectID object_id,
|
||||
}
|
||||
/* Update the manager vector. */
|
||||
fetch_req->manager_count = manager_count;
|
||||
fetch_req->manager_vector = malloc(manager_count * sizeof(char *));
|
||||
fetch_req->manager_vector = (char **) malloc(manager_count * sizeof(char *));
|
||||
fetch_req->next_manager = 0;
|
||||
memset(fetch_req->manager_vector, 0, manager_count * sizeof(char *));
|
||||
for (int i = 0; i < manager_count; ++i) {
|
||||
int len = strlen(manager_vector[i]);
|
||||
fetch_req->manager_vector[i] = malloc(len + 1);
|
||||
fetch_req->manager_vector[i] = (char *) malloc(len + 1);
|
||||
strncpy(fetch_req->manager_vector[i], manager_vector[i], len);
|
||||
fetch_req->manager_vector[i][len] = '\0';
|
||||
}
|
||||
@@ -1015,7 +1020,8 @@ void process_fetch_requests(ClientConnection *client_conn,
|
||||
int num_object_ids_to_request = 0;
|
||||
/* This is allocating more space than necessary, but we do not know the exact
|
||||
* number of object IDs to request notifications for yet. */
|
||||
ObjectID *object_ids_to_request = malloc(num_object_ids * sizeof(ObjectID));
|
||||
ObjectID *object_ids_to_request =
|
||||
(ObjectID *) malloc(num_object_ids * sizeof(ObjectID));
|
||||
|
||||
for (int i = 0; i < num_object_ids; ++i) {
|
||||
ObjectID obj_id = object_ids[i];
|
||||
@@ -1056,7 +1062,7 @@ void process_fetch_requests(ClientConnection *client_conn,
|
||||
}
|
||||
|
||||
int wait_timeout_handler(event_loop *loop, timer_id id, void *context) {
|
||||
wait_request *wait_req = context;
|
||||
wait_request *wait_req = (wait_request *) context;
|
||||
return_from_wait(wait_req->client_conn->manager_state, wait_req);
|
||||
return EVENT_LOOP_TIMER_DONE;
|
||||
}
|
||||
@@ -1070,13 +1076,13 @@ void process_wait_request(ClientConnection *client_conn,
|
||||
plasma_manager_state *manager_state = client_conn->manager_state;
|
||||
|
||||
/* Create a wait request for this object. */
|
||||
wait_request *wait_req = malloc(sizeof(wait_request));
|
||||
wait_request *wait_req = (wait_request *) malloc(sizeof(wait_request));
|
||||
memset(wait_req, 0, sizeof(wait_request));
|
||||
wait_req->client_conn = client_conn;
|
||||
wait_req->timer = -1;
|
||||
wait_req->num_object_requests = num_object_requests;
|
||||
wait_req->object_requests =
|
||||
malloc(num_object_requests * sizeof(ObjectRequest));
|
||||
(ObjectRequest *) malloc(num_object_requests * sizeof(ObjectRequest));
|
||||
for (int i = 0; i < num_object_requests; ++i) {
|
||||
wait_req->object_requests[i].object_id = object_requests[i].object_id;
|
||||
wait_req->object_requests[i].type = object_requests[i].type;
|
||||
@@ -1089,7 +1095,7 @@ void process_wait_request(ClientConnection *client_conn,
|
||||
/* This is allocating more space than necessary, but we do not know the exact
|
||||
* number of object IDs to request notifications for yet. */
|
||||
ObjectID *object_ids_to_request =
|
||||
malloc(num_object_requests * sizeof(ObjectID));
|
||||
(ObjectID *) malloc(num_object_requests * sizeof(ObjectID));
|
||||
|
||||
for (int i = 0; i < num_object_requests; ++i) {
|
||||
ObjectID obj_id = object_requests[i].object_id;
|
||||
@@ -1278,7 +1284,7 @@ void process_object_notification(event_loop *loop,
|
||||
int client_sock,
|
||||
void *context,
|
||||
int events) {
|
||||
plasma_manager_state *state = context;
|
||||
plasma_manager_state *state = (plasma_manager_state *) context;
|
||||
ObjectInfo object_info;
|
||||
/* Read the notification from Plasma. */
|
||||
int error =
|
||||
@@ -1333,7 +1339,8 @@ void process_message(event_loop *loop,
|
||||
case MessageType_PlasmaFetchRequest: {
|
||||
LOG_DEBUG("Processing fetch remote");
|
||||
int64_t num_objects = plasma_read_FetchRequest_num_objects(data);
|
||||
ObjectID *object_ids_to_fetch = malloc(num_objects * sizeof(ObjectID));
|
||||
ObjectID *object_ids_to_fetch =
|
||||
(ObjectID *) malloc(num_objects * sizeof(ObjectID));
|
||||
/* TODO(pcm): process_fetch_requests allocates an array of num_objects
|
||||
* object_ids too so these should be shared in the future. */
|
||||
plasma_read_FetchRequest(data, object_ids_to_fetch, num_objects);
|
||||
@@ -1344,7 +1351,7 @@ void process_message(event_loop *loop,
|
||||
LOG_DEBUG("Processing wait");
|
||||
int num_object_ids = plasma_read_WaitRequest_num_object_ids(data);
|
||||
ObjectRequest *object_requests =
|
||||
malloc(num_object_ids * sizeof(ObjectRequest));
|
||||
(ObjectRequest *) malloc(num_object_ids * sizeof(ObjectRequest));
|
||||
int64_t timeout_ms;
|
||||
int num_ready_objects;
|
||||
plasma_read_WaitRequest(data, &object_requests[0], num_object_ids,
|
||||
@@ -1386,7 +1393,8 @@ ClientConnection *ClientConnection_init(event_loop *loop,
|
||||
int events) {
|
||||
int new_socket = accept_client(listener_sock);
|
||||
/* Create a new data connection context per client. */
|
||||
ClientConnection *conn = malloc(sizeof(ClientConnection));
|
||||
ClientConnection *conn =
|
||||
(ClientConnection *) malloc(sizeof(ClientConnection));
|
||||
conn->manager_state = (plasma_manager_state *) context;
|
||||
conn->cursor = 0;
|
||||
conn->transfer_queue = NULL;
|
||||
@@ -1,11 +1,8 @@
|
||||
#include "flatbuffers/flatbuffers.h"
|
||||
#include "format/plasma_generated.h"
|
||||
|
||||
extern "C" {
|
||||
|
||||
#include "plasma_protocol.h"
|
||||
#include "io.h"
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert an object ID to a flatbuffer string.
|
||||
@@ -45,8 +42,6 @@ to_flat(flatbuffers::FlatBufferBuilder &fbb,
|
||||
return fbb.CreateVector(results);
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
|
||||
#define FLATBUFFER_BUILDER_DEFAULT_SIZE 1024
|
||||
|
||||
protocol_builder *make_protocol_builder(void) {
|
||||
@@ -652,5 +647,3 @@ void plasma_read_DataReply(uint8_t *data,
|
||||
*object_size = (int64_t) message->object_size();
|
||||
*metadata_size = (int64_t) message->metadata_size();
|
||||
}
|
||||
|
||||
} /* extern "C" */
|
||||
|
||||
@@ -1,55 +1,13 @@
|
||||
#ifndef PLASMA_PROTOCOL_H
|
||||
#define PLASMA_PROTOCOL_H
|
||||
|
||||
#include "format/plasma_generated.h"
|
||||
|
||||
#include "common.h"
|
||||
#include "plasma.h"
|
||||
|
||||
/* This is temporary to facilitate the transition between flatcc and google
|
||||
* flatbuffers. */
|
||||
|
||||
typedef int32_t MessageType_enum_t;
|
||||
#define MessageType_PlasmaCreateRequest ((MessageType_enum_t) 1L)
|
||||
#define MessageType_PlasmaCreateReply ((MessageType_enum_t) 2L)
|
||||
#define MessageType_PlasmaSealRequest ((MessageType_enum_t) 3L)
|
||||
#define MessageType_PlasmaSealReply ((MessageType_enum_t) 4L)
|
||||
#define MessageType_PlasmaGetRequest ((MessageType_enum_t) 5L)
|
||||
#define MessageType_PlasmaGetReply ((MessageType_enum_t) 6L)
|
||||
#define MessageType_PlasmaReleaseRequest ((MessageType_enum_t) 7L)
|
||||
#define MessageType_PlasmaReleaseReply ((MessageType_enum_t) 8L)
|
||||
#define MessageType_PlasmaDeleteRequest ((MessageType_enum_t) 9L)
|
||||
#define MessageType_PlasmaDeleteReply ((MessageType_enum_t) 10L)
|
||||
#define MessageType_PlasmaStatusRequest ((MessageType_enum_t) 11L)
|
||||
#define MessageType_PlasmaStatusReply ((MessageType_enum_t) 12L)
|
||||
#define MessageType_PlasmaContainsRequest ((MessageType_enum_t) 13L)
|
||||
#define MessageType_PlasmaContainsReply ((MessageType_enum_t) 14L)
|
||||
#define MessageType_PlasmaConnectRequest ((MessageType_enum_t) 15L)
|
||||
#define MessageType_PlasmaConnectReply ((MessageType_enum_t) 16L)
|
||||
#define MessageType_PlasmaEvictRequest ((MessageType_enum_t) 17L)
|
||||
#define MessageType_PlasmaEvictReply ((MessageType_enum_t) 18L)
|
||||
#define MessageType_PlasmaFetchRequest ((MessageType_enum_t) 19L)
|
||||
#define MessageType_PlasmaWaitRequest ((MessageType_enum_t) 20L)
|
||||
#define MessageType_PlasmaWaitReply ((MessageType_enum_t) 21L)
|
||||
#define MessageType_PlasmaSubscribeRequest ((MessageType_enum_t) 22L)
|
||||
#define MessageType_PlasmaUnsubscribeRequest ((MessageType_enum_t) 23L)
|
||||
#define MessageType_PlasmaDataRequest ((MessageType_enum_t) 24L)
|
||||
#define MessageType_PlasmaDataReply ((MessageType_enum_t) 25L)
|
||||
|
||||
typedef int32_t PlasmaError_enum_t;
|
||||
#define PlasmaError_OK ((PlasmaError_enum_t) 0L)
|
||||
#define PlasmaError_ObjectExists ((PlasmaError_enum_t) 1L)
|
||||
#define PlasmaError_ObjectNonexistent ((PlasmaError_enum_t) 2L)
|
||||
#define PlasmaError_OutOfMemory ((PlasmaError_enum_t) 3L)
|
||||
|
||||
typedef int32_t ObjectStatus_enum_t;
|
||||
#define ObjectStatus_Local ((ObjectStatus_enum_t) 1L)
|
||||
#define ObjectStatus_Remote ((ObjectStatus_enum_t) 2L)
|
||||
#define ObjectStatus_Nonexistent ((ObjectStatus_enum_t) 3L)
|
||||
#define ObjectStatus_Transfer ((ObjectStatus_enum_t) 4L)
|
||||
|
||||
typedef void protocol_builder;
|
||||
|
||||
/* End temporary. */
|
||||
|
||||
/* An argument to a function that a return value gets written to. */
|
||||
#define OUT
|
||||
|
||||
|
||||
@@ -31,14 +31,16 @@
|
||||
#include "io.h"
|
||||
#include "uthash.h"
|
||||
#include "utarray.h"
|
||||
#include "fling.h"
|
||||
#include "malloc.h"
|
||||
#include "plasma_protocol.h"
|
||||
#include "plasma_store.h"
|
||||
#include "plasma.h"
|
||||
|
||||
extern "C" {
|
||||
#include "fling.h"
|
||||
#include "malloc.h"
|
||||
void *dlmalloc(size_t);
|
||||
void dlfree(void *);
|
||||
}
|
||||
|
||||
/** Contains all information that is associated with a Plasma store client. */
|
||||
struct Client {
|
||||
@@ -126,12 +128,14 @@ UT_icd byte_icd = {sizeof(uint8_t), NULL, NULL, NULL};
|
||||
|
||||
PlasmaStoreState *PlasmaStoreState_init(event_loop *loop,
|
||||
int64_t system_memory) {
|
||||
PlasmaStoreState *state = malloc(sizeof(PlasmaStoreState));
|
||||
PlasmaStoreState *state =
|
||||
(PlasmaStoreState *) malloc(sizeof(PlasmaStoreState));
|
||||
state->loop = loop;
|
||||
state->object_get_requests = NULL;
|
||||
state->pending_notifications = NULL;
|
||||
/* Initialize the plasma store info. */
|
||||
state->plasma_store_info = malloc(sizeof(PlasmaStoreInfo));
|
||||
state->plasma_store_info =
|
||||
(PlasmaStoreInfo *) malloc(sizeof(PlasmaStoreInfo));
|
||||
state->plasma_store_info->objects = NULL;
|
||||
state->plasma_store_info->memory_capacity = system_memory;
|
||||
/* Initialize the eviction state. */
|
||||
@@ -202,14 +206,14 @@ int create_object(Client *client_context,
|
||||
return PlasmaError_OutOfMemory;
|
||||
}
|
||||
/* Allocate space for the new object */
|
||||
uint8_t *pointer = dlmalloc(data_size + metadata_size);
|
||||
uint8_t *pointer = (uint8_t *) dlmalloc(data_size + metadata_size);
|
||||
int fd;
|
||||
int64_t map_size;
|
||||
ptrdiff_t offset;
|
||||
get_malloc_mapinfo(pointer, &fd, &map_size, &offset);
|
||||
assert(fd != -1);
|
||||
|
||||
entry = malloc(sizeof(object_table_entry));
|
||||
entry = (object_table_entry *) malloc(sizeof(object_table_entry));
|
||||
memset(entry, 0, sizeof(object_table_entry));
|
||||
memcpy(&entry->object_id, &obj_id, sizeof(entry->object_id));
|
||||
entry->info.obj_id = obj_id;
|
||||
@@ -250,7 +254,7 @@ void add_get_request_for_object(PlasmaStoreState *store_state,
|
||||
* new ObjectGetRequests struct for this object ID and add it to the hash
|
||||
* table. */
|
||||
if (object_get_reqs == NULL) {
|
||||
object_get_reqs = malloc(sizeof(ObjectGetRequests));
|
||||
object_get_reqs = (ObjectGetRequests *) malloc(sizeof(ObjectGetRequests));
|
||||
object_get_reqs->object_id = object_id;
|
||||
utarray_new(object_get_reqs->get_requests, &get_request_icd);
|
||||
HASH_ADD(hh, store_state->object_get_requests, object_id,
|
||||
@@ -413,7 +417,7 @@ void update_object_get_requests(PlasmaStoreState *store_state,
|
||||
}
|
||||
|
||||
int get_timeout_handler(event_loop *loop, timer_id id, void *context) {
|
||||
GetRequest *get_req = context;
|
||||
GetRequest *get_req = (GetRequest *) context;
|
||||
return_from_get(get_req->client->plasma_state, get_req);
|
||||
return EVENT_LOOP_TIMER_DONE;
|
||||
}
|
||||
@@ -425,13 +429,14 @@ void process_get_request(Client *client_context,
|
||||
PlasmaStoreState *plasma_state = client_context->plasma_state;
|
||||
|
||||
/* Create a get request for this object. */
|
||||
GetRequest *get_req = malloc(sizeof(GetRequest));
|
||||
GetRequest *get_req = (GetRequest *) malloc(sizeof(GetRequest));
|
||||
memset(get_req, 0, sizeof(GetRequest));
|
||||
get_req->client = client_context;
|
||||
get_req->timer = -1;
|
||||
get_req->num_object_ids = num_object_ids;
|
||||
get_req->object_ids = malloc(num_object_ids * sizeof(ObjectID));
|
||||
get_req->objects = malloc(num_object_ids * sizeof(PlasmaObject));
|
||||
get_req->object_ids = (ObjectID *) malloc(num_object_ids * sizeof(ObjectID));
|
||||
get_req->objects =
|
||||
(PlasmaObject *) malloc(num_object_ids * sizeof(PlasmaObject));
|
||||
for (int i = 0; i < num_object_ids; ++i) {
|
||||
get_req->object_ids[i] = object_ids[i];
|
||||
}
|
||||
@@ -570,7 +575,12 @@ void delete_object(PlasmaStoreState *plasma_state, ObjectID object_id) {
|
||||
utarray_free(entry->clients);
|
||||
free(entry);
|
||||
/* Inform all subscribers that the object has been deleted. */
|
||||
ObjectInfo notification = {.obj_id = object_id, .is_deletion = true};
|
||||
ObjectInfo notification;
|
||||
/* We memset the struct here because we have to initialize the full struct.
|
||||
* However, we do not use most of the fields. */
|
||||
memset(¬ification, 0, sizeof(notification));
|
||||
notification.obj_id = object_id;
|
||||
notification.is_deletion = true;
|
||||
push_notification(plasma_state, ¬ification);
|
||||
}
|
||||
|
||||
@@ -602,7 +612,7 @@ void send_notifications(event_loop *loop,
|
||||
int client_sock,
|
||||
void *context,
|
||||
int events) {
|
||||
PlasmaStoreState *plasma_state = context;
|
||||
PlasmaStoreState *plasma_state = (PlasmaStoreState *) context;
|
||||
NotificationQueue *queue;
|
||||
HASH_FIND_INT(plasma_state->pending_notifications, &client_sock, queue);
|
||||
CHECK(queue != NULL);
|
||||
@@ -679,7 +689,7 @@ void process_message(event_loop *loop,
|
||||
int client_sock,
|
||||
void *context,
|
||||
int events) {
|
||||
Client *client_context = context;
|
||||
Client *client_context = (Client *) context;
|
||||
PlasmaStoreState *state = client_context->plasma_state;
|
||||
int64_t type;
|
||||
read_buffer(client_sock, &type, state->input_buffer);
|
||||
@@ -710,7 +720,8 @@ void process_message(event_loop *loop,
|
||||
} break;
|
||||
case MessageType_PlasmaGetRequest: {
|
||||
num_objects = plasma_read_GetRequest_num_objects(input);
|
||||
ObjectID *object_ids_to_get = malloc(num_objects * sizeof(ObjectID));
|
||||
ObjectID *object_ids_to_get =
|
||||
(ObjectID *) malloc(num_objects * sizeof(ObjectID));
|
||||
int64_t timeout_ms;
|
||||
plasma_read_GetRequest(input, object_ids_to_get, &timeout_ms, num_objects);
|
||||
/* TODO(pcm): The array object_ids_to_get could be reused in
|
||||
@@ -791,7 +802,7 @@ void new_client_connection(event_loop *loop,
|
||||
int listener_sock,
|
||||
void *context,
|
||||
int events) {
|
||||
PlasmaStoreState *plasma_state = context;
|
||||
PlasmaStoreState *plasma_state = (PlasmaStoreState *) context;
|
||||
int new_socket = accept_client(listener_sock);
|
||||
/* Create a new client object. This will also be used as the context to use
|
||||
* for events on this client's socket. TODO(rkn): free this somewhere. */
|
||||
@@ -58,7 +58,7 @@ typedef struct {
|
||||
} plasma_mock;
|
||||
|
||||
plasma_mock *init_plasma_mock(plasma_mock *remote_mock) {
|
||||
plasma_mock *mock = malloc(sizeof(plasma_mock));
|
||||
plasma_mock *mock = (plasma_mock *) malloc(sizeof(plasma_mock));
|
||||
/* Start listening on all the ports and initiate the local plasma manager. */
|
||||
mock->port = bind_inet_sock_retry(&mock->manager_remote_fd);
|
||||
mock->local_store = connect_ipc_sock_retry(plasma_store_socket_name, 5, 100);
|
||||
@@ -121,7 +121,7 @@ void destroy_plasma_mock(plasma_mock *mock) {
|
||||
TEST request_transfer_test(void) {
|
||||
plasma_mock *local_mock = init_plasma_mock(NULL);
|
||||
plasma_mock *remote_mock = init_plasma_mock(local_mock);
|
||||
const char **manager_vector = malloc(sizeof(char *));
|
||||
const char **manager_vector = (const char **) malloc(sizeof(char *));
|
||||
UT_string *addr = NULL;
|
||||
utstring_new(addr);
|
||||
utstring_printf(addr, "127.0.0.1:%d", remote_mock->port);
|
||||
@@ -164,7 +164,7 @@ TEST request_transfer_retry_test(void) {
|
||||
plasma_mock *local_mock = init_plasma_mock(NULL);
|
||||
plasma_mock *remote_mock1 = init_plasma_mock(local_mock);
|
||||
plasma_mock *remote_mock2 = init_plasma_mock(local_mock);
|
||||
const char **manager_vector = malloc(sizeof(char *) * 2);
|
||||
const char **manager_vector = (const char **) malloc(sizeof(char *) * 2);
|
||||
UT_string *addr0 = NULL;
|
||||
utstring_new(addr0);
|
||||
utstring_printf(addr0, "127.0.0.1:%d", remote_mock1->port);
|
||||
@@ -217,20 +217,18 @@ TEST read_write_object_chunk_test(void) {
|
||||
const char *data = "Hello world!";
|
||||
const int data_size = strlen(data) + 1;
|
||||
const int metadata_size = 0;
|
||||
plasma_request_buffer remote_buf = {
|
||||
.type = MessageType_PlasmaDataReply,
|
||||
.object_id = oid,
|
||||
.data = (uint8_t *) data,
|
||||
.data_size = data_size,
|
||||
.metadata = (uint8_t *) data + data_size,
|
||||
.metadata_size = metadata_size,
|
||||
};
|
||||
plasma_request_buffer local_buf = {
|
||||
.object_id = oid,
|
||||
.data_size = data_size,
|
||||
.metadata_size = metadata_size,
|
||||
.data = malloc(data_size),
|
||||
};
|
||||
plasma_request_buffer remote_buf;
|
||||
remote_buf.type = MessageType_PlasmaDataReply;
|
||||
remote_buf.object_id = oid;
|
||||
remote_buf.data = (uint8_t *) data;
|
||||
remote_buf.data_size = data_size;
|
||||
remote_buf.metadata = (uint8_t *) data + data_size;
|
||||
remote_buf.metadata_size = metadata_size;
|
||||
plasma_request_buffer local_buf;
|
||||
local_buf.object_id = oid;
|
||||
local_buf.data_size = data_size;
|
||||
local_buf.metadata_size = metadata_size;
|
||||
local_buf.data = (uint8_t *) malloc(data_size);
|
||||
/* The test:
|
||||
* - Write the object data from the remote manager to the local.
|
||||
* - Read the object data on the local manager.
|
||||
@@ -19,9 +19,9 @@ protocol_builder *g_B;
|
||||
* @return File descriptor of the file.
|
||||
*/
|
||||
int create_temp_file(void) {
|
||||
static char template[] = "/tmp/tempfileXXXXXX";
|
||||
static char temp[] = "/tmp/tempfileXXXXXX";
|
||||
char file_name[32];
|
||||
strncpy(file_name, template, 32);
|
||||
strncpy(file_name, temp, 32);
|
||||
return mkstemp(file_name);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user