scheduling using real slots number
This commit is contained in:
parent
8db4458375
commit
780e9fb313
22 changed files with 980 additions and 105 deletions
|
|
@ -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));
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue