void GarminFilebasedDevice::userAnswered(const int answer) {
    if (answer == 1) {
        if (Log::enabledDbg()) Log::dbg("User wants file overwritten");
        lockVariables();
        this->overwriteFile = 1;
        unlockVariables();
    } else {
        if (Log::enabledDbg()) Log::dbg("User wants file to be untouched");
        lockVariables();
        this->overwriteFile = 0;
        unlockVariables();
    }
    lockVariables();
    this->threadState = 1; /* set back to working */
    unlockVariables();

    signalThread();
}
Пример #2
0
void onTick()
{
	lockSched();
	
	int doResched = 0;
	while (1)
	{
		if (timedEvents == NULL) break;
		if (getNanotime() <= timedEvents->nanotime) break;
		
		TimedEvent *ev = timedEvents;
		Thread *thread = ev->thread;
		timedEvents = ev->next;
		if (timedEvents != NULL) timedEvents->prev = NULL;
		ev->prev = ev->next = NULL;
		doResched = doResched || signalThread(thread);
	};
	
	unlockSched();
	if (doResched) kyield();
};
Пример #3
0
void ipreasmPass(int family, char *srcaddr, char *dstaddr, int proto, uint32_t id, uint32_t fragOff, char *data, size_t fragSize, int moreFrags)
{
	spinlockAcquire(&reasmLock);
	
	int found = 0;
	
	IPFragmentList *list;
	for (list=firstFragList; list!=NULL; list=list->next)
	{
		if (isMatchingFragmentList(list, family, srcaddr, dstaddr, id))
		{
			if (list->proto != proto)
			{
				// ignore this packet because it's faulty
				kprintf_debug("OVERLAP\n");
				spinlockRelease(&reasmLock);
				return;
			};
			
			// see if this fragment is supposed to come before any that have so far arrived
			if (list->fragList->fragOffset > fragOff)
			{
				if (fragOff+fragSize > list->fragList->fragOffset)
				{
					// overlaps, reject
					kprintf_debug("OVERLAP\n");
					spinlockRelease(&reasmLock);
					return;
				};
				
				IPFragment *frag = NEW_EX(IPFragment, fragSize);
				frag->lastFragment = !moreFrags;
				frag->fragOffset = fragOff;
				frag->fragSize = fragSize;
				frag->prev = NULL;
				list->fragList->prev = frag;
				frag->next = list->fragList;
				memcpy(frag->data, data, fragSize);
				list->fragList = frag;
			}
			else
			{
				//kprintf_debug("here though\n");
				// find where to place this fragment
				IPFragment *scan = list->fragList;
				while (scan != NULL)
				{
					if (scan->fragOffset == fragOff)
					{
						// duplicate; reject
						kprintf_debug("OVERLAP\n");
						spinlockRelease(&reasmLock);
						return;
					};
				
					int doit = 0;
					if (scan->next == NULL)
					{
						if (fragOff > scan->fragOffset)
						{
							if (scan->fragOffset+scan->fragSize > fragOff)
							{
								// overlaps
								kprintf_debug("OVERLAP\n");
								spinlockRelease(&reasmLock);
								return;
							};
						
							doit = 1;
						};
					}
					else
					{
						if ((scan->fragOffset < fragOff) && (scan->next->fragOffset > fragOff))
						{
							// reject this packet if it is overlapping
							if (scan->fragOffset+scan->fragSize > fragOff)
							{
								// overlaps previous fragment
								kprintf_debug("OVERLAP\n");
								spinlockRelease(&reasmLock);
								return;
							};
						
							if (fragOff+fragSize > scan->next->fragOffset)
							{
								// overlaps next fragment
								kprintf_debug("OVERLAP\n");
								spinlockRelease(&reasmLock);
								return;
							};
						
							doit = 1;
						};
					};
				
					if (doit)
					{
						// OK, we can finally place the fragment
						IPFragment *frag = NEW_EX(IPFragment, fragSize);
						frag->lastFragment = !moreFrags;
						frag->fragOffset = fragOff;
						frag->fragSize = fragSize;
						frag->prev = scan;
						frag->next = scan->next;
						if (scan->next != NULL) scan->next->prev = frag;
						scan->next = frag;
						memcpy(frag->data, data, fragSize);
						break;
					}
					else
					{
						scan = scan->next;
					};
				};
			};
			
			found = 1;
		};
	};
	
	if (!found)
	{
		// create a new fragment list
		IPFragment *frag = NEW_EX(IPFragment, fragSize);
		frag->lastFragment = !moreFrags;
		frag->fragOffset = fragOff;
		frag->fragSize = fragSize;
		frag->prev = frag->next = NULL;
		memcpy(frag->data, data, fragSize);
		
		IPFragmentList *list = NEW(IPFragmentList);
		list->family = family;
		list->deadlineTicks = getTicks() + 60000;		// deadline after 60 seconds
		memcpy(list->srcaddr, srcaddr, 16);
		memcpy(list->dstaddr, dstaddr, 16);
		list->id = id;
		list->proto = proto;
		list->fragList = frag;
		
		if (firstFragList == NULL)
		{
			firstFragList = lastFragList = list;
			list->prev = list->next = NULL;
		}
		else
		{
			lastFragList->next = list;
			list->next = NULL;
			list->prev = lastFragList;
			lastFragList = list;
		};
	};
	
	signalThread(reasmHandle);
	spinlockRelease(&reasmLock);
};