Files
ray/src/plasma/plasma.c
T
IonandRobert Nishihara f89be9699c Introduce non-blocking Plasma API. (#71)
* Implement new plasma client API.

* Formatting fixes.

* Make tests work again.

* Make tests run.

* Comment style.

* Fix bugs with fetch tests.

* Introduce fetch1 flag.

* Remove timer only if present.

* Formatting fixes.

* Don't access object after free.

* Formatting fixes.

* Minor change.

* refactoring plasma datastructures

* Change plasma_request and plasma_reply to use only arrays of object requests.

* some more fixes

* Remove unnecessary methods.

* Trivial.

* fixes

* use plasma_send_reply in return_from_wait1

* Lint.
2016-12-01 02:15:21 -08:00

97 lines
2.7 KiB
C

#include "plasma.h"
#include "io.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
plasma_request plasma_make_request(object_id object_id) {
plasma_request request;
memset(&request, 0, sizeof(request));
request.num_object_ids = 1;
request.object_requests[0].object_id = object_id;
return request;
}
plasma_request *plasma_alloc_request(int num_object_ids) {
DCHECK(num_object_ids >= 1);
int req_size = plasma_request_size(num_object_ids);
plasma_request *req = malloc(req_size);
memset(req, 0, req_size);
req->num_object_ids = num_object_ids;
return req;
}
void plasma_free_request(plasma_request *request) {
free(request);
}
int64_t plasma_request_size(int num_object_ids) {
int64_t object_ids_size = (num_object_ids - 1) * sizeof(object_request);
return sizeof(plasma_request) + object_ids_size;
}
plasma_reply plasma_make_reply(object_id object_id) {
plasma_reply reply;
memset(&reply, 0, sizeof(reply));
reply.num_object_ids = 1;
reply.object_requests[0].object_id = object_id;
return reply;
}
plasma_reply *plasma_alloc_reply(int num_object_ids) {
DCHECK(num_object_ids >= 1);
int64_t size = plasma_reply_size(num_object_ids);
plasma_reply *reply = malloc(size);
memset(reply, 0, size);
reply->num_object_ids = num_object_ids;
return reply;
}
void plasma_free_reply(plasma_reply *reply) {
free(reply);
}
int64_t plasma_reply_size(int num_object_ids) {
DCHECK(num_object_ids >= 1);
return sizeof(plasma_reply) + (num_object_ids - 1) * sizeof(object_request);
}
int plasma_send_reply(int sock, plasma_reply *reply) {
DCHECK(reply);
int64_t reply_size = plasma_reply_size(reply->num_object_ids);
return write_bytes(sock, (uint8_t *) reply, reply_size);
}
int plasma_receive_reply(int sock, int64_t reply_size, plasma_reply *reply) {
return read_bytes(sock, (uint8_t *) reply, reply_size);
}
int plasma_send_request(int sock, int64_t type, plasma_request *request) {
DCHECK(request);
int req_size = plasma_request_size(request->num_object_ids);
int error = write_message(sock, type, req_size, (uint8_t *) request);
return error ? -1 : 0;
}
int plasma_receive_request(int sock, int64_t *type, plasma_request **request) {
int64_t length;
read_message(sock, type, &length, (uint8_t **) request);
if (*request == NULL) {
return *type == DISCONNECT_CLIENT;
}
int req_size = plasma_request_size((*request)->num_object_ids);
return length == req_size ? 0 : -1;
}
bool plasma_object_ids_distinct(int num_object_ids, object_id object_ids[]) {
for (int i = 0; i < num_object_ids; ++i) {
for (int j = 0; j < i; ++j) {
if (object_ids_equal(object_ids[i], object_ids[j])) {
return false;
}
}
}
return true;
}