| 1408 | } |
| 1409 | |
| 1410 | int |
| 1411 | rte_mempool_event_callback_register(rte_mempool_event_callback *func, |
| 1412 | void *user_data) |
| 1413 | { |
| 1414 | struct mempool_callback_data *cb; |
| 1415 | int ret; |
| 1416 | |
| 1417 | if (func == NULL) { |
| 1418 | rte_errno = EINVAL; |
| 1419 | return -rte_errno; |
| 1420 | } |
| 1421 | |
| 1422 | rte_mcfg_tailq_write_lock(); |
| 1423 | TAILQ_FOREACH(cb, &callback_tailq, callbacks) { |
| 1424 | if (cb->func == func && cb->user_data == user_data) { |
| 1425 | ret = -EEXIST; |
| 1426 | goto exit; |
| 1427 | } |
| 1428 | } |
| 1429 | |
| 1430 | cb = calloc(1, sizeof(*cb)); |
| 1431 | if (cb == NULL) { |
| 1432 | RTE_LOG(ERR, MEMPOOL, "Cannot allocate event callback!\n"); |
| 1433 | ret = -ENOMEM; |
| 1434 | goto exit; |
| 1435 | } |
| 1436 | |
| 1437 | cb->func = func; |
| 1438 | cb->user_data = user_data; |
| 1439 | TAILQ_INSERT_TAIL(&callback_tailq, cb, callbacks); |
| 1440 | ret = 0; |
| 1441 | |
| 1442 | exit: |
| 1443 | rte_mcfg_tailq_write_unlock(); |
| 1444 | rte_errno = -ret; |
| 1445 | return ret; |
| 1446 | } |
| 1447 | |
| 1448 | int |
| 1449 | rte_mempool_event_callback_unregister(rte_mempool_event_callback *func, |