示例#1
0
文件: fdset.c 项目: reddragon/cse533
int fdset_poll2(fdset *fds) {
    int r, i;
    while (1) {
        FD_ZERO(&fds->rfds);
        FD_ZERO(&fds->exfds);
        FD_ZERO(&fds->wfds);
        fds->max_fd = -1;

        if (vector_empty(&fds->rev) && vector_empty(&fds->exev)) {
            // We have nothing left to select(2) on.
            return 0;
        }

        fdset_populate(fds, &fds->rfds, &fds->rev);
        fdset_populate(fds, &fds->exfds, &fds->exev);

        r = select(fds->max_fd+1, &fds->rfds, 0, &fds->exfds, &fds->timeout);
        if (r < 0) {
            if (errno != EINTR) {
                perror("select");
                return r;
            }
            continue;
        }
        if (r == 0) {
            // Timeout case
            fds->timeout_cb(NULL);
            continue;
        }
        for (i = 0; i < vector_size(&fds->rev); ++i) {
            select_event_t *pse = (select_event_t*)vector_at(&fds->rev, i);
            if (FD_ISSET(pse->fd, &fds->rfds)) {
                VERBOSE("FD %d is read ready\n", pse->fd);
                pse->callback(pse->opaque);
            }
        }
        for (i = 0; i < vector_size(&fds->exev); ++i) {
            int rev_pos;
            select_event_t se;
            se = *(select_event_t*)vector_at(&fds->exev, i);
            if (FD_ISSET(se.fd, &fds->exfds)) {
                INFO("FD %d is in ERROR\n", se.fd);
                // Also remove this fd from the list of ex/read events
                // to monitor.
                vector_erase(&fds->exev, i);
                --i;
                // Remove from read events list as well.
                rev_pos = algorithm_find(&fds->rev, &se.fd, find_by_fd);
                if (rev_pos != -1) {
                    vector_erase(&fds->rev, rev_pos);
                }
                se.callback(se.opaque);

            } // if ()

        } // for ()

    } // while (1)

} // fdset_poll2()
示例#2
0
文件: sat_api.c 项目: wsw1206/CS264A
//applies unit resolution to the cnf of sat state
//returns 1 if unit resolution succeeds, 0 if it finds a contradiction
BOOLEAN sat_unit_resolution(SatState* sat_state) {
	BOOLEAN more = 1;
	while (more) {
		more = 0;
		for (c2dSize i = vector_size(&sat_state->q); i >= 1; i--) {
			Clause* clause = vector_get(&sat_state->q, i - 1);
			clause->subsumed = sat_check_subsumed_clause(clause);
			if (sat_subsumed_clause(clause)) {
				vector_erase(&sat_state->q, i - 1);
				continue;
			}
			BOOLEAN flag = 0;
			c2dSize pos;
			for (c2dSize j = 0; j < sat_clause_size(clause); j++) {
				Lit* lit = vector_get(&clause->lits, j);
				if (!sat_implied_literal(sat_opp_literal(lit))) {
					flag++;
					pos = j;
					if (flag == 2)
						break;
				}
			}
			if (flag == 0) {
				sat_state->ac = malloc(sizeof(Clause));
				vector_init(&sat_state->ac->lits);
				sat_state->ac->subsumed = 0;
				sat_state->ac->mark = 0;
				if (vector_size(&sat_state->ds) > 0) {
					for (c2dSize j = 0; j < sat_var_count(sat_state); j++) {
						Var* var = vector_get(&sat_state->vars, j);
						var->u = var->level <= 1;
					}
					sat_get_assert_clause(sat_state, sat_state->ac, clause->index - 1, 0,
							vector_size(&sat_state->s) - 1);
				}
				return 0;
			}
			if (flag == 1) {
				Lit* lit = vector_get(&clause->lits, pos);
				lit->implied = 1;
				lit->locate = clause->index - 1;
				lit->var->level = vector_size(&sat_state->ds) + 1;
				vector_push(&sat_state->il, lit);
				vector_push(&sat_state->s, lit);
				clause->subsumed = 1;
				vector_erase(&sat_state->q, i - 1);
				more = 1;
			}
		}
	}
	return 1;
}
示例#3
0
static void * helper_thread(void * ignore)
{
	while (1)
	{
		queue_entry_t * qe;
		char b = 1;

		mutex_lock(&helper.mutex);
		if (!vector_size(helper.queue))
		{
			helper.alive = 0;
			mutex_unlock(&helper.mutex);
			Dprintf("%s() EXIT\n", __FUNCTION__);
			return NULL;
		}
		qe = vector_elt(helper.queue, 0);
		// NOTE: vector_erase() is O(|helper.queue|). If this queue
		// gets to be big we can change how this removal works.
		vector_erase(helper.queue, 0);
		mutex_unlock(&helper.mutex);

		if (qe->action == QEMOUNT)
			helper_thread_mount(qe->mount);
		else if (qe->action == QEUNMOUNT)
		{
			helper_thread_unmount(qe->mount);
			if (write(unmount_pipe[1], &b, 1) != 1)
				perror("helper_thread: write");
		}
		memset(qe, 0, sizeof(*qe));
		free(qe);
	}
	assert(0); // not reachable
	return NULL; // placate compiler
}
示例#4
0
void* client_thread(void* x)
#endif
{
	puts("client_thread started");
	unsigned int i;
	while(1)
	{
		mutex_lock(&client_vector_mutex);
		for(i = 0; i < clients.size; i++)
		{
			struct client* client = VECTOR_GET_AS(clients, i, struct client);
			if(client_update(client) < 0)
			{
				puts("client disconnected!");
				vector_erase(clients, i);
				i--;
				continue;
			}
			else
			{
				
			}
		}
		mutex_unlock(&client_vector_mutex);
	}
	#ifndef _WIN32
	return NULL;
	#endif
}
示例#5
0
// ----------------------------------------------------------------------------
void
vertex_buffer_erase( vertex_buffer_t * self,
                     const size_t index )
{
    ivec4 * item;
    size_t vstart, vcount, istart, icount, i;
    
    assert( self );
    assert( index < vector_size( self->items ) );

    item = (ivec4 *) vector_get( self->items, index );
    vstart = item->vstart;
    vcount = item->vcount;
    istart = item->istart;
    icount = item->icount;

    // Update items
    for( i=0; i<vector_size(self->items); ++i )
    {
        ivec4 * item = (ivec4 *) vector_get( self->items, i );
        if( item->vstart > vstart)
        {
            item->vstart -= vcount;
            item->istart -= icount;
        }
    }

    self->state = FROZEN;
    vertex_buffer_erase_indices( self, istart, istart+icount );
    vertex_buffer_erase_vertices( self, vstart, vstart+vcount );
    vector_erase( self->items, index );
    self->state = DIRTY;
}
示例#6
0
/* XXX Not using */
si_t application_quit()
{
    si_t i, n;
    struct object * addr;

    /* 有多少个窗口 */
    n = vector_size(&(global_application.window_vector));

    /* 依次删除窗口 */
    for(i = n - 1; i >= 0; -- i)
    {
        addr = vector_at(&global_application.window_vector, i);

        /*
           这里没有逐个注销窗口类对象或者它的派生类对象。
           因为窗口管理程序收到用户应用程序的退出请求后,
           会释放关于这个用户应用程序的所有资源。
           */

        /* 释放这棵树 */
        object_tree_free(addr->parent);

        /* 从窗口向量中删除这个节点 */
        vector_erase(&global_application.window_vector, i);
    }

    vector_exit(&global_application.window_vector);

	event_listener_exit(&global_application.app_event_listener);
    uds_exit(&global_application.uds);

	free(global_application.name);

    return 0;
}
示例#7
0
文件: fdset.c 项目: reddragon/cse533
void fdset_remove(fdset *fds, vector *v, int fd) {
    int i;
    for (i = 0; i < vector_size(v); ++i) {
        select_event_t *pse = (select_event_t*)vector_at(v, i);
        if (pse->fd == fd) {
            vector_erase(v, i);
            --i;
        }
    }
}
示例#8
0
int iterator_erase(Vector* vector, Iterator* iterator) {
    size_t index = iterator_index(vector, iterator);

    if (vector_erase(vector, index) == VECTOR_ERROR) {
        return VECTOR_ERROR;
    }

    *iterator = vector_iterator(vector, index);

    return VECTOR_SUCCESS;
}
示例#9
0
si_t application_exit()
{
    struct object * addr;
    si_t i, n;

    /**
     * release focus list
     **/
    list_exit(&(global_application.focus_list));

    /* 有多少个窗口 */
    n = vector_size(&(global_application.window_vector));

    /* 依次删除窗口 */
    for(i = n - 1; i >= 0; -- i)
    {
        addr = vector_at(&(global_application.window_vector), i);

        /*
            这里没有逐个注销窗口类对象或者它的派生类对象。
            因为窗口管理程序收到用户应用程序的退出请求后,
            会释放关于这个用户应用程序的所有资源。
        */

        /* 释放这棵树 */
        object_tree_free(addr->parent);

        /* 从窗口向量中删除这个节点 */
        vector_erase(&(global_application.window_vector), i);
    }

    vector_exit(&(global_application.window_vector));

	if(0 != cancel_application())
	{
		EGUI_PRINT_ERROR("failed to cancle application");
	}

	event_listener_exit(&global_application.app_event_listener);
	queue_exit(&global_application.message_queue);
    uds_exit(&global_application.uds);

	free(global_application.name);
    free(global_application.icon_root_path);

    term_restore();

    return 0;
}
示例#10
0
/* ------------------------------------------------------------------------- */
void
texture_atlas_merge( TextureAtlas *self )
{
    Node *node, *next;
    size_t i;

	for( i=0; i< self->nodes->size-1; ++i )
    {
        node = (Node *) (vector_get( self->nodes, i ));
        next = (Node *) (vector_get( self->nodes, i+1 ));

		if( node->y == next->y )
		{
			node->width += next->width;
            vector_erase( self->nodes, i+1 );
			--i;
		}
    }
}
示例#11
0
// ---------------------------------------------------- texture_atlas_merge ---
void
texture_atlas_merge( texture_atlas_t * self )
{
    ivec3 *node, *next;
    size_t i;

    assert( self );

	for( i=0; i< self->nodes->size-1; ++i )
    {
        node = (ivec3 *) (vector_get( self->nodes, i ));
        next = (ivec3 *) (vector_get( self->nodes, i+1 ));
		if( node->y == next->y )
		{
			node->z += next->z;
            vector_erase( self->nodes, i+1 );
			--i;
		}
    }
}
示例#12
0
/*
   如果 window 有左子节点
   那么这个左子节点并不是 window 子对象
   所以在析构以 window 为根的树之前一定要要将 window->lchild 成员清空

   如果 window 在对象树中
   那么完成删除工作后一定要更新 root->parent 的 lchild 成员和 rchild 成员
   这是为了保证遍历的正确
   */
si_t application_del_window(struct window * window)
{
	si_t is_top_window = 0;

	/* 删除主窗口 */
	/* 退出程序 */
	if(window == global_application.main_window)
	{
		application_exit();
		return 0;
	}

	if(window->parent->parent == OBJECT_POINTER(window))
	{
		is_top_window = 1;
	}

	cancel_window(window->descriptor);

	object_delete(OBJECT_POINTER(window), __widget_destructor);
	if(is_top_window)
	{
		si_t i = 0, n = 0;
		/* 有多少个窗口 */
		n = vector_size(&(global_application.window_vector));

		/* 找到这个窗口在向量中的索引 */
		for(i = 0; i < n; ++ i)
		{
			struct object* tree = vector_at(&(global_application.window_vector), i);
			if(tree->parent == OBJECT_POINTER(window))
			{
				/* 从窗口向量中删除这个节点 */
				vector_erase(&(global_application.window_vector), i);
				break;
			}
		}
	}

	return 0;
}
示例#13
0
// ----------------------------------------------- font_manager_delete_font ---
void
font_manager_delete_font( font_manager_t * self,
                          texture_font_t * font)
{
    size_t i;
    texture_font_t *other;

    assert( self );
    assert( font );
    
    for( i=0; i<self->fonts->size;++i )
    {
        other = (texture_font_t *) vector_get( self->fonts, i );
        if ( (strcmp(font->filename, other->filename) == 0) && ( font->size == other->size) )
        {
            vector_erase( self->fonts, i);
            break;
        }
    }
    texture_font_delete( font );
}
示例#14
0
int file_hiding_cfs_unhide(CFS_t * cfs, inode_t ino)
{
	Dprintf("%s(%u)\n", __FUNCTION__, ino);
	file_hiding_state_t * state = (file_hiding_state_t *) cfs;
	hide_entry_t * me;

	/* make sure this is really a table classifier */
	if (OBJMAGIC(cfs) != FILE_HIDING_MAGIC)
		return -EINVAL;

	int idx = hide_lookup(state->hide_table, ino);
	if (idx < 0)
		return idx;
	me = vector_elt(state->hide_table, idx);

	fprintf(stderr,"file_hiding_cfs: unhiding %u\n", ino);
	vector_erase(state->hide_table, idx);
	hide_entry_destroy(me);

	return 0;
}
示例#15
0
文件: watchlist.c 项目: glankk/gz
static int remove_member(struct item_data *data, int position)
{
  if (position < 0 || position >= data->members.size)
    return 0;
  menu_navigate_top(data->imenu, MENU_NAVIGATE_DOWN);
  --data->add_button->y;
#ifndef WIIVC
  --data->import_button->y;
#endif
  for (int i = position + 1; i < data->members.size; ++i) {
    struct member_data *member_data = get_member(data, i);
    --member_data->index;
    --member_data->member->y;
  }
  struct member_data *member_data = get_member(data, position);
  struct menu_item *watch = menu_userwatch_watch(member_data->userwatch);
  menu_item_remove(watch);
  member_data->anchor_button->data = NULL;
  menu_item_remove(member_data->member);
  vector_erase(&data->members, position, 1);
  free(member_data);
  return 1;
}
示例#16
0
文件: vector.c 项目: redien/limbus
void vector_unittest()
{
	Vector vector;
	int integer, i;
	int* iterator;
	
	/* An empty vector. */
	vector_construct( &vector, sizeof( int ) );
	EXPECT_EQUAL( vector_next( &vector, NULL ), NULL );
	EXPECT_EQUAL( vector_at( &vector, 0 ), NULL );
	EXPECT_EQUAL( vector_at( &vector, 1 ), NULL );
	EXPECT_EQUAL( vector_at( &vector, 2 ), NULL );
	EXPECT_EQUAL( vector_at( &vector, 3 ), NULL );
	EXPECT_EQUAL( vector_at( &vector, 14 ), NULL );
	EXPECT_EQUAL( vector_at( &vector, 2345 ), NULL );
	vector_destruct( &vector );


	/* Adding elements */
	
	vector_construct( &vector, sizeof( int ) );

	for (i = 0; i < 9; i++)
	{
		integer = 9 - i;
		EXPECT_EQUAL( vector_push_back( &vector, &integer ), i );
		EXPECT_EQUAL( vector_size( &vector ), (i + 1) );
	}

	EXPECT_NOT_EQUAL( vector_at( &vector, 0 ), NULL );
	EXPECT_EQUAL( *((int*)vector_at( &vector, 0 )), 9 );
	EXPECT_NOT_EQUAL( vector_at( &vector, 1 ), NULL );
	EXPECT_EQUAL( *((int*)vector_at( &vector, 1 )), 8 );
	EXPECT_NOT_EQUAL( vector_at( &vector, 2 ), NULL );
	EXPECT_EQUAL( *((int*)vector_at( &vector, 2 )), 7 );
	EXPECT_NOT_EQUAL( vector_at( &vector, 3 ), NULL );
	EXPECT_EQUAL( *((int*)vector_at( &vector, 3 )), 6 );
	EXPECT_EQUAL( vector_at( &vector, 14 ), NULL );
	EXPECT_EQUAL( vector_at( &vector, 2345 ), NULL );

	i = 9;
	iterator = NULL;
	while ((iterator = (int*)vector_next( &vector, iterator )))
	{
		EXPECT_EQUAL( i, *iterator );
		i--;
	}

	/* Erasing elements */
	for (i = 9 - 1; i >= 4; i--)
	{
		vector_erase( &vector, vector_next( &vector, NULL ) );
		EXPECT_EQUAL( vector_size( &vector ), i );
	}

	i = 4;
	iterator = NULL;
	while ((iterator = (int*)vector_next( &vector, iterator )))
	{
		EXPECT_EQUAL( i, *iterator );
		i--;
	}

	vector_destruct( &vector );	

	/* Erase from the middle of a vector */
	vector_construct( &vector, sizeof( int ) );
	integer = 0x12345678; vector_push_back( &vector, &integer );
	integer = 0x21436587; vector_push_back( &vector, &integer );
	integer = 0x87654321; vector_push_back( &vector, &integer );
	vector_erase( &vector, vector_at( &vector, 1 ) );
	EXPECT_EQUAL( 0x12345678, *(int*)vector_at( &vector, 0 ) );
	EXPECT_EQUAL( 0x87654321, *(int*)vector_at( &vector, 1 ) );
	EXPECT_EQUAL( NULL, vector_at( &vector, 2 ) );
	vector_destruct( &vector );

	/* Clearing a vector */
	vector_construct( &vector, sizeof( int ) );
	EXPECT_EQUAL( NULL, vector_next( &vector, NULL ) );
	vector_clear( &vector );
	EXPECT_EQUAL( NULL, vector_next( &vector, NULL ) );
	integer = 3; vector_push_back( &vector, &integer );
	vector_clear( &vector );
	EXPECT_EQUAL( NULL, vector_next( &vector, NULL ) );
	vector_clear( &vector );
	EXPECT_EQUAL( NULL, vector_next( &vector, NULL ) );
	vector_destruct( &vector );
}
示例#17
0
文件: vector.c 项目: ab25cq/xyzsh
void* vector_pop_front(sObject* self)
{
    return vector_erase(self, 0);
}
示例#18
0
		// Behaviours for LAB2
		void delete_event(int z_index) {	// z-index is the variable used for vector index. 
			vector_erase(z_index);
		}
示例#19
0
// ----------------------------------------------- texture_atlas_get_region ---
ivec4
texture_atlas_get_region( texture_atlas_t * self,
                          const size_t width,
                          const size_t height )
{
	int y, best_index;
    size_t best_height, best_width;
    ivec3 *node, *prev;
    ivec4 region = {{0,0,width,height}};
    size_t i;

    assert( self );

    best_height = UINT_MAX;
    best_index  = -1;
    best_width = UINT_MAX;
	for( i=0; i<self->nodes->size; ++i )
	{
        y = texture_atlas_fit( self, i, width, height );
		if( y >= 0 )
		{
            node = (ivec3 *) vector_get( self->nodes, i );
			if( ( (y + height) < best_height ) ||
                ( ((y + height) == best_height) && (node->z > 0 && (size_t)node->z < best_width)) )
			{
				best_height = y + height;
				best_index = i;
				best_width = node->z;
				region.x = node->x;
				region.y = y;
			}
        }
    }

	if( best_index == -1 )
    {
        region.x = -1;
        region.y = -1;
        region.width = 0;
        region.height = 0;
        return region;
    }

    node = (ivec3 *) malloc( sizeof(ivec3) );
    if( node == NULL)
    {
        fprintf( stderr,
                 "line %d: No more memory for allocating data\n", __LINE__ );
        exit( EXIT_FAILURE );
    }
    node->x = region.x;
    node->y = region.y + height;
    node->z = width;
    vector_insert( self->nodes, best_index, node );
    free( node );

    for(i = best_index+1; i < self->nodes->size; ++i)
    {
        node = (ivec3 *) vector_get( self->nodes, i );
        prev = (ivec3 *) vector_get( self->nodes, i-1 );

        if (node->x < (prev->x + prev->z) )
        {
            int shrink = prev->x + prev->z - node->x;
            node->x += shrink;
            node->z -= shrink;
            if (node->z <= 0)
            {
                vector_erase( self->nodes, i );
                --i;
            }
            else
            {
                break;
            }
        }
        else
        {
            break;
        }
    }
    texture_atlas_merge( self );
    self->used += width * height;
    return region;
}
示例#20
0
文件: vector.c 项目: ab25cq/xyzsh
void* vector_pop_back(sObject* self)
{
    return vector_erase(self, SVECTOR(self).mCount-1);
}
示例#21
0
int vector_pop_front(Vector* vector) {
    return vector_erase(vector, 0);
}
示例#22
0
/* ------------------------------------------------------------------------- */
Region
texture_atlas_get_region( TextureAtlas *self,
                          size_t width, size_t height )
{
    assert( self );
/*
    assert( width );
    assert( height );
*/
	{
	int y, best_height, best_width, best_index;
    Node *node, *prev;
    Region region = {0,0,width,height};
    size_t i;

    best_height = INT_MAX;
    best_index  = -1;
    best_width = INT_MAX;
	for( i=0; i<self->nodes->size; ++i )
	{
        y = texture_atlas_fit( self, i, width, height );
		if( y >= 0 )
		{
            node = (Node *) vector_get( self->nodes, i );
			if( ( y + (int)height < best_height ) ||
                ( y + height == best_height && node->width < best_width) )
			{
				best_height = y + height;
				best_index = i;
				best_width = node->width;
				region.x = node->x;
				region.y = y;
			}
        }
    }
   
	if( best_index == -1 )
    {
        region.x = -1;
        region.y = -1;
        region.width = 0;
        region.height = 0;
        return region;
    }

    node = (Node *) malloc( sizeof(Node) );
    node->x     = region.x;
    node->y     = region.y + height;
    node->width = width;
    vector_insert( self->nodes, best_index, node );
    free( node );

    for(i = best_index+1; i < self->nodes->size; ++i)
    {
        node = (Node *) vector_get( self->nodes, i );
        prev = (Node *) vector_get( self->nodes, i-1 );

        if (node->x < (prev->x + prev->width) )
        {
            int shrink = prev->x + prev->width - node->x;
            node->x     += shrink;
            node->width -= shrink;
            if (node->width <= 0)
            {
                vector_erase( self->nodes, i );
                --i;
            }
            else
            {
                break;
            }
        }
        else
        {
            break;
        }
    }
    texture_atlas_merge( self );
    self->used += width * height;
    return region;
	}
}
示例#23
0
int test_run (void)
   {
   SCL_vector_t     vector;
   SCL_iterator_t   iterator;

   void*   data;
   int     stat;
   int     i;

   printf ("Create vector: ");
   fflush (stdout);
   vector = vector_new();
   printf ("(%p = vector_new()) != NULL ... ", vector);
   fflush (stdout);
   printf ("%s\n", ((vector!=NULL) ? "PASS" : "FAIL"));

   printf (
          "(%ld = vector_size (vector)) == 0 ..................... %s\n",
          vector_size(vector),
          ((vector_size(vector)==0) ? "PASS" : "FAIL")
          );
   printf (
          "(%ld = vector_count (vector)) == 0 .................... %s\n",
          vector_count(vector),
          ((vector_count(vector)==0) ? "PASS" : "FAIL")
          );

   printf ("Push data in back vector.\n");
   for (i=0 ; i<VECTOR_SIZE ; i++)
      {
      stat = vector_push_back (vector, (void*)g_data1[i]);
      printf (
             "[%d,%s] = vector_push_back (vector, %08X) .... %s\n",
             stat, scl_statstr(stat), g_data1[i],
             ((stat==SCL_OK) ? "PASS" : "FAIL")
             );
      }

   printf ("Iterate back through vector, changing data.\n");
   for (i=7, iterator=vector_end(vector) ; iterator!=NULL ; iterator=vector_prev(iterator))
      {
      data = vector_data_get (iterator);
      printf (
             "%08X = vector_data_get (iterator=>%p) .... %s\n",
             data, iterator,
             (((unsigned long)data==g_data1[--i]) ? "PASS" : "FAIL")
             );
      vector_data_set (iterator, iterator);
      printf ("%08X -> %08X\n", data, vector_data_get(iterator));
      }

   printf (
          "(%ld = vector_size (vector)) == 16 ................... %s\n",
          vector_size(vector),
          ((vector_size(vector)==16) ? "PASS" : "FAIL")
          );
   printf (
          "(%ld = vector_count (vector)) == 7 .................... %s\n",
          vector_count(vector),
          ((vector_count(vector)==7) ? "PASS" : "FAIL")
          );

   printf ("Foreach on vector.\n");
   for (i=0 ; i<VECTOR_SIZE ; i++) g_flag[i] = 0;
   g_vector = vector;
   vector_foreach (vector, cbfn, NULL);

   printf ("Erase vector.\n");
   vector_erase (vector);

   printf (
          "(%ld = vector_size (vector)) == 0 ..................... %s\n",
          vector_size(vector),
          ((vector_size(vector)==0) ? "PASS" : "FAIL")
          );
   printf (
          "(%ld = vector_count (vector)) == 0 .................... %s\n",
          vector_count(vector),
          ((vector_count(vector)==0) ? "PASS" : "FAIL")
          );

   printf ("Delete vector.\n");
   vector_del (vector);

   printf ("\n");

   return 0;
   }
void reactor_http_response_clear(reactor_http_response *response)
{
  vector_erase(&response->fields, 0, vector_size(&response->fields));
}
示例#25
0
int fuse_serve_mount_step_remove(void)
{
	char b = 1;
	queue_entry_t * qe;
	Dprintf("%s()\n", __FUNCTION__);

	if (unmount_pipe[0] == -1)
		return -1;

	// Read the byte from helper to zero the read fd's level
	if (read(unmount_pipe[0], &b, 1) != 1)
	{
		perror("fuse_serve_mount_step_shutdown(): read");
		if (write(unmount_pipe[1], &b, 1) != 1)
			assert(0);
		return -1;
	}

	if (vector_size(remove_queue) > 0)
	{
		qe = vector_elt(remove_queue, 0);
		// NOTE: vector_erase() is O(|remove_queue|). If this queue
		// gets to be big we can change how this removal works.
		vector_erase(remove_queue, 0);
	}
	else
	{
		assert(shutdown_has_started());

		if (nmounts == 1)
		{
			Dprintf("%s(): unmounting root\n", __FUNCTION__);
			return unmount_root();
		}

		if (!(qe = calloc(1, sizeof(*qe))))
		{
			(void) write(unmount_pipe[1], &b, 1); // unzero the read fd's level
			return -ENOMEM;
		}
		qsort(mounts, nmounts, sizeof(*mounts), mount_path_compar);
		qe->mount = mounts[nmounts - 1];
		qe->action = QEUNMOUNT;
	}

	mounts_remove(qe->mount);

	fuse_session_destroy(qe->mount->session);
	qe->mount->session = NULL;

	(void) close(qe->mount->channel_fd);

	fuse_opt_free_args(&qe->mount->args);

	if (enqueue_helper_request(qe) < 0)
	{
		fprintf(stderr, "%s(): enqueue_helper_request failed; unmount \"%s\" is unrecoverable\n", __FUNCTION__, qe->mount->fstitch_path);
		free(qe);
		return -1;
	}
	if (ensure_helper_is_running() < 0)
	{
		fprintf(stderr, "%s(): ensure_helper_is_running failed; unmount \"%s\" is unrecoverable\n", __FUNCTION__, qe->mount->fstitch_path);
		return -1;
	}

	return 0;
}