summaryrefslogtreecommitdiffstats
path: root/xlators/protocol/client/src/saved-frames.c
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/protocol/client/src/saved-frames.c')
-rw-r--r--xlators/protocol/client/src/saved-frames.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/xlators/protocol/client/src/saved-frames.c b/xlators/protocol/client/src/saved-frames.c
index 0d1366d8222..6f5b32aedb1 100644
--- a/xlators/protocol/client/src/saved-frames.c
+++ b/xlators/protocol/client/src/saved-frames.c
@@ -87,9 +87,9 @@ saved_frames_put (struct saved_frames *frames, call_frame_t *frame,
saved_frame->type = type;
saved_frame->callid = callid;
-// gettimeofday (&saved_frame->saved_at, NULL);
+ gettimeofday (&saved_frame->saved_at, NULL);
- list_add (&saved_frame->list, &head_frame->list);
+ list_add_tail (&saved_frame->list, &head_frame->list);
frames->count++;
return 0;
@@ -124,6 +124,26 @@ saved_frames_get (struct saved_frames *frames, int32_t op,
return frame;
}
+struct saved_frame *
+saved_frames_get_timedout (struct saved_frames *frames, int8_t type,
+ uint32_t timeout, struct timeval *current)
+{
+ struct saved_frame *bailout_frame = NULL, *tmp = NULL;
+ struct saved_frame *head_frame = NULL;
+
+ head_frame = get_head_frame_for_type (frames, type);
+
+ if (!list_empty(&head_frame->list)) {
+ tmp = list_entry (head_frame->list.next, typeof (*tmp), list);
+ if ((tmp->saved_at.tv_sec + timeout) < current->tv_sec) {
+ bailout_frame = tmp;
+ list_del_init (&bailout_frame->list);
+ frames->count--;
+ }
+ }
+
+ return bailout_frame;
+}
void
saved_frames_unwind (xlator_t *this, struct saved_frames *saved_frames,