int bs_reserve_job(int fd, char *command, BSJ **result) { BSJ *job; BSM *message; // XXX: debug // struct timeval start, end; // gettimeofday(&start, 0); BS_SEND(fd, command, strlen(command)); message = bs_recv_message(fd, BS_MESSAGE_HAS_BODY); BS_CHECK_MESSAGE(message); if (BS_STATUS_IS(message->status, bs_resp_reserved)) { *result = job = (BSJ*)malloc(sizeof(BSJ)); if (!job) { bs_free_message(message); return BS_STATUS_FAIL; } sscanf(message->status + strlen(bs_resp_reserved) + 1, "%d %lu", &job->id, &job->size); job->data = message->data; message->data = 0; bs_free_message(message); // XXX: debug // gettimeofday(&end, 0); // printf("elapsed: %lu\n", (end.tv_sec * 1000000 + end.tv_usec) - (start.tv_sec * 1000000 + start.tv_usec)); return BS_STATUS_OK; } // i don't think we'll ever hit this status code here. BS_RETURN_FAIL_WHEN(message, bs_resp_timed_out, BS_STATUS_TIMED_OUT); BS_RETURN_FAIL_WHEN(message, bs_resp_deadline_soon, BS_STATUS_DEADLINE_SOON); BS_RETURN_INVALID(message); }
int bs_release(int fd, int id, int priority, int delay) { BSM *message; char command[512]; snprintf(command, 512, "release %d %d %d\r\n", id, priority, delay); BS_SEND(fd, command, strlen(command)); message = bs_recv_message(fd, BS_MESSAGE_NO_BODY); BS_CHECK_MESSAGE(message); BS_RETURN_OK_WHEN(message, bs_resp_released); BS_RETURN_FAIL_WHEN(message, bs_resp_buried, BS_STATUS_BURIED); BS_RETURN_FAIL_WHEN(message, bs_resp_not_found, BS_STATUS_NOT_FOUND); BS_RETURN_INVALID(message); }
int bs_peek_job(int fd, char *command, BSJ **result) { BSJ *job; BSM *message; BS_SEND(fd, command, strlen(command)); message = bs_recv_message(fd, BS_MESSAGE_HAS_BODY); BS_CHECK_MESSAGE(message); if (BS_STATUS_IS(message->status, bs_resp_found)) { *result = job = (BSJ*)malloc(sizeof(BSJ)); if (!job) { bs_free_message(message); return BS_STATUS_FAIL; } sscanf(message->status + strlen(bs_resp_found) + 1, "%d %lu", &job->id, &job->size); job->data = message->data; message->data = 0; bs_free_message(message); return BS_STATUS_OK; } BS_RETURN_FAIL_WHEN(message, bs_resp_not_found, BS_STATUS_NOT_FOUND); BS_RETURN_INVALID(message); }
int bs_touch(int fd, int id) { BSM *message; char command[512]; snprintf(command, 512, "touch %d\r\n", id); BS_SEND(fd, command, strlen(command)); message = bs_recv_message(fd, BS_MESSAGE_NO_BODY); BS_CHECK_MESSAGE(message); BS_RETURN_OK_WHEN(message, bs_resp_touched); BS_RETURN_FAIL_WHEN(message, bs_resp_not_found, BS_STATUS_NOT_FOUND); BS_RETURN_INVALID(message); }
int bs_bury(int fd, int64_t id, uint32_t priority) { BSM *message; char command[512]; snprintf(command, 512, "bury %"PRId64" %"PRIu32"\r\n", id, priority); BS_SEND(fd, command, strlen(command)); message = bs_recv_message(fd, BS_MESSAGE_NO_BODY); BS_CHECK_MESSAGE(message); BS_RETURN_OK_WHEN(message, bs_resp_buried); BS_RETURN_FAIL_WHEN(message, bs_resp_not_found, BS_STATUS_NOT_FOUND); BS_RETURN_INVALID(message); }
int bs_delete(int fd, int64_t job) { BSM *message; char command[512]; snprintf(command, 512, "delete %"PRId64"\r\n", job); BS_SEND(fd, command, strlen(command)); message = bs_recv_message(fd, BS_MESSAGE_NO_BODY); BS_CHECK_MESSAGE(message); BS_RETURN_OK_WHEN(message, bs_resp_deleted); BS_RETURN_FAIL_WHEN(message, bs_resp_not_found, BS_STATUS_NOT_FOUND); BS_RETURN_INVALID(message); }
int bs_put(int fd, int priority, int delay, int ttr, char *data, size_t bytes) { int id; BSMP *packet; BSM *message; char command[1024]; size_t command_bytes; snprintf(command, 1024, "put %d %d %d %lu\r\n", priority, delay, ttr, bytes); command_bytes = strlen(command); packet = bs_message_packet_new(command_bytes + bytes + 3); bs_message_packet_append(packet, command, command_bytes); bs_message_packet_append(packet, data, bytes); bs_message_packet_append(packet, "\r\n", 2); BS_SEND(fd, packet->data, packet->offset); bs_message_packet_free(packet); message = bs_recv_message(fd, BS_MESSAGE_NO_BODY); BS_CHECK_MESSAGE(message); if (BS_STATUS_IS(message->status, bs_resp_inserted)) { id = atoi(message->status + strlen(bs_resp_inserted) + 1); bs_free_message(message); return id; } if (BS_STATUS_IS(message->status, bs_resp_buried)) { id = atoi(message->status + strlen(bs_resp_buried) + 1); bs_free_message(message); return id; } BS_RETURN_FAIL_WHEN(message, bs_resp_expected_crlf, BS_STATUS_EXPECTED_CRLF); BS_RETURN_FAIL_WHEN(message, bs_resp_job_too_big, BS_STATUS_JOB_TOO_BIG); BS_RETURN_FAIL_WHEN(message, bs_resp_draining, BS_STATUS_DRAINING); BS_RETURN_INVALID(message); }