handle(0),
searchDescriptors(),
onAddNotifiers(),
- onDelNotifiers()
+ onDelNotifiers(),
+ onAddNotifiersImpl(),
+ onDelNotifiersImpl()
{
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
AddUserIntoIndexes(users.begin());
SetUserNotifiers(users.begin());
-// õ×ÅÄÏÍÌÑÅÍ ×ÓÅÈ ÖÅÌÁÀÝÉÈ, ÞÔÏ ÄÏÂÁ×ÌÅÎ ÎÏ×ÙÊ ÐÏÌØÚÏ×ÁÔÅÌØ
-set<NOTIFIER_BASE<USER_PTR> *>::iterator ni = onAddNotifiers.begin();
-while (ni != onAddNotifiers.end())
{
- (*ni)->Notify(&users.front());
- ++ni;
+ // Fire all "on add" notifiers
+ set<NOTIFIER_BASE<USER_PTR> *>::iterator ni = onAddNotifiers.begin();
+ while (ni != onAddNotifiers.end())
+ {
+ (*ni)->Notify(&users.front());
+ ++ni;
+ }
+ }
+
+ {
+ // Fire all "on add" implementation notifiers
+ set<NOTIFIER_BASE<USER_IMPL_PTR> *>::iterator ni = onAddNotifiersImpl.begin();
+ while (ni != onAddNotifiersImpl.end())
+ {
+ (*ni)->Notify(&users.front());
+ ++ni;
+ }
}
return 0;
}
}
-set<NOTIFIER_BASE<USER_PTR> *>::iterator ni = onDelNotifiers.begin();
-while (ni != onDelNotifiers.end())
{
- (*ni)->Notify(&(*u));
- ++ni;
+ set<NOTIFIER_BASE<USER_PTR> *>::iterator ni = onDelNotifiers.begin();
+ while (ni != onDelNotifiers.end())
+ {
+ (*ni)->Notify(&(*u));
+ ++ni;
+ }
+ }
+
+ {
+ set<NOTIFIER_BASE<USER_IMPL_PTR> *>::iterator ni = onDelNotifiersImpl.begin();
+ while (ni != onDelNotifiersImpl.end())
+ {
+ (*ni)->Notify(&(*u));
+ ++ni;
+ }
}
{
it->WriteDetailStat(true);
for_each(users.begin(), users.end(), mem_fun_ref(&USER_IMPL::WriteStat));
-for_each(users.begin(), users.end(), mem_fun_ref(&USER_IMPL::WriteConf));
+//for_each(users.begin(), users.end(), mem_fun_ref(&USER_IMPL::WriteConf));
printfd(__FILE__, "USERS::Stop()\n");
return 0;
}
//-----------------------------------------------------------------------------
int USERS_IMPL::FindByIPIdx(uint32_t ip, USER_PTR * usr) const
+{
+ USER_IMPL * ptr = NULL;
+ if (FindByIPIdx(ip, &ptr))
+ return -1;
+ *usr = ptr;
+ return 0;
+}
+//-----------------------------------------------------------------------------
+int USERS_IMPL::FindByIPIdx(uint32_t ip, USER_IMPL ** usr) const
{
STG_LOCKER lock(&mutex, __FILE__, __LINE__);
void USERS_IMPL::DelNotifierUserAdd(NOTIFIER_BASE<USER_PTR> * n)
{
STG_LOCKER lock(&mutex, __FILE__, __LINE__);
-//printfd(__FILE__, "DelNotifierUserAdd\n");
onAddNotifiers.erase(n);
}
//-----------------------------------------------------------------------------
onDelNotifiers.erase(n);
}
//-----------------------------------------------------------------------------
+void USERS_IMPL::AddNotifierUserAdd(NOTIFIER_BASE<USER_IMPL_PTR> * n)
+{
+STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+onAddNotifiersImpl.insert(n);
+}
+//-----------------------------------------------------------------------------
+void USERS_IMPL::DelNotifierUserAdd(NOTIFIER_BASE<USER_IMPL_PTR> * n)
+{
+STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+onAddNotifiersImpl.erase(n);
+}
+//-----------------------------------------------------------------------------
+void USERS_IMPL::AddNotifierUserDel(NOTIFIER_BASE<USER_IMPL_PTR> * n)
+{
+STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+onDelNotifiersImpl.insert(n);
+}
+//-----------------------------------------------------------------------------
+void USERS_IMPL::DelNotifierUserDel(NOTIFIER_BASE<USER_IMPL_PTR> * n)
+{
+STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+onDelNotifiersImpl.erase(n);
+}
+//-----------------------------------------------------------------------------
int USERS_IMPL::OpenSearch()
{
STG_LOCKER lock(&mutex, __FILE__, __LINE__);
}
//-----------------------------------------------------------------------------
int USERS_IMPL::SearchNext(int h, USER_PTR * user)
+{
+ USER_IMPL * ptr = NULL;
+ if (SearchNext(h, &ptr))
+ return -1;
+ *user = ptr;
+ return 0;
+}
+//-----------------------------------------------------------------------------
+int USERS_IMPL::SearchNext(int h, USER_IMPL ** user)
{
STG_LOCKER lock(&mutex, __FILE__, __LINE__);