| bmc.c | bmc.c | |||
|---|---|---|---|---|
| skipping to change at line 35 | skipping to change at line 35 | |||
| #include <qb/qbutil.h> | #include <qb/qbutil.h> | |||
| #include <qb/qbipcc.h> | #include <qb/qbipcc.h> | |||
| #define ITERATIONS 10000 | #define ITERATIONS 10000 | |||
| pid_t mypid; | pid_t mypid; | |||
| int32_t blocking = QB_TRUE; | int32_t blocking = QB_TRUE; | |||
| int32_t events = QB_FALSE; | int32_t events = QB_FALSE; | |||
| int32_t verbose = 0; | int32_t verbose = 0; | |||
| static qb_ipcc_connection_t *conn; | static qb_ipcc_connection_t *conn; | |||
| #define MAX_MSG_SIZE (8192*128) | #define MAX_MSG_SIZE (8192*128) | |||
| static qb_util_stopwatch_t *sw; | ||||
| static struct timeval tv1, tv2, tv_elapsed; | ||||
| #ifndef QB_BSD | ||||
| #define timersub(a, b, result) \ | ||||
| do { \ | ||||
| (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ | ||||
| (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ | ||||
| if ((result)->tv_usec < 0) { \ | ||||
| --(result)->tv_sec; \ | ||||
| (result)->tv_usec += 1000000; \ | ||||
| } \ | ||||
| } while (0) | ||||
| #endif | ||||
| static void bm_start(void) | ||||
| { | ||||
| gettimeofday(&tv1, NULL); | ||||
| } | ||||
| static void bm_finish(const char *operation, int32_t size) | static void bm_finish(const char *operation, int32_t size) | |||
| { | { | |||
| float ops_per_sec; | float ops_per_sec; | |||
| float mbs_per_sec; | float mbs_per_sec; | |||
| float elapsed; | ||||
| gettimeofday(&tv2, NULL); | qb_util_stopwatch_stop(sw); | |||
| timersub(&tv2, &tv1, &tv_elapsed); | elapsed = qb_util_stopwatch_sec_elapsed_get(sw); | |||
| ops_per_sec = ((float)ITERATIONS) / elapsed; | ||||
| ops_per_sec = | mbs_per_sec = ((((float)ITERATIONS) * size) / elapsed) / (1024.0 * 1 | |||
| ((float)ITERATIONS) / (((float)tv_elapsed.tv_sec) + | 024.0); | |||
| (((float)tv_elapsed.tv_usec) / 1000000.0) | ||||
| ); | ||||
| mbs_per_sec = | ||||
| ((((float)ITERATIONS) * size) / | ||||
| (((float)tv_elapsed.tv_sec) + | ||||
| (((float)tv_elapsed.tv_usec) / 1000000.0))) / (1024.0 * 1024.0 | ||||
| ); | ||||
| printf("write size, %d, OPs/sec, %9.3f, ", size, ops_per_sec); | printf("write size, %d, OPs/sec, %9.3f, ", size, ops_per_sec); | |||
| printf("MB/sec, %9.3f\n", mbs_per_sec); | printf("MB/sec, %9.3f\n", mbs_per_sec); | |||
| } | } | |||
| static char buffer[1024 * 1024]; | struct my_req { | |||
| struct qb_ipc_request_header hdr; | ||||
| char message[1024 * 1024]; | ||||
| }; | ||||
| static struct my_req request; | ||||
| static int32_t bmc_send_nozc(uint32_t size) | static int32_t bmc_send_nozc(uint32_t size) | |||
| { | { | |||
| struct qb_ipc_request_header *req_header = (struct qb_ipc_request_he ader *)buffer; | ||||
| struct qb_ipc_response_header res_header; | struct qb_ipc_response_header res_header; | |||
| int32_t res; | int32_t res; | |||
| req_header->id = QB_IPC_MSG_USER_START + 3; | request.hdr.id = QB_IPC_MSG_USER_START + 3; | |||
| req_header->size = sizeof(struct qb_ipc_request_header) + size; | request.hdr.size = sizeof(struct qb_ipc_request_header) + size; | |||
| repeat_send: | repeat_send: | |||
| res = qb_ipcc_send(conn, req_header, req_header->size); | res = qb_ipcc_send(conn, &request, request.hdr.size); | |||
| if (res < 0) { | if (res < 0) { | |||
| if (res == -EAGAIN) { | if (res == -EAGAIN) { | |||
| goto repeat_send; | goto repeat_send; | |||
| } else if (res == -EINVAL || res == -EINTR || res == -ENOTCO NN) { | } else if (res == -EINVAL || res == -EINTR || res == -ENOTCO NN) { | |||
| perror("qb_ipcc_send"); | perror("qb_ipcc_send"); | |||
| return -1; | return -1; | |||
| } else { | } else { | |||
| errno = -res; | errno = -res; | |||
| perror("qb_ipcc_send"); | perror("qb_ipcc_send"); | |||
| goto repeat_send; | goto repeat_send; | |||
| skipping to change at line 201 | skipping to change at line 182 | |||
| signal(SIGINT, sigterm_handler); | signal(SIGINT, sigterm_handler); | |||
| signal(SIGILL, sigterm_handler); | signal(SIGILL, sigterm_handler); | |||
| signal(SIGTERM, sigterm_handler); | signal(SIGTERM, sigterm_handler); | |||
| conn = qb_ipcc_connect("bm1", MAX_MSG_SIZE); | conn = qb_ipcc_connect("bm1", MAX_MSG_SIZE); | |||
| if (conn == NULL) { | if (conn == NULL) { | |||
| perror("qb_ipcc_connect"); | perror("qb_ipcc_connect"); | |||
| exit(1); | exit(1); | |||
| } | } | |||
| sw = qb_util_stopwatch_create(); | ||||
| size = QB_MAX(sizeof(struct qb_ipc_request_header), 64); | size = QB_MAX(sizeof(struct qb_ipc_request_header), 64); | |||
| for (j = 0; j < 20; j++) { | for (j = 0; j < 20; j++) { | |||
| if (size >= MAX_MSG_SIZE) | if (size >= MAX_MSG_SIZE) | |||
| break; | break; | |||
| bm_start(); | qb_util_stopwatch_start(sw); | |||
| for (i = 0; i < ITERATIONS; i++) { | for (i = 0; i < ITERATIONS; i++) { | |||
| if (bmc_send_nozc(size) == -1) { | if (bmc_send_nozc(size) == -1) { | |||
| break; | break; | |||
| } | } | |||
| } | } | |||
| bm_finish("send_nozc", size); | bm_finish("send_nozc", size); | |||
| size *= 2; | size *= 2; | |||
| } | } | |||
| qb_ipcc_disconnect(conn); | qb_ipcc_disconnect(conn); | |||
| End of changes. 9 change blocks. | ||||
| 38 lines changed or deleted | 19 lines changed or added | |||
This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||