mirror of
https://github.com/cuberite/libevent.git
synced 2025-09-09 12:28:19 -04:00
Add the abilitity to mark some buffer callbacks as never-deferred.
This commit is contained in:
parent
689fc091a5
commit
438f9ed26c
48
buffer.c
48
buffer.c
@ -123,13 +123,6 @@ static int use_mmap = 1;
|
|||||||
/* Mask of all internal-use-only flags. */
|
/* Mask of all internal-use-only flags. */
|
||||||
#define EVBUFFER_CB_INTERNAL_FLAGS 0xffff0000
|
#define EVBUFFER_CB_INTERNAL_FLAGS 0xffff0000
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* Flag set on suspended callbacks. */
|
|
||||||
#define EVBUFFER_CB_SUSPENDED 0x00010000
|
|
||||||
/* Flag set if we should invoke the callback on wakeup. */
|
|
||||||
#define EVBUFFER_CB_CALL_ON_UNSUSPEND 0x00020000
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Flag set if the callback is using the cb_obsolete function pointer */
|
/* Flag set if the callback is using the cb_obsolete function pointer */
|
||||||
#define EVBUFFER_CB_OBSOLETE 0x00040000
|
#define EVBUFFER_CB_OBSOLETE 0x00040000
|
||||||
|
|
||||||
@ -334,11 +327,23 @@ evbuffer_set_parent(struct evbuffer *buf, struct bufferevent *bev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
evbuffer_run_callbacks(struct evbuffer *buffer)
|
evbuffer_run_callbacks(struct evbuffer *buffer, int running_deferred)
|
||||||
{
|
{
|
||||||
struct evbuffer_cb_entry *cbent, *next;
|
struct evbuffer_cb_entry *cbent, *next;
|
||||||
struct evbuffer_cb_info info;
|
struct evbuffer_cb_info info;
|
||||||
size_t new_size;
|
size_t new_size;
|
||||||
|
uint32_t mask, masked_val;
|
||||||
|
|
||||||
|
if (running_deferred) {
|
||||||
|
mask = EVBUFFER_CB_NODEFER|EVBUFFER_CB_ENABLED;
|
||||||
|
masked_val = EVBUFFER_CB_ENABLED;
|
||||||
|
} else if (buffer->deferred_cbs) {
|
||||||
|
mask = EVBUFFER_CB_NODEFER|EVBUFFER_CB_ENABLED;
|
||||||
|
masked_val = EVBUFFER_CB_NODEFER|EVBUFFER_CB_ENABLED;
|
||||||
|
} else {
|
||||||
|
mask = EVBUFFER_CB_ENABLED;
|
||||||
|
masked_val = EVBUFFER_CB_ENABLED;
|
||||||
|
}
|
||||||
|
|
||||||
ASSERT_EVBUFFER_LOCKED(buffer);
|
ASSERT_EVBUFFER_LOCKED(buffer);
|
||||||
|
|
||||||
@ -362,18 +367,15 @@ evbuffer_run_callbacks(struct evbuffer *buffer)
|
|||||||
/* Get the 'next' pointer now in case this callback decides
|
/* Get the 'next' pointer now in case this callback decides
|
||||||
* to remove itself or something. */
|
* to remove itself or something. */
|
||||||
next = TAILQ_NEXT(cbent, next);
|
next = TAILQ_NEXT(cbent, next);
|
||||||
if ((cbent->flags & EVBUFFER_CB_ENABLED)) {
|
|
||||||
#if 0
|
if ((cbent->flags & mask) != masked_val)
|
||||||
if ((cbent->flags & EVBUFFER_CB_SUSPENDED))
|
continue;
|
||||||
cbent->flags |= EVBUFFER_CB_CALL_ON_UNSUSPEND;
|
|
||||||
else
|
if ((cbent->flags & EVBUFFER_CB_OBSOLETE))
|
||||||
#endif
|
cbent->cb.cb_obsolete(buffer,
|
||||||
if ((cbent->flags & EVBUFFER_CB_OBSOLETE))
|
info.orig_size, new_size, cbent->cbarg);
|
||||||
cbent->cb.cb_obsolete(buffer,
|
else
|
||||||
info.orig_size, new_size, cbent->cbarg);
|
cbent->cb.cb_func(buffer, &info, cbent->cbarg);
|
||||||
else
|
|
||||||
cbent->cb.cb_func(buffer, &info, cbent->cbarg);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -388,9 +390,9 @@ evbuffer_invoke_callbacks(struct evbuffer *buffer)
|
|||||||
bufferevent_incref(buffer->parent);
|
bufferevent_incref(buffer->parent);
|
||||||
EVBUFFER_UNLOCK(buffer);
|
EVBUFFER_UNLOCK(buffer);
|
||||||
event_deferred_cb_schedule(buffer->cb_queue, &buffer->deferred);
|
event_deferred_cb_schedule(buffer->cb_queue, &buffer->deferred);
|
||||||
} else {
|
|
||||||
evbuffer_run_callbacks(buffer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
evbuffer_run_callbacks(buffer, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -403,7 +405,7 @@ evbuffer_deferred_callback(struct deferred_cb *cb, void *arg)
|
|||||||
* lock */
|
* lock */
|
||||||
EVBUFFER_LOCK(buffer);
|
EVBUFFER_LOCK(buffer);
|
||||||
parent = buffer->parent;
|
parent = buffer->parent;
|
||||||
evbuffer_run_callbacks(buffer);
|
evbuffer_run_callbacks(buffer, 1);
|
||||||
_evbuffer_decref_and_unlock(buffer);
|
_evbuffer_decref_and_unlock(buffer);
|
||||||
if (parent)
|
if (parent)
|
||||||
bufferevent_free(parent);
|
bufferevent_free(parent);
|
||||||
|
@ -443,8 +443,8 @@ bufferevent_setwatermark(struct bufferevent *bufev, short events,
|
|||||||
bufev);
|
bufev);
|
||||||
}
|
}
|
||||||
evbuffer_cb_set_flags(bufev->input,
|
evbuffer_cb_set_flags(bufev->input,
|
||||||
bufev_private->read_watermarks_cb,
|
bufev_private->read_watermarks_cb,
|
||||||
EVBUFFER_CB_ENABLED);
|
EVBUFFER_CB_ENABLED|EVBUFFER_CB_NODEFER);
|
||||||
|
|
||||||
if (evbuffer_get_length(bufev->input) > highmark)
|
if (evbuffer_get_length(bufev->input) > highmark)
|
||||||
bufferevent_wm_suspend_read(bufev);
|
bufferevent_wm_suspend_read(bufev);
|
||||||
|
@ -610,6 +610,9 @@ int evbuffer_remove_cb(struct evbuffer *buffer, evbuffer_cb_func cb, void *cbarg
|
|||||||
* should not be invoked. */
|
* should not be invoked. */
|
||||||
#define EVBUFFER_CB_ENABLED 1
|
#define EVBUFFER_CB_ENABLED 1
|
||||||
|
|
||||||
|
/* Experimental cb flag: "never deferred" */
|
||||||
|
#define EVBUFFER_CB_NODEFER 2
|
||||||
|
|
||||||
/** Change the flags that are set for a callback on a buffer by adding more.
|
/** Change the flags that are set for a callback on a buffer by adding more.
|
||||||
|
|
||||||
@param buffer the evbuffer that the callback is watching.
|
@param buffer the evbuffer that the callback is watching.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user