scheduling using real slots number

This commit is contained in:
Rongsong Shen 2025-12-30 18:13:15 +08:00
parent 8db4458375
commit 780e9fb313
22 changed files with 980 additions and 105 deletions

View file

@ -189,6 +189,40 @@ int zarray_iter(zarray_t* array, zarray_iter_fn_t f, void* arg)
return rc;
}
void* zarray_find(zarray_t* array, zarray_find_cond_fn_t fn, ...)
{
int i;
va_list ap;
void* data = NULL;
if ((array == NULL) || (fn == NULL)) {
errno = EINVAL;
return NULL;
}
va_start(ap, fn);
mylock_lock(&(array->lock));
for (i = 0; i < array->caps; i++) {
va_list ap1;
int rc;
va_copy(ap1, ap);
rc = fn(array->data[i], ap1);
va_end(ap1);
if (rc) {
data = array->data[i];
break;
}
}
mylock_unlock(&(array->lock));
va_end(ap);
return data;
}
int zarray_del(zarray_t* array, int idx)
{
void* ptr = NULL;
@ -197,10 +231,14 @@ int zarray_del(zarray_t* array, int idx)
return -EINVAL;
}
if ((idx < 0) && (idx >= array->caps)) {
if (idx < 0) {
return -EINVAL;
}
if (idx >= array->caps) {
return 0;
}
mylock_lock(&(array->lock));
ptr = array->data[idx];
array->data[idx] = NULL;
@ -273,32 +311,22 @@ int zarray_put(zarray_t* array, int idx, void* data)
int zarray_get_ex(zarray_t* array, int count, int* idxs, void** data)
{
int i, maxid;
int i;
if ((array == NULL) || (count <= 0) || (idxs == NULL) || (data == NULL)) {
return -EINVAL;
}
maxid = 0;
for (i = 0; i < count; i++) {
if (idxs[i] < 0) {
return -EINVAL;
}
if (idxs[i] > maxid) {
maxid = idxs[i];
}
}
if (maxid >= array->caps) {
return -EINVAL;
}
mylock_lock(&(array->lock));
for (i = 0; i < count; i++) {
int idx = idxs[i];
data[i] = array->data[idx];
if (idx >= array->caps) {
data[i] = NULL;
}
else {
data[i] = array->data[idx];
}
}
mylock_unlock(&(array->lock));