Fixed BUG in FindUnit() and Register/UnregisterInterface().
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@5160 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -88,7 +88,7 @@ deleter_thread(void *data)
|
|||||||
manager->DeleterThreadEvent();
|
manager->DeleterThreadEvent();
|
||||||
|
|
||||||
// check if the manager is being destroyed
|
// check if the manager is being destroyed
|
||||||
if(receive_data_with_timeout(&sender, &code, NULL, 0, 50000) == B_OK)
|
if(receive_data_with_timeout(&sender, &code, NULL, 0, 500) == B_OK)
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -261,6 +261,7 @@ PPPManager::CreateInterface(const driver_settings *settings,
|
|||||||
interface_entry *entry = new interface_entry;
|
interface_entry *entry = new interface_entry;
|
||||||
entry->accessing = 1;
|
entry->accessing = 1;
|
||||||
entry->deleting = false;
|
entry->deleting = false;
|
||||||
|
fRegisterRequestor = PPP_UNDEFINED_INTERFACE_ID;
|
||||||
entry->interface = new PPPInterface(id, settings,
|
entry->interface = new PPPInterface(id, settings,
|
||||||
parentEntry ? parentEntry->interface : NULL);
|
parentEntry ? parentEntry->interface : NULL);
|
||||||
|
|
||||||
@@ -269,8 +270,10 @@ PPPManager::CreateInterface(const driver_settings *settings,
|
|||||||
delete entry;
|
delete entry;
|
||||||
return PPP_UNDEFINED_INTERFACE_ID;
|
return PPP_UNDEFINED_INTERFACE_ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
fEntries.AddItem(entry);
|
fEntries.AddItem(entry);
|
||||||
|
if(fRegisterRequestor == id)
|
||||||
|
entry->interface->RegisterInterface();
|
||||||
|
|
||||||
locker.UnlockNow();
|
locker.UnlockNow();
|
||||||
|
|
||||||
if(!Report(PPP_MANAGER_REPORT, PPP_REPORT_INTERFACE_CREATED,
|
if(!Report(PPP_MANAGER_REPORT, PPP_REPORT_INTERFACE_CREATED,
|
||||||
@@ -332,6 +335,8 @@ PPPManager::RegisterInterface(interface_id ID)
|
|||||||
|
|
||||||
LockerHelper locker(fLock);
|
LockerHelper locker(fLock);
|
||||||
|
|
||||||
|
fRegisterRequestor = ID;
|
||||||
|
|
||||||
interface_entry *entry = EntryFor(ID);
|
interface_entry *entry = EntryFor(ID);
|
||||||
if(!entry || entry->deleting)
|
if(!entry || entry->deleting)
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -354,7 +359,7 @@ PPPManager::RegisterInterface(interface_id ID)
|
|||||||
ifp->ioctl = ppp_ifnet_ioctl;
|
ifp->ioctl = ppp_ifnet_ioctl;
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
printf("PPPManager::DeleteInterface(): Created new ifnet: %s%d\n",
|
printf("PPPManager::RegisterInterface(): Created new ifnet: %s%d\n",
|
||||||
ifp->name, ifp->if_unit);
|
ifp->name, ifp->if_unit);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -372,6 +377,9 @@ PPPManager::UnregisterInterface(interface_id ID)
|
|||||||
|
|
||||||
LockerHelper locker(fLock);
|
LockerHelper locker(fLock);
|
||||||
|
|
||||||
|
if(fRegisterRequestor == ID)
|
||||||
|
fRegisterRequestor = PPP_UNDEFINED_INTERFACE_ID;
|
||||||
|
|
||||||
interface_entry *entry = EntryFor(ID);
|
interface_entry *entry = EntryFor(ID);
|
||||||
if(!entry)
|
if(!entry)
|
||||||
return false;
|
return false;
|
||||||
@@ -677,7 +685,7 @@ PPPManager::FindUnit() const
|
|||||||
qsort(units, fEntries.CountItems(), sizeof(int32), greater);
|
qsort(units, fEntries.CountItems(), sizeof(int32), greater);
|
||||||
|
|
||||||
int32 unit = 0;
|
int32 unit = 0;
|
||||||
for(int32 index = 0; index < fEntries.CountItems() - 1; index++) {
|
for(int32 index = 0; index < fEntries.CountItems(); index++) {
|
||||||
if(units[index] > unit)
|
if(units[index] > unit)
|
||||||
return unit;
|
return unit;
|
||||||
else if(units[index] == unit)
|
else if(units[index] == unit)
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ class PPPManager {
|
|||||||
BLocker fLock, fReportLock;
|
BLocker fLock, fReportLock;
|
||||||
PPPReportManager fReportManager;
|
PPPReportManager fReportManager;
|
||||||
List<interface_entry*> fEntries;
|
List<interface_entry*> fEntries;
|
||||||
interface_id fNextID;
|
interface_id fNextID, fRegisterRequestor;
|
||||||
thread_id fDeleterThread;
|
thread_id fDeleterThread;
|
||||||
net_timer_id fPulseTimer;
|
net_timer_id fPulseTimer;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user