VARS_LOCK,
COMP_POOL_LOCK,
LUA_LOCK,
+ NOTIF_LOCK,
LOCK_LABELS
};
struct lock_stat {
"LISTENER", "LISTENER_QUEUE", "PROXY", "SERVER",
"UPDATED_SERVERS", "LBPRM", "SIGNALS", "STK_TABLE", "STK_SESS",
"APPLETS", "PEER", "BUF_WQ", "STREAMS", "SSL", "SSL_GEN_CERTS",
- "PATREF", "PATEXP", "PATLRU", "VARS", "COMP_POOL", "LUA" };
+ "PATREF", "PATEXP", "PATLRU", "VARS", "COMP_POOL", "LUA",
+ "NOTIF" };
int lbl;
for (lbl = 0; lbl < LOCK_LABELS; lbl++) {
return NULL;
LIST_ADDQ(purge, &com->purge_me);
LIST_ADDQ(event, &com->wake_me);
+ SPIN_INIT(&com->lock);
com->task = wakeup;
return com;
}
/* Delete all pending communication signals. */
list_for_each_entry_safe(com, back, purge, purge_me) {
+ SPIN_LOCK(NOTIF_LOCK, &com->lock);
LIST_DEL(&com->purge_me);
- LIST_DEL(&com->wake_me);
- pool_free2(pool2_notification, com);
+ if (!com->task) {
+ SPIN_UNLOCK(NOTIF_LOCK, &com->lock);
+ pool_free2(pool2_notification, com);
+ continue;
+ }
+ com->task = NULL;
+ SPIN_UNLOCK(NOTIF_LOCK, &com->lock);
}
}
/* Wake task and delete all pending communication signals. */
list_for_each_entry_safe(com, back, wake, wake_me) {
- LIST_DEL(&com->purge_me);
+ SPIN_LOCK(NOTIF_LOCK, &com->lock);
LIST_DEL(&com->wake_me);
+ if (!com->task) {
+ SPIN_UNLOCK(NOTIF_LOCK, &com->lock);
+ pool_free2(pool2_notification, com);
+ continue;
+ }
task_wakeup(com->task, TASK_WOKEN_MSG);
- pool_free2(pool2_notification, com);
+ com->task = NULL;
+ SPIN_UNLOCK(NOTIF_LOCK, &com->lock);
}
}