Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
Copyright (c) 1996 Microsoft Corporation All rights reserved
Module Name:
jobid.c
Abstract:
Handles job id bitmap.
Author:
Albert Ting (AlbertT) 24-Oct-96
Environment:
User Mode -Win32
Revision History:
Ported from spooler.c code.
--*/
#include "precomp.h"
#pragma hdrstop
#include "jobid.h"
BOOL ReallocJobIdMap( HANDLE hJobIdMap, DWORD dwNewMinSize )
/*++
Routine Description:
Reallocates the job id bitmap to a new minimum size.
Arguments:
hJobId - Handle to job ID bitmap.
dwNewMinSize - Specifies the minimum size of the job id bitmap. Note that the allocation size may be larger. Also, if 0x10 is requested, only ids 0x0-0xf are guaranteed to be valid (0x10 is the 11th id, and therefore not valid).
Return Value:
TRUE - Success False - Failed.
--*/
{ PJOB_ID_MAP pJobIdMap = (PJOB_ID_MAP)hJobIdMap; PDWORD pMap;
if( dwNewMinSize & 7 ){ dwNewMinSize&=~7; dwNewMinSize+=8; }
pMap = ReallocSplMem( pJobIdMap->pMap, pJobIdMap->dwMaxJobId/8, dwNewMinSize/8 );
if( !pMap ){
DBGMSG( DBG_WARN, ( "ReallocJobIdMap failed ReallocSplMem dwNewMinSize %d Error %d\n", dwNewMinSize, GetLastError() )); } else {
pJobIdMap->pMap = pMap; pJobIdMap->dwMaxJobId = dwNewMinSize; }
return pMap != NULL; }
DWORD GetNextId( HANDLE hJobIdMap )
/*++
Routine Description:
Retrieves a free job id, although not necessarily the next free bit.
Arguments:
hJobId - Handle to job ID bitmap.
Return Value:
DWORD - Next job.
--*/
{ PJOB_ID_MAP pJobIdMap = (PJOB_ID_MAP)hJobIdMap; DWORD id;
do {
//
// Scan forward from current job.
//
for( id = pJobIdMap->dwCurrentJobId + 1; id < pJobIdMap->dwMaxJobId; ++id ){
if( !bBitOn( hJobIdMap, id )){ goto FoundJobId; } }
//
// Scan from beginning to current job.
//
for( id = 1; id < pJobIdMap->dwCurrentJobId; ++id ){
if( !bBitOn( hJobIdMap, id )){ goto FoundJobId; } } } while( ReallocJobIdMap( hJobIdMap, pJobIdMap->dwMaxJobId + 128 ));
//
// No job ids; fail.
//
return 0;
FoundJobId:
vMarkOn( hJobIdMap, id ); pJobIdMap->dwCurrentJobId = id;
return id; }
/********************************************************************
Create and delete functions.
********************************************************************/
HANDLE hCreateJobIdMap( DWORD dwMinSize ) { PJOB_ID_MAP pJobIdMap;
pJobIdMap = AllocSplMem( sizeof( JOB_ID_MAP ));
if( !pJobIdMap ){ goto Fail; }
pJobIdMap->pMap = AllocSplMem( dwMinSize/8 ); if( !pJobIdMap->pMap ){ goto Fail; }
pJobIdMap->dwMaxJobId = dwMinSize; pJobIdMap->dwCurrentJobId = 1;
return (HANDLE)pJobIdMap;
Fail:
if( pJobIdMap ){ FreeSplMem( pJobIdMap ); } return NULL; }
VOID vDeleteJobIdMap( HANDLE hJobIdMap ) { PJOB_ID_MAP pJobIdMap = (PJOB_ID_MAP)hJobIdMap;
if( pJobIdMap ){
if( pJobIdMap->pMap ){ FreeSplMem( pJobIdMap->pMap ); }
FreeSplMem( pJobIdMap ); } }
|